Build the root fs.
[openwrt/staging/dedeckeh.git] / target / linux / openmoko / patches-2.6.24 / 100-moko.patch
1 Index: linux-2.6.24.7/arch/arm/configs/glofiish_defconfig
2 ===================================================================
3 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
4 +++ linux-2.6.24.7/arch/arm/configs/glofiish_defconfig 2008-12-11 22:46:48.000000000 +0100
5 @@ -0,0 +1,1728 @@
6 +#
7 +# Automatically generated make config: don't edit
8 +# Linux kernel version: 2.6.24
9 +# Wed Nov 12 00:27:24 2008
10 +#
11 +CONFIG_ARM=y
12 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
13 +CONFIG_GENERIC_GPIO=y
14 +# CONFIG_GENERIC_TIME is not set
15 +# CONFIG_GENERIC_CLOCKEVENTS is not set
16 +CONFIG_MMU=y
17 +CONFIG_NO_IOPORT=y
18 +CONFIG_GENERIC_HARDIRQS=y
19 +CONFIG_STACKTRACE_SUPPORT=y
20 +CONFIG_LOCKDEP_SUPPORT=y
21 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
22 +CONFIG_HARDIRQS_SW_RESEND=y
23 +CONFIG_GENERIC_IRQ_PROBE=y
24 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
25 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
26 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
27 +CONFIG_GENERIC_HWEIGHT=y
28 +CONFIG_GENERIC_CALIBRATE_DELAY=y
29 +CONFIG_ZONE_DMA=y
30 +CONFIG_VECTORS_BASE=0xffff0000
31 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
32 +
33 +#
34 +# General setup
35 +#
36 +CONFIG_EXPERIMENTAL=y
37 +CONFIG_BROKEN_ON_SMP=y
38 +CONFIG_LOCK_KERNEL=y
39 +CONFIG_INIT_ENV_ARG_LIMIT=32
40 +CONFIG_LOCALVERSION=""
41 +# CONFIG_LOCALVERSION_AUTO is not set
42 +CONFIG_SWAP=y
43 +CONFIG_SYSVIPC=y
44 +CONFIG_SYSVIPC_SYSCTL=y
45 +# CONFIG_POSIX_MQUEUE is not set
46 +# CONFIG_BSD_PROCESS_ACCT is not set
47 +# CONFIG_TASKSTATS is not set
48 +# CONFIG_USER_NS is not set
49 +# CONFIG_PID_NS is not set
50 +# CONFIG_AUDIT is not set
51 +# CONFIG_IKCONFIG is not set
52 +CONFIG_LOG_BUF_SHIFT=14
53 +# CONFIG_CGROUPS is not set
54 +# CONFIG_FAIR_GROUP_SCHED is not set
55 +# CONFIG_SYSFS_DEPRECATED is not set
56 +# CONFIG_RELAY is not set
57 +CONFIG_BLK_DEV_INITRD=y
58 +CONFIG_INITRAMFS_SOURCE=""
59 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
60 +CONFIG_SYSCTL=y
61 +# CONFIG_EMBEDDED is not set
62 +CONFIG_UID16=y
63 +CONFIG_SYSCTL_SYSCALL=y
64 +CONFIG_KALLSYMS=y
65 +# CONFIG_KALLSYMS_ALL is not set
66 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
67 +CONFIG_HOTPLUG=y
68 +CONFIG_PRINTK=y
69 +CONFIG_BUG=y
70 +CONFIG_ELF_CORE=y
71 +CONFIG_BASE_FULL=y
72 +CONFIG_FUTEX=y
73 +CONFIG_ANON_INODES=y
74 +CONFIG_EPOLL=y
75 +CONFIG_SIGNALFD=y
76 +CONFIG_EVENTFD=y
77 +CONFIG_SHMEM=y
78 +CONFIG_VM_EVENT_COUNTERS=y
79 +CONFIG_SLAB=y
80 +# CONFIG_SLUB is not set
81 +# CONFIG_SLOB is not set
82 +CONFIG_SLABINFO=y
83 +CONFIG_RT_MUTEXES=y
84 +# CONFIG_TINY_SHMEM is not set
85 +CONFIG_BASE_SMALL=0
86 +CONFIG_MODULES=y
87 +CONFIG_MODULE_UNLOAD=y
88 +CONFIG_MODULE_FORCE_UNLOAD=y
89 +# CONFIG_MODVERSIONS is not set
90 +# CONFIG_MODULE_SRCVERSION_ALL is not set
91 +CONFIG_KMOD=y
92 +CONFIG_BLOCK=y
93 +# CONFIG_LBD is not set
94 +# CONFIG_BLK_DEV_IO_TRACE is not set
95 +# CONFIG_LSF is not set
96 +# CONFIG_BLK_DEV_BSG is not set
97 +
98 +#
99 +# IO Schedulers
100 +#
101 +CONFIG_IOSCHED_NOOP=y
102 +CONFIG_IOSCHED_AS=m
103 +CONFIG_IOSCHED_DEADLINE=y
104 +CONFIG_IOSCHED_CFQ=m
105 +# CONFIG_DEFAULT_AS is not set
106 +CONFIG_DEFAULT_DEADLINE=y
107 +# CONFIG_DEFAULT_CFQ is not set
108 +# CONFIG_DEFAULT_NOOP is not set
109 +CONFIG_DEFAULT_IOSCHED="deadline"
110 +
111 +#
112 +# System Type
113 +#
114 +# CONFIG_ARCH_AAEC2000 is not set
115 +# CONFIG_ARCH_INTEGRATOR is not set
116 +# CONFIG_ARCH_REALVIEW is not set
117 +# CONFIG_ARCH_VERSATILE is not set
118 +# CONFIG_ARCH_AT91 is not set
119 +# CONFIG_ARCH_CLPS7500 is not set
120 +# CONFIG_ARCH_CLPS711X is not set
121 +# CONFIG_ARCH_CO285 is not set
122 +# CONFIG_ARCH_EBSA110 is not set
123 +# CONFIG_ARCH_EP93XX is not set
124 +# CONFIG_ARCH_FOOTBRIDGE is not set
125 +# CONFIG_ARCH_NETX is not set
126 +# CONFIG_ARCH_H720X is not set
127 +# CONFIG_ARCH_IMX is not set
128 +# CONFIG_ARCH_IOP13XX is not set
129 +# CONFIG_ARCH_IOP32X is not set
130 +# CONFIG_ARCH_IOP33X is not set
131 +# CONFIG_ARCH_IXP23XX is not set
132 +# CONFIG_ARCH_IXP2000 is not set
133 +# CONFIG_ARCH_IXP4XX is not set
134 +# CONFIG_ARCH_L7200 is not set
135 +# CONFIG_ARCH_KS8695 is not set
136 +# CONFIG_ARCH_NS9XXX is not set
137 +# CONFIG_ARCH_MXC is not set
138 +# CONFIG_ARCH_PNX4008 is not set
139 +# CONFIG_ARCH_PXA is not set
140 +# CONFIG_ARCH_RPC is not set
141 +# CONFIG_ARCH_SA1100 is not set
142 +CONFIG_ARCH_S3C2410=y
143 +# CONFIG_ARCH_SHARK is not set
144 +# CONFIG_ARCH_LH7A40X is not set
145 +# CONFIG_ARCH_DAVINCI is not set
146 +# CONFIG_ARCH_OMAP is not set
147 +CONFIG_PLAT_S3C24XX=y
148 +CONFIG_CPU_S3C244X=y
149 +CONFIG_S3C2410_DMA=y
150 +# CONFIG_S3C2410_DMA_DEBUG is not set
151 +CONFIG_MACH_SMDK=y
152 +CONFIG_PLAT_S3C=y
153 +CONFIG_CPU_LLSERIAL_S3C2410=y
154 +CONFIG_CPU_LLSERIAL_S3C2440=y
155 +
156 +#
157 +# Boot options
158 +#
159 +# CONFIG_S3C_BOOT_WATCHDOG is not set
160 +# CONFIG_S3C_BOOT_ERROR_RESET is not set
161 +
162 +#
163 +# Power management
164 +#
165 +# CONFIG_S3C2410_PM_CHECK is not set
166 +CONFIG_S3C_LOWLEVEL_UART_PORT=2
167 +
168 +#
169 +# S3C2400 Machines
170 +#
171 +CONFIG_CPU_S3C2410=y
172 +CONFIG_CPU_S3C2410_DMA=y
173 +CONFIG_S3C2410_PM=y
174 +CONFIG_S3C2410_GPIO=y
175 +CONFIG_S3C2410_CLOCK=y
176 +CONFIG_S3C2410_PWM=y
177 +
178 +#
179 +# S3C2410 Machines
180 +#
181 +# CONFIG_ARCH_SMDK2410 is not set
182 +# CONFIG_ARCH_H1940 is not set
183 +# CONFIG_MACH_N30 is not set
184 +# CONFIG_ARCH_BAST is not set
185 +# CONFIG_MACH_OTOM is not set
186 +# CONFIG_MACH_AML_M5900 is not set
187 +# CONFIG_MACH_VR1000 is not set
188 +CONFIG_MACH_QT2410=y
189 +# CONFIG_MACH_NEO1973_GTA01 is not set
190 +
191 +#
192 +# S3C2412 Machines
193 +#
194 +# CONFIG_MACH_SMDK2413 is not set
195 +# CONFIG_MACH_SMDK2412 is not set
196 +# CONFIG_MACH_VSTMS is not set
197 +CONFIG_CPU_S3C2440=y
198 +CONFIG_S3C2440_DMA=y
199 +# CONFIG_S3C2440_C_FIQ is not set
200 +
201 +#
202 +# S3C2440 Machines
203 +#
204 +# CONFIG_MACH_ANUBIS is not set
205 +# CONFIG_MACH_OSIRIS is not set
206 +# CONFIG_MACH_RX3715 is not set
207 +CONFIG_ARCH_S3C2440=y
208 +# CONFIG_MACH_NEXCODER_2440 is not set
209 +CONFIG_SMDK2440_CPU2440=y
210 +# CONFIG_MACH_HXD8 is not set
211 +# CONFIG_MACH_NEO1973_GTA02 is not set
212 +CONFIG_MACH_M800=y
213 +CONFIG_CPU_S3C2442=y
214 +
215 +#
216 +# S3C2442 Machines
217 +#
218 +CONFIG_SMDK2440_CPU2442=y
219 +
220 +#
221 +# S3C2443 Machines
222 +#
223 +# CONFIG_MACH_SMDK2443 is not set
224 +
225 +#
226 +# Processor Type
227 +#
228 +CONFIG_CPU_32=y
229 +CONFIG_CPU_ARM920T=y
230 +CONFIG_CPU_32v4T=y
231 +CONFIG_CPU_ABRT_EV4T=y
232 +CONFIG_CPU_CACHE_V4WT=y
233 +CONFIG_CPU_CACHE_VIVT=y
234 +CONFIG_CPU_COPY_V4WB=y
235 +CONFIG_CPU_TLB_V4WBI=y
236 +CONFIG_CPU_CP15=y
237 +CONFIG_CPU_CP15_MMU=y
238 +
239 +#
240 +# Processor Features
241 +#
242 +CONFIG_ARM_THUMB=y
243 +# CONFIG_CPU_ICACHE_DISABLE is not set
244 +# CONFIG_CPU_DCACHE_DISABLE is not set
245 +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
246 +# CONFIG_OUTER_CACHE is not set
247 +
248 +#
249 +# Bus support
250 +#
251 +# CONFIG_PCI_SYSCALL is not set
252 +# CONFIG_ARCH_SUPPORTS_MSI is not set
253 +# CONFIG_PCCARD is not set
254 +
255 +#
256 +# Kernel Features
257 +#
258 +# CONFIG_TICK_ONESHOT is not set
259 +CONFIG_PREEMPT=y
260 +CONFIG_NO_IDLE_HZ=y
261 +CONFIG_HZ=200
262 +CONFIG_AEABI=y
263 +CONFIG_OABI_COMPAT=y
264 +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
265 +CONFIG_SELECT_MEMORY_MODEL=y
266 +CONFIG_FLATMEM_MANUAL=y
267 +# CONFIG_DISCONTIGMEM_MANUAL is not set
268 +# CONFIG_SPARSEMEM_MANUAL is not set
269 +CONFIG_FLATMEM=y
270 +CONFIG_FLAT_NODE_MEM_MAP=y
271 +# CONFIG_SPARSEMEM_STATIC is not set
272 +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
273 +CONFIG_SPLIT_PTLOCK_CPUS=4096
274 +# CONFIG_RESOURCES_64BIT is not set
275 +CONFIG_ZONE_DMA_FLAG=1
276 +CONFIG_BOUNCE=y
277 +CONFIG_VIRT_TO_BUS=y
278 +CONFIG_ALIGNMENT_TRAP=y
279 +
280 +#
281 +# Boot options
282 +#
283 +CONFIG_ZBOOT_ROM_TEXT=0x0
284 +CONFIG_ZBOOT_ROM_BSS=0x0
285 +CONFIG_CMDLINE="root=/dev/mmcblk0p1 rootdelay=5"
286 +# CONFIG_XIP_KERNEL is not set
287 +CONFIG_KEXEC=y
288 +CONFIG_ATAGS_PROC=y
289 +
290 +#
291 +# Floating point emulation
292 +#
293 +
294 +#
295 +# At least one emulation must be selected
296 +#
297 +CONFIG_FPE_NWFPE=y
298 +# CONFIG_FPE_NWFPE_XP is not set
299 +# CONFIG_FPE_FASTFPE is not set
300 +
301 +#
302 +# Userspace binary formats
303 +#
304 +CONFIG_BINFMT_ELF=y
305 +# CONFIG_BINFMT_AOUT is not set
306 +# CONFIG_BINFMT_MISC is not set
307 +
308 +#
309 +# Power management options
310 +#
311 +CONFIG_PM=y
312 +CONFIG_PM_LEGACY=y
313 +CONFIG_PM_DEBUG=y
314 +# CONFIG_PM_VERBOSE is not set
315 +CONFIG_PM_SLEEP=y
316 +CONFIG_SUSPEND_UP_POSSIBLE=y
317 +CONFIG_SUSPEND=y
318 +CONFIG_APM_EMULATION=y
319 +
320 +#
321 +# Networking
322 +#
323 +CONFIG_NET=y
324 +
325 +#
326 +# Networking options
327 +#
328 +CONFIG_PACKET=y
329 +CONFIG_PACKET_MMAP=y
330 +CONFIG_UNIX=y
331 +CONFIG_XFRM=y
332 +# CONFIG_XFRM_USER is not set
333 +# CONFIG_XFRM_SUB_POLICY is not set
334 +CONFIG_XFRM_MIGRATE=y
335 +CONFIG_NET_KEY=m
336 +CONFIG_NET_KEY_MIGRATE=y
337 +CONFIG_INET=y
338 +CONFIG_IP_MULTICAST=y
339 +CONFIG_IP_ADVANCED_ROUTER=y
340 +CONFIG_ASK_IP_FIB_HASH=y
341 +# CONFIG_IP_FIB_TRIE is not set
342 +CONFIG_IP_FIB_HASH=y
343 +CONFIG_IP_MULTIPLE_TABLES=y
344 +# CONFIG_IP_ROUTE_MULTIPATH is not set
345 +# CONFIG_IP_ROUTE_VERBOSE is not set
346 +CONFIG_IP_PNP=y
347 +CONFIG_IP_PNP_DHCP=y
348 +# CONFIG_IP_PNP_BOOTP is not set
349 +# CONFIG_IP_PNP_RARP is not set
350 +CONFIG_NET_IPIP=m
351 +CONFIG_NET_IPGRE=m
352 +# CONFIG_NET_IPGRE_BROADCAST is not set
353 +# CONFIG_IP_MROUTE is not set
354 +# CONFIG_ARPD is not set
355 +CONFIG_SYN_COOKIES=y
356 +CONFIG_INET_AH=m
357 +CONFIG_INET_ESP=m
358 +CONFIG_INET_IPCOMP=m
359 +CONFIG_INET_XFRM_TUNNEL=m
360 +CONFIG_INET_TUNNEL=m
361 +CONFIG_INET_XFRM_MODE_TRANSPORT=m
362 +CONFIG_INET_XFRM_MODE_TUNNEL=m
363 +CONFIG_INET_XFRM_MODE_BEET=m
364 +# CONFIG_INET_LRO is not set
365 +CONFIG_INET_DIAG=y
366 +CONFIG_INET_TCP_DIAG=y
367 +# CONFIG_TCP_CONG_ADVANCED is not set
368 +CONFIG_TCP_CONG_CUBIC=y
369 +CONFIG_DEFAULT_TCP_CONG="cubic"
370 +CONFIG_TCP_MD5SIG=y
371 +# CONFIG_IP_VS is not set
372 +CONFIG_IPV6=m
373 +# CONFIG_IPV6_PRIVACY is not set
374 +# CONFIG_IPV6_ROUTER_PREF is not set
375 +# CONFIG_IPV6_OPTIMISTIC_DAD is not set
376 +CONFIG_INET6_AH=m
377 +CONFIG_INET6_ESP=m
378 +CONFIG_INET6_IPCOMP=m
379 +# CONFIG_IPV6_MIP6 is not set
380 +CONFIG_INET6_XFRM_TUNNEL=m
381 +CONFIG_INET6_TUNNEL=m
382 +CONFIG_INET6_XFRM_MODE_TRANSPORT=m
383 +CONFIG_INET6_XFRM_MODE_TUNNEL=m
384 +CONFIG_INET6_XFRM_MODE_BEET=m
385 +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
386 +CONFIG_IPV6_SIT=m
387 +CONFIG_IPV6_TUNNEL=m
388 +# CONFIG_IPV6_MULTIPLE_TABLES is not set
389 +# CONFIG_NETWORK_SECMARK is not set
390 +CONFIG_NETFILTER=y
391 +# CONFIG_NETFILTER_DEBUG is not set
392 +
393 +#
394 +# Core Netfilter Configuration
395 +#
396 +CONFIG_NETFILTER_NETLINK=m
397 +CONFIG_NETFILTER_NETLINK_QUEUE=m
398 +CONFIG_NETFILTER_NETLINK_LOG=m
399 +CONFIG_NF_CONNTRACK_ENABLED=m
400 +CONFIG_NF_CONNTRACK=m
401 +CONFIG_NF_CT_ACCT=y
402 +CONFIG_NF_CONNTRACK_MARK=y
403 +CONFIG_NF_CONNTRACK_EVENTS=y
404 +CONFIG_NF_CT_PROTO_GRE=m
405 +CONFIG_NF_CT_PROTO_SCTP=m
406 +# CONFIG_NF_CT_PROTO_UDPLITE is not set
407 +# CONFIG_NF_CONNTRACK_AMANDA is not set
408 +CONFIG_NF_CONNTRACK_FTP=m
409 +CONFIG_NF_CONNTRACK_H323=m
410 +CONFIG_NF_CONNTRACK_IRC=m
411 +CONFIG_NF_CONNTRACK_NETBIOS_NS=m
412 +CONFIG_NF_CONNTRACK_PPTP=m
413 +CONFIG_NF_CONNTRACK_SANE=m
414 +CONFIG_NF_CONNTRACK_SIP=m
415 +CONFIG_NF_CONNTRACK_TFTP=m
416 +CONFIG_NF_CT_NETLINK=m
417 +CONFIG_NETFILTER_XTABLES=m
418 +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
419 +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
420 +CONFIG_NETFILTER_XT_TARGET_DSCP=m
421 +CONFIG_NETFILTER_XT_TARGET_MARK=m
422 +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
423 +CONFIG_NETFILTER_XT_TARGET_NFLOG=m
424 +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
425 +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
426 +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
427 +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
428 +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
429 +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
430 +CONFIG_NETFILTER_XT_MATCH_DCCP=m
431 +CONFIG_NETFILTER_XT_MATCH_DSCP=m
432 +CONFIG_NETFILTER_XT_MATCH_ESP=m
433 +CONFIG_NETFILTER_XT_MATCH_HELPER=m
434 +CONFIG_NETFILTER_XT_MATCH_LENGTH=m
435 +CONFIG_NETFILTER_XT_MATCH_LIMIT=m
436 +CONFIG_NETFILTER_XT_MATCH_MAC=m
437 +CONFIG_NETFILTER_XT_MATCH_MARK=m
438 +CONFIG_NETFILTER_XT_MATCH_POLICY=m
439 +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
440 +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
441 +CONFIG_NETFILTER_XT_MATCH_QUOTA=m
442 +CONFIG_NETFILTER_XT_MATCH_REALM=m
443 +CONFIG_NETFILTER_XT_MATCH_SCTP=m
444 +CONFIG_NETFILTER_XT_MATCH_STATE=m
445 +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
446 +CONFIG_NETFILTER_XT_MATCH_STRING=m
447 +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
448 +# CONFIG_NETFILTER_XT_MATCH_TIME is not set
449 +# CONFIG_NETFILTER_XT_MATCH_U32 is not set
450 +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
451 +
452 +#
453 +# IP: Netfilter Configuration
454 +#
455 +CONFIG_NF_CONNTRACK_IPV4=m
456 +CONFIG_NF_CONNTRACK_PROC_COMPAT=y
457 +# CONFIG_IP_NF_QUEUE is not set
458 +CONFIG_IP_NF_IPTABLES=m
459 +CONFIG_IP_NF_MATCH_IPRANGE=m
460 +CONFIG_IP_NF_MATCH_TOS=m
461 +# CONFIG_IP_NF_MATCH_RECENT is not set
462 +CONFIG_IP_NF_MATCH_ECN=m
463 +CONFIG_IP_NF_MATCH_AH=m
464 +CONFIG_IP_NF_MATCH_TTL=m
465 +CONFIG_IP_NF_MATCH_OWNER=m
466 +CONFIG_IP_NF_MATCH_ADDRTYPE=m
467 +CONFIG_IP_NF_FILTER=m
468 +CONFIG_IP_NF_TARGET_REJECT=m
469 +CONFIG_IP_NF_TARGET_LOG=m
470 +CONFIG_IP_NF_TARGET_ULOG=m
471 +CONFIG_NF_NAT=m
472 +CONFIG_NF_NAT_NEEDED=y
473 +CONFIG_IP_NF_TARGET_MASQUERADE=m
474 +CONFIG_IP_NF_TARGET_REDIRECT=m
475 +CONFIG_IP_NF_TARGET_NETMAP=m
476 +CONFIG_IP_NF_TARGET_SAME=m
477 +CONFIG_NF_NAT_SNMP_BASIC=m
478 +CONFIG_NF_NAT_PROTO_GRE=m
479 +CONFIG_NF_NAT_FTP=m
480 +CONFIG_NF_NAT_IRC=m
481 +CONFIG_NF_NAT_TFTP=m
482 +# CONFIG_NF_NAT_AMANDA is not set
483 +CONFIG_NF_NAT_PPTP=m
484 +CONFIG_NF_NAT_H323=m
485 +CONFIG_NF_NAT_SIP=m
486 +CONFIG_IP_NF_MANGLE=m
487 +CONFIG_IP_NF_TARGET_TOS=m
488 +CONFIG_IP_NF_TARGET_ECN=m
489 +CONFIG_IP_NF_TARGET_TTL=m
490 +CONFIG_IP_NF_TARGET_CLUSTERIP=m
491 +# CONFIG_IP_NF_RAW is not set
492 +# CONFIG_IP_NF_ARPTABLES is not set
493 +
494 +#
495 +# IPv6: Netfilter Configuration (EXPERIMENTAL)
496 +#
497 +CONFIG_NF_CONNTRACK_IPV6=m
498 +# CONFIG_IP6_NF_QUEUE is not set
499 +CONFIG_IP6_NF_IPTABLES=m
500 +CONFIG_IP6_NF_MATCH_RT=m
501 +CONFIG_IP6_NF_MATCH_OPTS=m
502 +CONFIG_IP6_NF_MATCH_FRAG=m
503 +CONFIG_IP6_NF_MATCH_HL=m
504 +CONFIG_IP6_NF_MATCH_OWNER=m
505 +CONFIG_IP6_NF_MATCH_IPV6HEADER=m
506 +CONFIG_IP6_NF_MATCH_AH=m
507 +CONFIG_IP6_NF_MATCH_MH=m
508 +CONFIG_IP6_NF_MATCH_EUI64=m
509 +CONFIG_IP6_NF_FILTER=m
510 +CONFIG_IP6_NF_TARGET_LOG=m
511 +CONFIG_IP6_NF_TARGET_REJECT=m
512 +CONFIG_IP6_NF_MANGLE=m
513 +CONFIG_IP6_NF_TARGET_HL=m
514 +# CONFIG_IP6_NF_RAW is not set
515 +# CONFIG_IP_DCCP is not set
516 +# CONFIG_IP_SCTP is not set
517 +# CONFIG_TIPC is not set
518 +# CONFIG_ATM is not set
519 +# CONFIG_BRIDGE is not set
520 +# CONFIG_VLAN_8021Q is not set
521 +# CONFIG_DECNET is not set
522 +# CONFIG_LLC2 is not set
523 +# CONFIG_IPX is not set
524 +# CONFIG_ATALK is not set
525 +# CONFIG_X25 is not set
526 +# CONFIG_LAPB is not set
527 +# CONFIG_ECONET is not set
528 +# CONFIG_WAN_ROUTER is not set
529 +CONFIG_NET_SCHED=y
530 +
531 +#
532 +# Queueing/Scheduling
533 +#
534 +CONFIG_NET_SCH_CBQ=m
535 +CONFIG_NET_SCH_HTB=m
536 +CONFIG_NET_SCH_HFSC=m
537 +CONFIG_NET_SCH_PRIO=m
538 +# CONFIG_NET_SCH_RR is not set
539 +CONFIG_NET_SCH_RED=m
540 +CONFIG_NET_SCH_SFQ=m
541 +CONFIG_NET_SCH_TEQL=m
542 +CONFIG_NET_SCH_TBF=m
543 +CONFIG_NET_SCH_GRED=m
544 +CONFIG_NET_SCH_DSMARK=m
545 +CONFIG_NET_SCH_NETEM=m
546 +CONFIG_NET_SCH_INGRESS=m
547 +
548 +#
549 +# Classification
550 +#
551 +CONFIG_NET_CLS=y
552 +CONFIG_NET_CLS_BASIC=m
553 +CONFIG_NET_CLS_TCINDEX=m
554 +CONFIG_NET_CLS_ROUTE4=m
555 +CONFIG_NET_CLS_ROUTE=y
556 +CONFIG_NET_CLS_FW=m
557 +CONFIG_NET_CLS_U32=m
558 +CONFIG_CLS_U32_PERF=y
559 +CONFIG_CLS_U32_MARK=y
560 +CONFIG_NET_CLS_RSVP=m
561 +CONFIG_NET_CLS_RSVP6=m
562 +# CONFIG_NET_EMATCH is not set
563 +# CONFIG_NET_CLS_ACT is not set
564 +# CONFIG_NET_CLS_POLICE is not set
565 +# CONFIG_NET_CLS_IND is not set
566 +CONFIG_NET_SCH_FIFO=y
567 +
568 +#
569 +# Network testing
570 +#
571 +# CONFIG_NET_PKTGEN is not set
572 +# CONFIG_HAMRADIO is not set
573 +# CONFIG_IRDA is not set
574 +CONFIG_BT=m
575 +CONFIG_BT_L2CAP=m
576 +CONFIG_BT_SCO=m
577 +CONFIG_BT_RFCOMM=m
578 +CONFIG_BT_RFCOMM_TTY=y
579 +CONFIG_BT_BNEP=m
580 +CONFIG_BT_BNEP_MC_FILTER=y
581 +CONFIG_BT_BNEP_PROTO_FILTER=y
582 +CONFIG_BT_HIDP=m
583 +
584 +#
585 +# Bluetooth device drivers
586 +#
587 +CONFIG_BT_HCIUSB=m
588 +CONFIG_BT_HCIUSB_SCO=y
589 +# CONFIG_BT_HCIBTSDIO is not set
590 +# CONFIG_BT_HCIUART is not set
591 +# CONFIG_BT_HCIBCM203X is not set
592 +# CONFIG_BT_HCIBPA10X is not set
593 +# CONFIG_BT_HCIBFUSB is not set
594 +# CONFIG_BT_HCIVHCI is not set
595 +# CONFIG_AF_RXRPC is not set
596 +CONFIG_FIB_RULES=y
597 +
598 +#
599 +# Wireless
600 +#
601 +# CONFIG_CFG80211 is not set
602 +CONFIG_WIRELESS_EXT=y
603 +# CONFIG_MAC80211 is not set
604 +# CONFIG_IEEE80211 is not set
605 +# CONFIG_RFKILL is not set
606 +# CONFIG_NET_9P is not set
607 +
608 +#
609 +# Device Drivers
610 +#
611 +
612 +#
613 +# Generic Driver Options
614 +#
615 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
616 +CONFIG_STANDALONE=y
617 +CONFIG_PREVENT_FIRMWARE_BUILD=y
618 +CONFIG_FW_LOADER=m
619 +# CONFIG_DEBUG_DRIVER is not set
620 +# CONFIG_DEBUG_DEVRES is not set
621 +# CONFIG_SYS_HYPERVISOR is not set
622 +CONFIG_CONNECTOR=m
623 +CONFIG_MTD=y
624 +# CONFIG_MTD_DEBUG is not set
625 +# CONFIG_MTD_CONCAT is not set
626 +CONFIG_MTD_PARTITIONS=y
627 +# CONFIG_MTD_REDBOOT_PARTS is not set
628 +CONFIG_MTD_CMDLINE_PARTS=y
629 +# CONFIG_MTD_AFS_PARTS is not set
630 +
631 +#
632 +# User Modules And Translation Layers
633 +#
634 +CONFIG_MTD_CHAR=y
635 +CONFIG_MTD_BLKDEVS=y
636 +CONFIG_MTD_BLOCK=y
637 +# CONFIG_FTL is not set
638 +# CONFIG_NFTL is not set
639 +# CONFIG_INFTL is not set
640 +# CONFIG_RFD_FTL is not set
641 +# CONFIG_SSFDC is not set
642 +# CONFIG_MTD_OOPS is not set
643 +
644 +#
645 +# RAM/ROM/Flash chip drivers
646 +#
647 +CONFIG_MTD_CFI=y
648 +# CONFIG_MTD_JEDECPROBE is not set
649 +CONFIG_MTD_GEN_PROBE=y
650 +# CONFIG_MTD_CFI_ADV_OPTIONS is not set
651 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
652 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
653 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
654 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
655 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
656 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
657 +CONFIG_MTD_CFI_I1=y
658 +CONFIG_MTD_CFI_I2=y
659 +# CONFIG_MTD_CFI_I4 is not set
660 +# CONFIG_MTD_CFI_I8 is not set
661 +CONFIG_MTD_CFI_INTELEXT=y
662 +# CONFIG_MTD_CFI_AMDSTD is not set
663 +# CONFIG_MTD_CFI_STAA is not set
664 +CONFIG_MTD_CFI_UTIL=y
665 +# CONFIG_MTD_RAM is not set
666 +# CONFIG_MTD_ROM is not set
667 +CONFIG_MTD_ABSENT=y
668 +
669 +#
670 +# Mapping drivers for chip access
671 +#
672 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
673 +CONFIG_MTD_PHYSMAP=y
674 +CONFIG_MTD_PHYSMAP_START=0x8000000
675 +CONFIG_MTD_PHYSMAP_LEN=0
676 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2
677 +# CONFIG_MTD_ARM_INTEGRATOR is not set
678 +# CONFIG_MTD_PLATRAM is not set
679 +
680 +#
681 +# Self-contained MTD device drivers
682 +#
683 +# CONFIG_MTD_DATAFLASH is not set
684 +# CONFIG_MTD_M25P80 is not set
685 +# CONFIG_MTD_SLRAM is not set
686 +# CONFIG_MTD_PHRAM is not set
687 +# CONFIG_MTD_MTDRAM is not set
688 +# CONFIG_MTD_BLOCK2MTD is not set
689 +
690 +#
691 +# Disk-On-Chip Device Drivers
692 +#
693 +# CONFIG_MTD_DOC2000 is not set
694 +# CONFIG_MTD_DOC2001 is not set
695 +# CONFIG_MTD_DOC2001PLUS is not set
696 +CONFIG_MTD_NAND=y
697 +CONFIG_MTD_NAND_VERIFY_WRITE=y
698 +# CONFIG_MTD_NAND_ECC_SMC is not set
699 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
700 +CONFIG_MTD_NAND_IDS=y
701 +CONFIG_MTD_NAND_S3C2410=y
702 +# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
703 +CONFIG_MTD_NAND_S3C2410_HWECC=y
704 +# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
705 +# CONFIG_MTD_NAND_DISKONCHIP is not set
706 +# CONFIG_MTD_NAND_NANDSIM is not set
707 +# CONFIG_MTD_NAND_PLATFORM is not set
708 +# CONFIG_MTD_ALAUDA is not set
709 +# CONFIG_MTD_ONENAND is not set
710 +
711 +#
712 +# UBI - Unsorted block images
713 +#
714 +# CONFIG_MTD_UBI is not set
715 +# CONFIG_PARPORT is not set
716 +CONFIG_BLK_DEV=y
717 +# CONFIG_BLK_DEV_COW_COMMON is not set
718 +CONFIG_BLK_DEV_LOOP=m
719 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
720 +# CONFIG_BLK_DEV_NBD is not set
721 +CONFIG_BLK_DEV_UB=m
722 +CONFIG_BLK_DEV_RAM=y
723 +CONFIG_BLK_DEV_RAM_COUNT=16
724 +CONFIG_BLK_DEV_RAM_SIZE=4096
725 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
726 +# CONFIG_CDROM_PKTCDVD is not set
727 +# CONFIG_ATA_OVER_ETH is not set
728 +CONFIG_MISC_DEVICES=y
729 +# CONFIG_EEPROM_93CX6 is not set
730 +# CONFIG_IDE is not set
731 +
732 +
733 +#
734 +# SCSI device support
735 +#
736 +# CONFIG_RAID_ATTRS is not set
737 +CONFIG_SCSI=m
738 +CONFIG_SCSI_DMA=y
739 +# CONFIG_SCSI_TGT is not set
740 +# CONFIG_SCSI_NETLINK is not set
741 +CONFIG_SCSI_PROC_FS=y
742 +
743 +#
744 +# SCSI support type (disk, tape, CD-ROM)
745 +#
746 +CONFIG_BLK_DEV_SD=m
747 +# CONFIG_CHR_DEV_ST is not set
748 +# CONFIG_CHR_DEV_OSST is not set
749 +CONFIG_BLK_DEV_SR=m
750 +# CONFIG_BLK_DEV_SR_VENDOR is not set
751 +CONFIG_CHR_DEV_SG=m
752 +# CONFIG_CHR_DEV_SCH is not set
753 +
754 +#
755 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
756 +#
757 +# CONFIG_SCSI_MULTI_LUN is not set
758 +# CONFIG_SCSI_CONSTANTS is not set
759 +# CONFIG_SCSI_LOGGING is not set
760 +CONFIG_SCSI_SCAN_ASYNC=y
761 +CONFIG_SCSI_WAIT_SCAN=m
762 +
763 +#
764 +# SCSI Transports
765 +#
766 +# CONFIG_SCSI_SPI_ATTRS is not set
767 +# CONFIG_SCSI_FC_ATTRS is not set
768 +# CONFIG_SCSI_ISCSI_ATTRS is not set
769 +# CONFIG_SCSI_SAS_LIBSAS is not set
770 +# CONFIG_SCSI_SRP_ATTRS is not set
771 +CONFIG_SCSI_LOWLEVEL=y
772 +# CONFIG_ISCSI_TCP is not set
773 +# CONFIG_SCSI_DEBUG is not set
774 +# CONFIG_ATA is not set
775 +# CONFIG_MD is not set
776 +CONFIG_NETDEVICES=y
777 +# CONFIG_NETDEVICES_MULTIQUEUE is not set
778 +# CONFIG_DUMMY is not set
779 +# CONFIG_BONDING is not set
780 +# CONFIG_MACVLAN is not set
781 +# CONFIG_EQUALIZER is not set
782 +CONFIG_TUN=m
783 +# CONFIG_VETH is not set
784 +# CONFIG_PHYLIB is not set
785 +CONFIG_NET_ETHERNET=y
786 +CONFIG_MII=y
787 +# CONFIG_AX88796 is not set
788 +# CONFIG_SMC91X is not set
789 +# CONFIG_DM9000 is not set
790 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
791 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
792 +# CONFIG_IBM_NEW_EMAC_TAH is not set
793 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
794 +CONFIG_NET_PCI=y
795 +# CONFIG_B44 is not set
796 +CONFIG_CS89x0=m
797 +# CONFIG_NETDEV_1000 is not set
798 +# CONFIG_NETDEV_10000 is not set
799 +
800 +#
801 +# Wireless LAN
802 +#
803 +# CONFIG_WLAN_PRE80211 is not set
804 +# CONFIG_WLAN_80211 is not set
805 +
806 +#
807 +# USB Network Adapters
808 +#
809 +CONFIG_USB_CATC=m
810 +CONFIG_USB_KAWETH=m
811 +CONFIG_USB_PEGASUS=m
812 +CONFIG_USB_RTL8150=m
813 +CONFIG_USB_USBNET=y
814 +CONFIG_USB_NET_AX8817X=m
815 +CONFIG_USB_NET_CDCETHER=m
816 +CONFIG_USB_NET_DM9601=m
817 +CONFIG_USB_NET_GL620A=m
818 +CONFIG_USB_NET_NET1080=m
819 +CONFIG_USB_NET_PLUSB=m
820 +CONFIG_USB_NET_MCS7830=m
821 +CONFIG_USB_NET_RNDIS_HOST=m
822 +CONFIG_USB_NET_CDC_SUBSET=m
823 +CONFIG_USB_ALI_M5632=y
824 +CONFIG_USB_AN2720=y
825 +CONFIG_USB_BELKIN=y
826 +CONFIG_USB_ARMLINUX=y
827 +CONFIG_USB_EPSON2888=y
828 +CONFIG_USB_KC2190=y
829 +CONFIG_USB_NET_ZAURUS=m
830 +# CONFIG_WAN is not set
831 +CONFIG_PPP=m
832 +CONFIG_PPP_MULTILINK=y
833 +CONFIG_PPP_FILTER=y
834 +CONFIG_PPP_ASYNC=m
835 +CONFIG_PPP_SYNC_TTY=m
836 +CONFIG_PPP_DEFLATE=m
837 +CONFIG_PPP_BSDCOMP=m
838 +CONFIG_PPP_MPPE=m
839 +# CONFIG_PPPOE is not set
840 +# CONFIG_PPPOL2TP is not set
841 +# CONFIG_SLIP is not set
842 +CONFIG_SLHC=m
843 +# CONFIG_SHAPER is not set
844 +# CONFIG_NETCONSOLE is not set
845 +# CONFIG_NETPOLL is not set
846 +# CONFIG_NET_POLL_CONTROLLER is not set
847 +# CONFIG_ISDN is not set
848 +
849 +#
850 +# Input device support
851 +#
852 +CONFIG_INPUT=y
853 +# CONFIG_INPUT_FF_MEMLESS is not set
854 +# CONFIG_INPUT_POLLDEV is not set
855 +
856 +#
857 +# Userland interfaces
858 +#
859 +CONFIG_INPUT_MOUSEDEV=y
860 +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
861 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
862 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
863 +# CONFIG_INPUT_JOYDEV is not set
864 +CONFIG_INPUT_EVDEV=y
865 +# CONFIG_INPUT_EVBUG is not set
866 +
867 +#
868 +# Input Device Drivers
869 +#
870 +CONFIG_INPUT_KEYBOARD=y
871 +# CONFIG_KEYBOARD_ATKBD is not set
872 +# CONFIG_KEYBOARD_SUNKBD is not set
873 +# CONFIG_KEYBOARD_LKKBD is not set
874 +# CONFIG_KEYBOARD_XTKBD is not set
875 +# CONFIG_KEYBOARD_NEWTON is not set
876 +CONFIG_KEYBOARD_STOWAWAY=m
877 +CONFIG_KEYBOARD_GPIO=m
878 +CONFIG_KEYBOARD_M800=y
879 +CONFIG_KEYBOARD_QT2410=y
880 +CONFIG_INPUT_MOUSE=y
881 +# CONFIG_MOUSE_PS2 is not set
882 +# CONFIG_MOUSE_SERIAL is not set
883 +# CONFIG_MOUSE_APPLETOUCH is not set
884 +# CONFIG_MOUSE_VSXXXAA is not set
885 +# CONFIG_MOUSE_GPIO is not set
886 +# CONFIG_INPUT_JOYSTICK is not set
887 +# CONFIG_INPUT_TABLET is not set
888 +CONFIG_INPUT_TOUCHSCREEN=y
889 +# CONFIG_TOUCHSCREEN_ADS7846 is not set
890 +# CONFIG_TOUCHSCREEN_FUJITSU is not set
891 +CONFIG_TOUCHSCREEN_S3C2410=y
892 +# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
893 +# CONFIG_TOUCHSCREEN_GUNZE is not set
894 +# CONFIG_TOUCHSCREEN_ELO is not set
895 +# CONFIG_TOUCHSCREEN_MTOUCH is not set
896 +# CONFIG_TOUCHSCREEN_MK712 is not set
897 +# CONFIG_TOUCHSCREEN_PENMOUNT is not set
898 +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
899 +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
900 +# CONFIG_TOUCHSCREEN_UCB1400 is not set
901 +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
902 +CONFIG_INPUT_MISC=y
903 +# CONFIG_INPUT_ATI_REMOTE is not set
904 +# CONFIG_INPUT_ATI_REMOTE2 is not set
905 +# CONFIG_INPUT_KEYSPAN_REMOTE is not set
906 +# CONFIG_INPUT_POWERMATE is not set
907 +# CONFIG_INPUT_YEALINK is not set
908 +CONFIG_INPUT_UINPUT=m
909 +CONFIG_INPUT_LIS302DL=y
910 +
911 +#
912 +# Hardware I/O ports
913 +#
914 +CONFIG_SERIO=y
915 +# CONFIG_SERIO_SERPORT is not set
916 +# CONFIG_SERIO_RAW is not set
917 +# CONFIG_GAMEPORT is not set
918 +
919 +#
920 +# Character devices
921 +#
922 +CONFIG_VT=y
923 +CONFIG_VT_CONSOLE=y
924 +CONFIG_NR_TTY_DEVICES=4
925 +CONFIG_HW_CONSOLE=y
926 +CONFIG_VT_HW_CONSOLE_BINDING=y
927 +# CONFIG_SERIAL_NONSTANDARD is not set
928 +
929 +#
930 +# Serial drivers
931 +#
932 +# CONFIG_SERIAL_8250 is not set
933 +
934 +#
935 +# Non-8250 serial port support
936 +#
937 +CONFIG_SERIAL_S3C2410=y
938 +CONFIG_SERIAL_S3C2410_CONSOLE=y
939 +CONFIG_SERIAL_CORE=y
940 +CONFIG_SERIAL_CORE_CONSOLE=y
941 +CONFIG_UNIX98_PTYS=y
942 +# CONFIG_LEGACY_PTYS is not set
943 +# CONFIG_IPMI_HANDLER is not set
944 +# CONFIG_HW_RANDOM is not set
945 +# CONFIG_NVRAM is not set
946 +# CONFIG_R3964 is not set
947 +# CONFIG_RAW_DRIVER is not set
948 +# CONFIG_TCG_TPM is not set
949 +CONFIG_I2C=y
950 +CONFIG_I2C_BOARDINFO=y
951 +CONFIG_I2C_CHARDEV=y
952 +
953 +#
954 +# I2C Algorithms
955 +#
956 +# CONFIG_I2C_ALGOBIT is not set
957 +# CONFIG_I2C_ALGOPCF is not set
958 +# CONFIG_I2C_ALGOPCA is not set
959 +
960 +#
961 +# I2C Hardware Bus support
962 +#
963 +# CONFIG_I2C_GPIO is not set
964 +# CONFIG_I2C_OCORES is not set
965 +# CONFIG_I2C_PARPORT_LIGHT is not set
966 +CONFIG_I2C_S3C2410=y
967 +# CONFIG_I2C_SIMTEC is not set
968 +# CONFIG_I2C_TAOS_EVM is not set
969 +# CONFIG_I2C_STUB is not set
970 +# CONFIG_I2C_TINY_USB is not set
971 +
972 +#
973 +# Miscellaneous I2C Chip support
974 +#
975 +# CONFIG_SENSORS_DS1337 is not set
976 +# CONFIG_SENSORS_DS1374 is not set
977 +# CONFIG_DS1682 is not set
978 +# CONFIG_SENSORS_EEPROM is not set
979 +CONFIG_SENSORS_PCF50606=y
980 +CONFIG_SENSORS_PCF50633=y
981 +# CONFIG_SENSORS_PCF8574 is not set
982 +# CONFIG_SENSORS_PCA9539 is not set
983 +# CONFIG_SENSORS_PCF8591 is not set
984 +# CONFIG_SENSORS_MAX6875 is not set
985 +# CONFIG_SENSORS_TSL2550 is not set
986 +CONFIG_SENSORS_TSL256X=m
987 +# CONFIG_PCA9632 is not set
988 +# CONFIG_I2C_DEBUG_CORE is not set
989 +# CONFIG_I2C_DEBUG_ALGO is not set
990 +# CONFIG_I2C_DEBUG_BUS is not set
991 +# CONFIG_I2C_DEBUG_CHIP is not set
992 +
993 +#
994 +# SPI support
995 +#
996 +CONFIG_SPI=y
997 +# CONFIG_SPI_DEBUG is not set
998 +CONFIG_SPI_MASTER=y
999 +
1000 +#
1001 +# SPI Master Controller Drivers
1002 +#
1003 +CONFIG_SPI_BITBANG=y
1004 +CONFIG_SPI_S3C24XX=y
1005 +CONFIG_SPI_S3C24XX_GPIO=y
1006 +
1007 +#
1008 +# SPI Protocol Masters
1009 +#
1010 +# CONFIG_SPI_AT25 is not set
1011 +# CONFIG_SPI_SPIDEV is not set
1012 +# CONFIG_SPI_TLE62X0 is not set
1013 +# CONFIG_W1 is not set
1014 +CONFIG_POWER_SUPPLY=y
1015 +# CONFIG_POWER_SUPPLY_DEBUG is not set
1016 +# CONFIG_PDA_POWER is not set
1017 +CONFIG_APM_POWER=y
1018 +# CONFIG_BATTERY_DS2760 is not set
1019 +CONFIG_BATTERY_BQ27000_HDQ=y
1020 +# CONFIG_HWMON is not set
1021 +CONFIG_WATCHDOG=y
1022 +# CONFIG_WATCHDOG_NOWAYOUT is not set
1023 +
1024 +#
1025 +# Watchdog Device Drivers
1026 +#
1027 +# CONFIG_SOFT_WATCHDOG is not set
1028 +CONFIG_S3C2410_WATCHDOG=m
1029 +
1030 +#
1031 +# USB-based Watchdog Cards
1032 +#
1033 +# CONFIG_USBPCWATCHDOG is not set
1034 +
1035 +#
1036 +# Sonics Silicon Backplane
1037 +#
1038 +CONFIG_SSB_POSSIBLE=y
1039 +# CONFIG_SSB is not set
1040 +
1041 +#
1042 +# Multifunction device drivers
1043 +#
1044 +# CONFIG_MFD_SM501 is not set
1045 +# CONFIG_MFD_GLAMO is not set
1046 +
1047 +#
1048 +# Multimedia devices
1049 +#
1050 +# CONFIG_VIDEO_DEV is not set
1051 +# CONFIG_DVB_CORE is not set
1052 +# CONFIG_DAB is not set
1053 +
1054 +#
1055 +# Graphics support
1056 +#
1057 +# CONFIG_VGASTATE is not set
1058 +# CONFIG_VIDEO_OUTPUT_CONTROL is not set
1059 +CONFIG_FB=y
1060 +# CONFIG_FIRMWARE_EDID is not set
1061 +# CONFIG_FB_DDC is not set
1062 +CONFIG_FB_CFB_FILLRECT=y
1063 +CONFIG_FB_CFB_COPYAREA=y
1064 +CONFIG_FB_CFB_IMAGEBLIT=y
1065 +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
1066 +# CONFIG_FB_SYS_FILLRECT is not set
1067 +# CONFIG_FB_SYS_COPYAREA is not set
1068 +# CONFIG_FB_SYS_IMAGEBLIT is not set
1069 +# CONFIG_FB_SYS_FOPS is not set
1070 +CONFIG_FB_DEFERRED_IO=y
1071 +# CONFIG_FB_SVGALIB is not set
1072 +# CONFIG_FB_MACMODES is not set
1073 +# CONFIG_FB_BACKLIGHT is not set
1074 +# CONFIG_FB_MODE_HELPERS is not set
1075 +# CONFIG_FB_TILEBLITTING is not set
1076 +
1077 +#
1078 +# Frame buffer hardware drivers
1079 +#
1080 +# CONFIG_FB_UVESA is not set
1081 +# CONFIG_FB_S1D13XXX is not set
1082 +CONFIG_FB_S3C2410=y
1083 +# CONFIG_FB_S3C2410_DEBUG is not set
1084 +# CONFIG_FB_VIRTUAL is not set
1085 +CONFIG_BACKLIGHT_LCD_SUPPORT=y
1086 +CONFIG_LCD_CLASS_DEVICE=y
1087 +# CONFIG_LCD_LTV350QV is not set
1088 +CONFIG_BACKLIGHT_CLASS_DEVICE=y
1089 +# CONFIG_BACKLIGHT_CORGI is not set
1090 +
1091 +#
1092 +# Display device support
1093 +#
1094 +# CONFIG_DISPLAY_SUPPORT is not set
1095 +CONFIG_DISPLAY_JBT6K74=y
1096 +
1097 +#
1098 +# Console display driver support
1099 +#
1100 +# CONFIG_VGA_CONSOLE is not set
1101 +CONFIG_DUMMY_CONSOLE=y
1102 +CONFIG_FRAMEBUFFER_CONSOLE=y
1103 +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
1104 +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
1105 +CONFIG_FONTS=y
1106 +# CONFIG_FONT_8x8 is not set
1107 +# CONFIG_FONT_8x16 is not set
1108 +CONFIG_FONT_6x11=y
1109 +# CONFIG_FONT_7x14 is not set
1110 +# CONFIG_FONT_PEARL_8x8 is not set
1111 +# CONFIG_FONT_ACORN_8x8 is not set
1112 +# CONFIG_FONT_MINI_4x6 is not set
1113 +# CONFIG_FONT_SUN8x16 is not set
1114 +# CONFIG_FONT_SUN12x22 is not set
1115 +# CONFIG_FONT_10x18 is not set
1116 +# CONFIG_LOGO is not set
1117 +
1118 +#
1119 +# Sound
1120 +#
1121 +CONFIG_SOUND=y
1122 +
1123 +#
1124 +# Advanced Linux Sound Architecture
1125 +#
1126 +CONFIG_SND=m
1127 +CONFIG_SND_TIMER=m
1128 +CONFIG_SND_PCM=m
1129 +CONFIG_SND_RAWMIDI=m
1130 +# CONFIG_SND_SEQUENCER is not set
1131 +CONFIG_SND_OSSEMUL=y
1132 +CONFIG_SND_MIXER_OSS=m
1133 +CONFIG_SND_PCM_OSS=m
1134 +CONFIG_SND_PCM_OSS_PLUGINS=y
1135 +# CONFIG_SND_DYNAMIC_MINORS is not set
1136 +CONFIG_SND_SUPPORT_OLD_API=y
1137 +CONFIG_SND_VERBOSE_PROCFS=y
1138 +# CONFIG_SND_VERBOSE_PRINTK is not set
1139 +# CONFIG_SND_DEBUG is not set
1140 +
1141 +#
1142 +# Generic devices
1143 +#
1144 +# CONFIG_SND_DUMMY is not set
1145 +# CONFIG_SND_MTPAV is not set
1146 +# CONFIG_SND_SERIAL_U16550 is not set
1147 +# CONFIG_SND_MPU401 is not set
1148 +
1149 +#
1150 +# ALSA ARM devices
1151 +#
1152 +
1153 +#
1154 +# SPI devices
1155 +#
1156 +
1157 +#
1158 +# USB devices
1159 +#
1160 +# CONFIG_SND_USB_AUDIO is not set
1161 +# CONFIG_SND_USB_CAIAQ is not set
1162 +
1163 +#
1164 +# System on Chip audio support
1165 +#
1166 +CONFIG_SND_SOC=m
1167 +CONFIG_SND_S3C24XX_SOC=m
1168 +
1169 +#
1170 +# SoC Audio support for SuperH
1171 +#
1172 +
1173 +#
1174 +# Open Sound System
1175 +#
1176 +# CONFIG_SOUND_PRIME is not set
1177 +CONFIG_HID_SUPPORT=y
1178 +CONFIG_HID=y
1179 +# CONFIG_HID_DEBUG is not set
1180 +# CONFIG_HIDRAW is not set
1181 +
1182 +#
1183 +# USB Input Devices
1184 +#
1185 +CONFIG_USB_HID=y
1186 +# CONFIG_USB_HIDINPUT_POWERBOOK is not set
1187 +# CONFIG_HID_FF is not set
1188 +CONFIG_USB_HIDDEV=y
1189 +CONFIG_USB_SUPPORT=y
1190 +CONFIG_USB_ARCH_HAS_HCD=y
1191 +CONFIG_USB_ARCH_HAS_OHCI=y
1192 +# CONFIG_USB_ARCH_HAS_EHCI is not set
1193 +CONFIG_USB=y
1194 +# CONFIG_USB_DEBUG is not set
1195 +
1196 +#
1197 +# Miscellaneous USB options
1198 +#
1199 +CONFIG_USB_DEVICEFS=y
1200 +CONFIG_USB_DEVICE_CLASS=y
1201 +# CONFIG_USB_DYNAMIC_MINORS is not set
1202 +CONFIG_USB_SUSPEND=y
1203 +# CONFIG_USB_PERSIST is not set
1204 +# CONFIG_USB_OTG is not set
1205 +
1206 +#
1207 +# USB Host Controller Drivers
1208 +#
1209 +# CONFIG_USB_ISP116X_HCD is not set
1210 +CONFIG_USB_OHCI_HCD=m
1211 +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
1212 +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
1213 +CONFIG_USB_OHCI_LITTLE_ENDIAN=y
1214 +# CONFIG_USB_SL811_HCD is not set
1215 +# CONFIG_USB_R8A66597_HCD is not set
1216 +
1217 +#
1218 +# USB Device Class drivers
1219 +#
1220 +CONFIG_USB_ACM=m
1221 +CONFIG_USB_PRINTER=m
1222 +
1223 +#
1224 +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
1225 +#
1226 +
1227 +#
1228 +# may also be needed; see USB_STORAGE Help for more information
1229 +#
1230 +CONFIG_USB_STORAGE=m
1231 +# CONFIG_USB_STORAGE_DEBUG is not set
1232 +CONFIG_USB_STORAGE_DATAFAB=y
1233 +CONFIG_USB_STORAGE_FREECOM=y
1234 +# CONFIG_USB_STORAGE_ISD200 is not set
1235 +CONFIG_USB_STORAGE_DPCM=y
1236 +CONFIG_USB_STORAGE_USBAT=y
1237 +CONFIG_USB_STORAGE_SDDR09=y
1238 +CONFIG_USB_STORAGE_SDDR55=y
1239 +CONFIG_USB_STORAGE_JUMPSHOT=y
1240 +CONFIG_USB_STORAGE_ALAUDA=y
1241 +CONFIG_USB_STORAGE_KARMA=y
1242 +CONFIG_USB_LIBUSUAL=y
1243 +
1244 +#
1245 +# USB Imaging devices
1246 +#
1247 +# CONFIG_USB_MDC800 is not set
1248 +# CONFIG_USB_MICROTEK is not set
1249 +CONFIG_USB_MON=y
1250 +
1251 +#
1252 +# USB port drivers
1253 +#
1254 +
1255 +#
1256 +# USB Serial Converter support
1257 +#
1258 +CONFIG_USB_SERIAL=m
1259 +CONFIG_USB_SERIAL_GENERIC=y
1260 +CONFIG_USB_SERIAL_AIRCABLE=m
1261 +CONFIG_USB_SERIAL_AIRPRIME=m
1262 +CONFIG_USB_SERIAL_ARK3116=m
1263 +CONFIG_USB_SERIAL_BELKIN=m
1264 +# CONFIG_USB_SERIAL_CH341 is not set
1265 +CONFIG_USB_SERIAL_WHITEHEAT=m
1266 +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
1267 +CONFIG_USB_SERIAL_CP2101=m
1268 +CONFIG_USB_SERIAL_CYPRESS_M8=m
1269 +CONFIG_USB_SERIAL_EMPEG=m
1270 +CONFIG_USB_SERIAL_FTDI_SIO=m
1271 +CONFIG_USB_SERIAL_FUNSOFT=m
1272 +CONFIG_USB_SERIAL_VISOR=m
1273 +CONFIG_USB_SERIAL_IPAQ=m
1274 +CONFIG_USB_SERIAL_IR=m
1275 +CONFIG_USB_SERIAL_EDGEPORT=m
1276 +CONFIG_USB_SERIAL_EDGEPORT_TI=m
1277 +CONFIG_USB_SERIAL_GARMIN=m
1278 +CONFIG_USB_SERIAL_IPW=m
1279 +CONFIG_USB_SERIAL_KEYSPAN_PDA=m
1280 +CONFIG_USB_SERIAL_KEYSPAN=m
1281 +CONFIG_USB_SERIAL_KEYSPAN_MPR=y
1282 +CONFIG_USB_SERIAL_KEYSPAN_USA28=y
1283 +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
1284 +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
1285 +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
1286 +CONFIG_USB_SERIAL_KEYSPAN_USA19=y
1287 +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
1288 +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
1289 +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
1290 +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
1291 +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
1292 +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
1293 +CONFIG_USB_SERIAL_KLSI=m
1294 +CONFIG_USB_SERIAL_KOBIL_SCT=m
1295 +CONFIG_USB_SERIAL_MCT_U232=m
1296 +CONFIG_USB_SERIAL_MOS7720=m
1297 +CONFIG_USB_SERIAL_MOS7840=m
1298 +CONFIG_USB_SERIAL_NAVMAN=m
1299 +CONFIG_USB_SERIAL_PL2303=m
1300 +# CONFIG_USB_SERIAL_OTI6858 is not set
1301 +CONFIG_USB_SERIAL_HP4X=m
1302 +CONFIG_USB_SERIAL_SAFE=m
1303 +CONFIG_USB_SERIAL_SAFE_PADDED=y
1304 +CONFIG_USB_SERIAL_SIERRAWIRELESS=m
1305 +CONFIG_USB_SERIAL_TI=m
1306 +CONFIG_USB_SERIAL_CYBERJACK=m
1307 +CONFIG_USB_SERIAL_XIRCOM=m
1308 +CONFIG_USB_SERIAL_OPTION=m
1309 +CONFIG_USB_SERIAL_OMNINET=m
1310 +# CONFIG_USB_SERIAL_DEBUG is not set
1311 +CONFIG_USB_EZUSB=y
1312 +
1313 +#
1314 +# USB Miscellaneous drivers
1315 +#
1316 +# CONFIG_USB_EMI62 is not set
1317 +# CONFIG_USB_EMI26 is not set
1318 +# CONFIG_USB_ADUTUX is not set
1319 +# CONFIG_USB_AUERSWALD is not set
1320 +# CONFIG_USB_RIO500 is not set
1321 +# CONFIG_USB_LEGOTOWER is not set
1322 +# CONFIG_USB_LCD is not set
1323 +# CONFIG_USB_BERRY_CHARGE is not set
1324 +# CONFIG_USB_LED is not set
1325 +# CONFIG_USB_CYPRESS_CY7C63 is not set
1326 +# CONFIG_USB_CYTHERM is not set
1327 +# CONFIG_USB_PHIDGET is not set
1328 +# CONFIG_USB_IDMOUSE is not set
1329 +# CONFIG_USB_FTDI_ELAN is not set
1330 +# CONFIG_USB_APPLEDISPLAY is not set
1331 +# CONFIG_USB_LD is not set
1332 +# CONFIG_USB_TRANCEVIBRATOR is not set
1333 +# CONFIG_USB_IOWARRIOR is not set
1334 +# CONFIG_USB_TEST is not set
1335 +
1336 +#
1337 +# USB DSL modem support
1338 +#
1339 +
1340 +#
1341 +# USB Gadget Support
1342 +#
1343 +CONFIG_USB_GADGET=y
1344 +# CONFIG_USB_GADGET_DEBUG is not set
1345 +# CONFIG_USB_GADGET_DEBUG_FILES is not set
1346 +CONFIG_USB_GADGET_SELECTED=y
1347 +# CONFIG_USB_GADGET_AMD5536UDC is not set
1348 +# CONFIG_USB_GADGET_ATMEL_USBA is not set
1349 +# CONFIG_USB_GADGET_FSL_USB2 is not set
1350 +# CONFIG_USB_GADGET_NET2280 is not set
1351 +# CONFIG_USB_GADGET_PXA2XX is not set
1352 +# CONFIG_USB_GADGET_M66592 is not set
1353 +# CONFIG_USB_GADGET_GOKU is not set
1354 +# CONFIG_USB_GADGET_LH7A40X is not set
1355 +# CONFIG_USB_GADGET_OMAP is not set
1356 +CONFIG_USB_GADGET_S3C2410=y
1357 +CONFIG_USB_S3C2410=y
1358 +# CONFIG_USB_S3C2410_DEBUG is not set
1359 +# CONFIG_USB_GADGET_AT91 is not set
1360 +# CONFIG_USB_GADGET_DUMMY_HCD is not set
1361 +# CONFIG_USB_GADGET_DUALSPEED is not set
1362 +# CONFIG_USB_ZERO is not set
1363 +CONFIG_USB_ETH=y
1364 +CONFIG_USB_ETH_RNDIS=y
1365 +# CONFIG_USB_GADGETFS is not set
1366 +# CONFIG_USB_FILE_STORAGE is not set
1367 +# CONFIG_USB_G_SERIAL is not set
1368 +CONFIG_USB_MIDI_GADGET=m
1369 +
1370 +#
1371 +# SDIO support
1372 +#
1373 +# CONFIG_SDIO is not set
1374 +CONFIG_MMC=y
1375 +# CONFIG_MMC_DEBUG is not set
1376 +CONFIG_MMC_UNSAFE_RESUME=y
1377 +
1378 +#
1379 +# MMC/SD Card Drivers
1380 +#
1381 +CONFIG_MMC_BLOCK=y
1382 +CONFIG_MMC_BLOCK_BOUNCE=y
1383 +CONFIG_SDIO_UART=m
1384 +
1385 +#
1386 +# MMC/SD Host Controller Drivers
1387 +#
1388 +# CONFIG_MMC_SPI is not set
1389 +CONFIG_MMC_S3C=y
1390 +CONFIG_NEW_LEDS=y
1391 +CONFIG_LEDS_CLASS=y
1392 +
1393 +#
1394 +# LED drivers
1395 +#
1396 +CONFIG_LEDS_S3C24XX=m
1397 +# CONFIG_LEDS_GPIO is not set
1398 +
1399 +#
1400 +# LED Triggers
1401 +#
1402 +CONFIG_LEDS_TRIGGERS=y
1403 +CONFIG_LEDS_TRIGGER_TIMER=y
1404 +# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
1405 +CONFIG_RTC_LIB=y
1406 +CONFIG_RTC_CLASS=y
1407 +CONFIG_RTC_HCTOSYS=y
1408 +CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
1409 +CONFIG_RTC_DEBUG=y
1410 +
1411 +#
1412 +# RTC interfaces
1413 +#
1414 +CONFIG_RTC_INTF_SYSFS=y
1415 +CONFIG_RTC_INTF_PROC=y
1416 +CONFIG_RTC_INTF_DEV=y
1417 +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
1418 +# CONFIG_RTC_DRV_TEST is not set
1419 +
1420 +#
1421 +# I2C RTC drivers
1422 +#
1423 +# CONFIG_RTC_DRV_DS1307 is not set
1424 +# CONFIG_RTC_DRV_DS1374 is not set
1425 +# CONFIG_RTC_DRV_DS1672 is not set
1426 +# CONFIG_RTC_DRV_MAX6900 is not set
1427 +# CONFIG_RTC_DRV_RS5C372 is not set
1428 +# CONFIG_RTC_DRV_ISL1208 is not set
1429 +# CONFIG_RTC_DRV_X1205 is not set
1430 +# CONFIG_RTC_DRV_PCF8563 is not set
1431 +# CONFIG_RTC_DRV_PCF8583 is not set
1432 +# CONFIG_RTC_DRV_M41T80 is not set
1433 +
1434 +#
1435 +# SPI RTC drivers
1436 +#
1437 +# CONFIG_RTC_DRV_RS5C348 is not set
1438 +# CONFIG_RTC_DRV_MAX6902 is not set
1439 +
1440 +#
1441 +# Platform RTC drivers
1442 +#
1443 +# CONFIG_RTC_DRV_CMOS is not set
1444 +# CONFIG_RTC_DRV_DS1553 is not set
1445 +# CONFIG_RTC_DRV_STK17TA8 is not set
1446 +# CONFIG_RTC_DRV_DS1742 is not set
1447 +# CONFIG_RTC_DRV_M48T86 is not set
1448 +# CONFIG_RTC_DRV_M48T59 is not set
1449 +# CONFIG_RTC_DRV_V3020 is not set
1450 +
1451 +#
1452 +# on-CPU RTC drivers
1453 +#
1454 +CONFIG_RTC_DRV_S3C=m
1455 +
1456 +#
1457 +# File systems
1458 +#
1459 +CONFIG_EXT2_FS=y
1460 +# CONFIG_EXT2_FS_XATTR is not set
1461 +# CONFIG_EXT2_FS_XIP is not set
1462 +CONFIG_EXT3_FS=y
1463 +# CONFIG_EXT3_FS_XATTR is not set
1464 +# CONFIG_EXT4DEV_FS is not set
1465 +CONFIG_JBD=y
1466 +# CONFIG_REISERFS_FS is not set
1467 +# CONFIG_JFS_FS is not set
1468 +CONFIG_FS_POSIX_ACL=y
1469 +# CONFIG_XFS_FS is not set
1470 +# CONFIG_GFS2_FS is not set
1471 +# CONFIG_OCFS2_FS is not set
1472 +# CONFIG_MINIX_FS is not set
1473 +CONFIG_ROMFS_FS=y
1474 +CONFIG_INOTIFY=y
1475 +CONFIG_INOTIFY_USER=y
1476 +# CONFIG_QUOTA is not set
1477 +CONFIG_DNOTIFY=y
1478 +# CONFIG_AUTOFS_FS is not set
1479 +CONFIG_AUTOFS4_FS=m
1480 +CONFIG_FUSE_FS=m
1481 +
1482 +#
1483 +# CD-ROM/DVD Filesystems
1484 +#
1485 +CONFIG_ISO9660_FS=m
1486 +CONFIG_JOLIET=y
1487 +# CONFIG_ZISOFS is not set
1488 +CONFIG_UDF_FS=m
1489 +CONFIG_UDF_NLS=y
1490 +
1491 +#
1492 +# DOS/FAT/NT Filesystems
1493 +#
1494 +CONFIG_FAT_FS=y
1495 +CONFIG_MSDOS_FS=y
1496 +CONFIG_VFAT_FS=y
1497 +CONFIG_FAT_DEFAULT_CODEPAGE=437
1498 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
1499 +# CONFIG_NTFS_FS is not set
1500 +
1501 +#
1502 +# Pseudo filesystems
1503 +#
1504 +CONFIG_PROC_FS=y
1505 +CONFIG_PROC_SYSCTL=y
1506 +CONFIG_SYSFS=y
1507 +CONFIG_TMPFS=y
1508 +# CONFIG_TMPFS_POSIX_ACL is not set
1509 +# CONFIG_HUGETLB_PAGE is not set
1510 +CONFIG_CONFIGFS_FS=m
1511 +
1512 +#
1513 +# Miscellaneous filesystems
1514 +#
1515 +# CONFIG_ADFS_FS is not set
1516 +# CONFIG_AFFS_FS is not set
1517 +# CONFIG_HFS_FS is not set
1518 +# CONFIG_HFSPLUS_FS is not set
1519 +# CONFIG_BEFS_FS is not set
1520 +# CONFIG_BFS_FS is not set
1521 +# CONFIG_EFS_FS is not set
1522 +CONFIG_JFFS2_FS=y
1523 +CONFIG_JFFS2_FS_DEBUG=0
1524 +CONFIG_JFFS2_FS_WRITEBUFFER=y
1525 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
1526 +CONFIG_JFFS2_SUMMARY=y
1527 +# CONFIG_JFFS2_FS_XATTR is not set
1528 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
1529 +CONFIG_JFFS2_ZLIB=y
1530 +# CONFIG_JFFS2_LZO is not set
1531 +CONFIG_JFFS2_RTIME=y
1532 +# CONFIG_JFFS2_RUBIN is not set
1533 +CONFIG_CRAMFS=y
1534 +# CONFIG_VXFS_FS is not set
1535 +# CONFIG_HPFS_FS is not set
1536 +# CONFIG_QNX4FS_FS is not set
1537 +# CONFIG_SYSV_FS is not set
1538 +# CONFIG_UFS_FS is not set
1539 +CONFIG_NETWORK_FILESYSTEMS=y
1540 +CONFIG_NFS_FS=y
1541 +CONFIG_NFS_V3=y
1542 +# CONFIG_NFS_V3_ACL is not set
1543 +CONFIG_NFS_V4=y
1544 +# CONFIG_NFS_DIRECTIO is not set
1545 +CONFIG_NFSD=m
1546 +CONFIG_NFSD_V3=y
1547 +# CONFIG_NFSD_V3_ACL is not set
1548 +CONFIG_NFSD_V4=y
1549 +CONFIG_NFSD_TCP=y
1550 +CONFIG_ROOT_NFS=y
1551 +CONFIG_LOCKD=y
1552 +CONFIG_LOCKD_V4=y
1553 +CONFIG_EXPORTFS=m
1554 +CONFIG_NFS_COMMON=y
1555 +CONFIG_SUNRPC=y
1556 +CONFIG_SUNRPC_GSS=y
1557 +# CONFIG_SUNRPC_BIND34 is not set
1558 +CONFIG_RPCSEC_GSS_KRB5=y
1559 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
1560 +# CONFIG_SMB_FS is not set
1561 +CONFIG_CIFS=m
1562 +# CONFIG_CIFS_STATS is not set
1563 +CONFIG_CIFS_WEAK_PW_HASH=y
1564 +# CONFIG_CIFS_XATTR is not set
1565 +# CONFIG_CIFS_DEBUG2 is not set
1566 +# CONFIG_CIFS_EXPERIMENTAL is not set
1567 +# CONFIG_NCP_FS is not set
1568 +# CONFIG_CODA_FS is not set
1569 +# CONFIG_AFS_FS is not set
1570 +
1571 +#
1572 +# Partition Types
1573 +#
1574 +# CONFIG_PARTITION_ADVANCED is not set
1575 +CONFIG_MSDOS_PARTITION=y
1576 +CONFIG_NLS=y
1577 +CONFIG_NLS_DEFAULT="iso8859-1"
1578 +CONFIG_NLS_CODEPAGE_437=y
1579 +# CONFIG_NLS_CODEPAGE_737 is not set
1580 +# CONFIG_NLS_CODEPAGE_775 is not set
1581 +CONFIG_NLS_CODEPAGE_850=m
1582 +# CONFIG_NLS_CODEPAGE_852 is not set
1583 +# CONFIG_NLS_CODEPAGE_855 is not set
1584 +# CONFIG_NLS_CODEPAGE_857 is not set
1585 +# CONFIG_NLS_CODEPAGE_860 is not set
1586 +# CONFIG_NLS_CODEPAGE_861 is not set
1587 +# CONFIG_NLS_CODEPAGE_862 is not set
1588 +# CONFIG_NLS_CODEPAGE_863 is not set
1589 +# CONFIG_NLS_CODEPAGE_864 is not set
1590 +# CONFIG_NLS_CODEPAGE_865 is not set
1591 +# CONFIG_NLS_CODEPAGE_866 is not set
1592 +# CONFIG_NLS_CODEPAGE_869 is not set
1593 +CONFIG_NLS_CODEPAGE_936=m
1594 +CONFIG_NLS_CODEPAGE_950=m
1595 +# CONFIG_NLS_CODEPAGE_932 is not set
1596 +# CONFIG_NLS_CODEPAGE_949 is not set
1597 +# CONFIG_NLS_CODEPAGE_874 is not set
1598 +# CONFIG_NLS_ISO8859_8 is not set
1599 +# CONFIG_NLS_CODEPAGE_1250 is not set
1600 +# CONFIG_NLS_CODEPAGE_1251 is not set
1601 +# CONFIG_NLS_ASCII is not set
1602 +CONFIG_NLS_ISO8859_1=y
1603 +# CONFIG_NLS_ISO8859_2 is not set
1604 +# CONFIG_NLS_ISO8859_3 is not set
1605 +# CONFIG_NLS_ISO8859_4 is not set
1606 +# CONFIG_NLS_ISO8859_5 is not set
1607 +# CONFIG_NLS_ISO8859_6 is not set
1608 +# CONFIG_NLS_ISO8859_7 is not set
1609 +# CONFIG_NLS_ISO8859_9 is not set
1610 +# CONFIG_NLS_ISO8859_13 is not set
1611 +# CONFIG_NLS_ISO8859_14 is not set
1612 +# CONFIG_NLS_ISO8859_15 is not set
1613 +# CONFIG_NLS_KOI8_R is not set
1614 +# CONFIG_NLS_KOI8_U is not set
1615 +CONFIG_NLS_UTF8=m
1616 +# CONFIG_DLM is not set
1617 +CONFIG_INSTRUMENTATION=y
1618 +CONFIG_PROFILING=y
1619 +CONFIG_OPROFILE=m
1620 +# CONFIG_MARKERS is not set
1621 +
1622 +#
1623 +# Kernel hacking
1624 +#
1625 +# CONFIG_PRINTK_TIME is not set
1626 +CONFIG_ENABLE_WARN_DEPRECATED=y
1627 +CONFIG_ENABLE_MUST_CHECK=y
1628 +CONFIG_MAGIC_SYSRQ=y
1629 +# CONFIG_UNUSED_SYMBOLS is not set
1630 +# CONFIG_DEBUG_FS is not set
1631 +# CONFIG_HEADERS_CHECK is not set
1632 +CONFIG_DEBUG_KERNEL=y
1633 +# CONFIG_DEBUG_SHIRQ is not set
1634 +CONFIG_DETECT_SOFTLOCKUP=y
1635 +# CONFIG_SCHED_DEBUG is not set
1636 +# CONFIG_SCHEDSTATS is not set
1637 +CONFIG_TIMER_STATS=y
1638 +# CONFIG_DEBUG_SLAB is not set
1639 +CONFIG_DEBUG_PREEMPT=y
1640 +# CONFIG_DEBUG_RT_MUTEXES is not set
1641 +# CONFIG_RT_MUTEX_TESTER is not set
1642 +# CONFIG_DEBUG_SPINLOCK is not set
1643 +# CONFIG_DEBUG_MUTEXES is not set
1644 +# CONFIG_DEBUG_LOCK_ALLOC is not set
1645 +# CONFIG_PROVE_LOCKING is not set
1646 +# CONFIG_LOCK_STAT is not set
1647 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
1648 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
1649 +# CONFIG_DEBUG_KOBJECT is not set
1650 +CONFIG_DEBUG_BUGVERBOSE=y
1651 +CONFIG_DEBUG_INFO=y
1652 +# CONFIG_DEBUG_VM is not set
1653 +# CONFIG_DEBUG_LIST is not set
1654 +# CONFIG_DEBUG_SG is not set
1655 +CONFIG_FRAME_POINTER=y
1656 +CONFIG_FORCED_INLINING=y
1657 +# CONFIG_BOOT_PRINTK_DELAY is not set
1658 +# CONFIG_RCU_TORTURE_TEST is not set
1659 +# CONFIG_FAULT_INJECTION is not set
1660 +# CONFIG_SAMPLES is not set
1661 +# CONFIG_DEBUG_USER is not set
1662 +CONFIG_DEBUG_ERRORS=y
1663 +# CONFIG_DEBUG_LL is not set
1664 +CONFIG_DEBUG_S3C_UART=2
1665 +
1666 +#
1667 +# Security options
1668 +#
1669 +# CONFIG_KEYS is not set
1670 +# CONFIG_SECURITY is not set
1671 +# CONFIG_SECURITY_FILE_CAPABILITIES is not set
1672 +CONFIG_CRYPTO=y
1673 +CONFIG_CRYPTO_ALGAPI=y
1674 +CONFIG_CRYPTO_BLKCIPHER=y
1675 +CONFIG_CRYPTO_HASH=y
1676 +CONFIG_CRYPTO_MANAGER=y
1677 +CONFIG_CRYPTO_HMAC=y
1678 +CONFIG_CRYPTO_XCBC=m
1679 +CONFIG_CRYPTO_NULL=m
1680 +CONFIG_CRYPTO_MD4=m
1681 +CONFIG_CRYPTO_MD5=y
1682 +CONFIG_CRYPTO_SHA1=m
1683 +CONFIG_CRYPTO_SHA256=m
1684 +CONFIG_CRYPTO_SHA512=m
1685 +CONFIG_CRYPTO_WP512=m
1686 +CONFIG_CRYPTO_TGR192=m
1687 +CONFIG_CRYPTO_GF128MUL=m
1688 +CONFIG_CRYPTO_ECB=m
1689 +CONFIG_CRYPTO_CBC=y
1690 +CONFIG_CRYPTO_PCBC=m
1691 +CONFIG_CRYPTO_LRW=m
1692 +# CONFIG_CRYPTO_XTS is not set
1693 +# CONFIG_CRYPTO_CRYPTD is not set
1694 +CONFIG_CRYPTO_DES=y
1695 +CONFIG_CRYPTO_FCRYPT=m
1696 +CONFIG_CRYPTO_BLOWFISH=m
1697 +CONFIG_CRYPTO_TWOFISH=m
1698 +CONFIG_CRYPTO_TWOFISH_COMMON=m
1699 +CONFIG_CRYPTO_SERPENT=m
1700 +CONFIG_CRYPTO_AES=m
1701 +CONFIG_CRYPTO_CAST5=m
1702 +CONFIG_CRYPTO_CAST6=m
1703 +CONFIG_CRYPTO_TEA=m
1704 +CONFIG_CRYPTO_ARC4=m
1705 +CONFIG_CRYPTO_KHAZAD=m
1706 +CONFIG_CRYPTO_ANUBIS=m
1707 +# CONFIG_CRYPTO_SEED is not set
1708 +CONFIG_CRYPTO_DEFLATE=m
1709 +CONFIG_CRYPTO_MICHAEL_MIC=m
1710 +CONFIG_CRYPTO_CRC32C=m
1711 +CONFIG_CRYPTO_CAMELLIA=m
1712 +CONFIG_CRYPTO_TEST=m
1713 +# CONFIG_CRYPTO_AUTHENC is not set
1714 +CONFIG_CRYPTO_HW=y
1715 +
1716 +#
1717 +# Library routines
1718 +#
1719 +CONFIG_BITREVERSE=y
1720 +CONFIG_CRC_CCITT=m
1721 +CONFIG_CRC16=m
1722 +# CONFIG_CRC_ITU_T is not set
1723 +CONFIG_CRC32=y
1724 +# CONFIG_CRC7 is not set
1725 +CONFIG_LIBCRC32C=m
1726 +CONFIG_ZLIB_INFLATE=y
1727 +CONFIG_ZLIB_DEFLATE=y
1728 +CONFIG_TEXTSEARCH=y
1729 +CONFIG_TEXTSEARCH_KMP=m
1730 +CONFIG_TEXTSEARCH_BM=m
1731 +CONFIG_TEXTSEARCH_FSM=m
1732 +CONFIG_PLIST=y
1733 +CONFIG_HAS_IOMEM=y
1734 Index: linux-2.6.24.7/arch/arm/configs/gta02-moredrivers-defconfig
1735 ===================================================================
1736 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
1737 +++ linux-2.6.24.7/arch/arm/configs/gta02-moredrivers-defconfig 2008-12-11 22:46:48.000000000 +0100
1738 @@ -0,0 +1,1833 @@
1739 +#
1740 +# Automatically generated make config: don't edit
1741 +# Linux kernel version: 2.6.24
1742 +# Sat Mar 1 11:36:29 2008
1743 +#
1744 +CONFIG_ARM=y
1745 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
1746 +CONFIG_GENERIC_GPIO=y
1747 +# CONFIG_GENERIC_TIME is not set
1748 +# CONFIG_GENERIC_CLOCKEVENTS is not set
1749 +CONFIG_MMU=y
1750 +CONFIG_NO_IOPORT=y
1751 +CONFIG_GENERIC_HARDIRQS=y
1752 +CONFIG_STACKTRACE_SUPPORT=y
1753 +CONFIG_LOCKDEP_SUPPORT=y
1754 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
1755 +CONFIG_HARDIRQS_SW_RESEND=y
1756 +CONFIG_GENERIC_IRQ_PROBE=y
1757 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
1758 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
1759 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
1760 +CONFIG_GENERIC_HWEIGHT=y
1761 +CONFIG_GENERIC_CALIBRATE_DELAY=y
1762 +CONFIG_ZONE_DMA=y
1763 +CONFIG_FIQ=y
1764 +CONFIG_VECTORS_BASE=0xffff0000
1765 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
1766 +
1767 +#
1768 +# General setup
1769 +#
1770 +CONFIG_EXPERIMENTAL=y
1771 +CONFIG_BROKEN_ON_SMP=y
1772 +CONFIG_LOCK_KERNEL=y
1773 +CONFIG_INIT_ENV_ARG_LIMIT=32
1774 +CONFIG_LOCALVERSION="-mokodev"
1775 +# CONFIG_LOCALVERSION_AUTO is not set
1776 +CONFIG_SWAP=y
1777 +CONFIG_SYSVIPC=y
1778 +CONFIG_SYSVIPC_SYSCTL=y
1779 +# CONFIG_POSIX_MQUEUE is not set
1780 +# CONFIG_BSD_PROCESS_ACCT is not set
1781 +# CONFIG_TASKSTATS is not set
1782 +# CONFIG_USER_NS is not set
1783 +# CONFIG_PID_NS is not set
1784 +# CONFIG_AUDIT is not set
1785 +CONFIG_IKCONFIG=y
1786 +CONFIG_IKCONFIG_PROC=y
1787 +CONFIG_LOG_BUF_SHIFT=16
1788 +# CONFIG_CGROUPS is not set
1789 +CONFIG_FAIR_GROUP_SCHED=y
1790 +CONFIG_FAIR_USER_SCHED=y
1791 +# CONFIG_FAIR_CGROUP_SCHED is not set
1792 +# CONFIG_SYSFS_DEPRECATED is not set
1793 +# CONFIG_RELAY is not set
1794 +CONFIG_BLK_DEV_INITRD=y
1795 +CONFIG_INITRAMFS_SOURCE=""
1796 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
1797 +CONFIG_SYSCTL=y
1798 +# CONFIG_EMBEDDED is not set
1799 +CONFIG_UID16=y
1800 +CONFIG_SYSCTL_SYSCALL=y
1801 +CONFIG_KALLSYMS=y
1802 +CONFIG_KALLSYMS_ALL=y
1803 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
1804 +CONFIG_HOTPLUG=y
1805 +CONFIG_PRINTK=y
1806 +CONFIG_BUG=y
1807 +CONFIG_ELF_CORE=y
1808 +CONFIG_BASE_FULL=y
1809 +CONFIG_FUTEX=y
1810 +CONFIG_ANON_INODES=y
1811 +CONFIG_EPOLL=y
1812 +CONFIG_SIGNALFD=y
1813 +CONFIG_EVENTFD=y
1814 +CONFIG_SHMEM=y
1815 +CONFIG_VM_EVENT_COUNTERS=y
1816 +CONFIG_SLAB=y
1817 +# CONFIG_SLUB is not set
1818 +# CONFIG_SLOB is not set
1819 +CONFIG_SLABINFO=y
1820 +CONFIG_RT_MUTEXES=y
1821 +# CONFIG_TINY_SHMEM is not set
1822 +CONFIG_BASE_SMALL=0
1823 +CONFIG_MODULES=y
1824 +CONFIG_MODULE_UNLOAD=y
1825 +CONFIG_MODULE_FORCE_UNLOAD=y
1826 +# CONFIG_MODVERSIONS is not set
1827 +# CONFIG_MODULE_SRCVERSION_ALL is not set
1828 +CONFIG_KMOD=y
1829 +CONFIG_BLOCK=y
1830 +# CONFIG_LBD is not set
1831 +# CONFIG_BLK_DEV_IO_TRACE is not set
1832 +# CONFIG_LSF is not set
1833 +# CONFIG_BLK_DEV_BSG is not set
1834 +
1835 +#
1836 +# IO Schedulers
1837 +#
1838 +CONFIG_IOSCHED_NOOP=y
1839 +CONFIG_IOSCHED_AS=m
1840 +CONFIG_IOSCHED_DEADLINE=y
1841 +CONFIG_IOSCHED_CFQ=m
1842 +# CONFIG_DEFAULT_AS is not set
1843 +CONFIG_DEFAULT_DEADLINE=y
1844 +# CONFIG_DEFAULT_CFQ is not set
1845 +# CONFIG_DEFAULT_NOOP is not set
1846 +CONFIG_DEFAULT_IOSCHED="deadline"
1847 +
1848 +#
1849 +# System Type
1850 +#
1851 +# CONFIG_ARCH_AAEC2000 is not set
1852 +# CONFIG_ARCH_INTEGRATOR is not set
1853 +# CONFIG_ARCH_REALVIEW is not set
1854 +# CONFIG_ARCH_VERSATILE is not set
1855 +# CONFIG_ARCH_AT91 is not set
1856 +# CONFIG_ARCH_CLPS7500 is not set
1857 +# CONFIG_ARCH_CLPS711X is not set
1858 +# CONFIG_ARCH_CO285 is not set
1859 +# CONFIG_ARCH_EBSA110 is not set
1860 +# CONFIG_ARCH_EP93XX is not set
1861 +# CONFIG_ARCH_FOOTBRIDGE is not set
1862 +# CONFIG_ARCH_NETX is not set
1863 +# CONFIG_ARCH_H720X is not set
1864 +# CONFIG_ARCH_IMX is not set
1865 +# CONFIG_ARCH_IOP13XX is not set
1866 +# CONFIG_ARCH_IOP32X is not set
1867 +# CONFIG_ARCH_IOP33X is not set
1868 +# CONFIG_ARCH_IXP23XX is not set
1869 +# CONFIG_ARCH_IXP2000 is not set
1870 +# CONFIG_ARCH_IXP4XX is not set
1871 +# CONFIG_ARCH_L7200 is not set
1872 +# CONFIG_ARCH_KS8695 is not set
1873 +# CONFIG_ARCH_NS9XXX is not set
1874 +# CONFIG_ARCH_MXC is not set
1875 +# CONFIG_ARCH_PNX4008 is not set
1876 +# CONFIG_ARCH_PXA is not set
1877 +# CONFIG_ARCH_RPC is not set
1878 +# CONFIG_ARCH_SA1100 is not set
1879 +CONFIG_ARCH_S3C2410=y
1880 +# CONFIG_ARCH_SHARK is not set
1881 +# CONFIG_ARCH_LH7A40X is not set
1882 +# CONFIG_ARCH_DAVINCI is not set
1883 +# CONFIG_ARCH_OMAP is not set
1884 +CONFIG_PLAT_S3C24XX=y
1885 +CONFIG_CPU_S3C244X=y
1886 +CONFIG_S3C2410_DMA=y
1887 +# CONFIG_S3C2410_DMA_DEBUG is not set
1888 +CONFIG_MACH_SMDK=y
1889 +CONFIG_MACH_NEO1973=y
1890 +CONFIG_PLAT_S3C=y
1891 +CONFIG_CPU_LLSERIAL_S3C2410=y
1892 +CONFIG_CPU_LLSERIAL_S3C2440=y
1893 +
1894 +#
1895 +# Boot options
1896 +#
1897 +# CONFIG_S3C_BOOT_WATCHDOG is not set
1898 +# CONFIG_S3C_BOOT_ERROR_RESET is not set
1899 +
1900 +#
1901 +# Power management
1902 +#
1903 +# CONFIG_S3C2410_PM_DEBUG is not set
1904 +# CONFIG_S3C2410_PM_CHECK is not set
1905 +CONFIG_S3C_LOWLEVEL_UART_PORT=2
1906 +
1907 +#
1908 +# S3C2400 Machines
1909 +#
1910 +CONFIG_CPU_S3C2410=y
1911 +CONFIG_CPU_S3C2410_DMA=y
1912 +CONFIG_S3C2410_PM=y
1913 +CONFIG_S3C2410_GPIO=y
1914 +CONFIG_S3C2410_CLOCK=y
1915 +CONFIG_S3C2410_PWM=y
1916 +
1917 +#
1918 +# S3C2410 Machines
1919 +#
1920 +# CONFIG_ARCH_SMDK2410 is not set
1921 +# CONFIG_ARCH_H1940 is not set
1922 +# CONFIG_MACH_N30 is not set
1923 +# CONFIG_ARCH_BAST is not set
1924 +# CONFIG_MACH_OTOM is not set
1925 +# CONFIG_MACH_AML_M5900 is not set
1926 +# CONFIG_MACH_VR1000 is not set
1927 +CONFIG_MACH_QT2410=y
1928 +CONFIG_MACH_NEO1973_GTA01=y
1929 +
1930 +#
1931 +# S3C2412 Machines
1932 +#
1933 +# CONFIG_MACH_SMDK2413 is not set
1934 +# CONFIG_MACH_SMDK2412 is not set
1935 +# CONFIG_MACH_VSTMS is not set
1936 +CONFIG_CPU_S3C2440=y
1937 +CONFIG_S3C2440_DMA=y
1938 +CONFIG_S3C2440_C_FIQ=y
1939 +
1940 +#
1941 +# S3C2440 Machines
1942 +#
1943 +# CONFIG_MACH_ANUBIS is not set
1944 +# CONFIG_MACH_OSIRIS is not set
1945 +# CONFIG_MACH_RX3715 is not set
1946 +CONFIG_ARCH_S3C2440=y
1947 +# CONFIG_MACH_NEXCODER_2440 is not set
1948 +CONFIG_SMDK2440_CPU2440=y
1949 +CONFIG_MACH_HXD8=y
1950 +CONFIG_MACH_NEO1973_GTA02=y
1951 +# CONFIG_NEO1973_GTA02_2440 is not set
1952 +CONFIG_CPU_S3C2442=y
1953 +
1954 +#
1955 +# S3C2442 Machines
1956 +#
1957 +CONFIG_SMDK2440_CPU2442=y
1958 +
1959 +#
1960 +# S3C2443 Machines
1961 +#
1962 +# CONFIG_MACH_SMDK2443 is not set
1963 +
1964 +#
1965 +# Processor Type
1966 +#
1967 +CONFIG_CPU_32=y
1968 +CONFIG_CPU_ARM920T=y
1969 +CONFIG_CPU_32v4T=y
1970 +CONFIG_CPU_ABRT_EV4T=y
1971 +CONFIG_CPU_CACHE_V4WT=y
1972 +CONFIG_CPU_CACHE_VIVT=y
1973 +CONFIG_CPU_COPY_V4WB=y
1974 +CONFIG_CPU_TLB_V4WBI=y
1975 +CONFIG_CPU_CP15=y
1976 +CONFIG_CPU_CP15_MMU=y
1977 +
1978 +#
1979 +# Processor Features
1980 +#
1981 +CONFIG_ARM_THUMB=y
1982 +# CONFIG_CPU_ICACHE_DISABLE is not set
1983 +# CONFIG_CPU_DCACHE_DISABLE is not set
1984 +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
1985 +# CONFIG_OUTER_CACHE is not set
1986 +
1987 +#
1988 +# Bus support
1989 +#
1990 +# CONFIG_PCI_SYSCALL is not set
1991 +# CONFIG_ARCH_SUPPORTS_MSI is not set
1992 +# CONFIG_PCCARD is not set
1993 +
1994 +#
1995 +# Kernel Features
1996 +#
1997 +# CONFIG_TICK_ONESHOT is not set
1998 +CONFIG_PREEMPT=y
1999 +CONFIG_NO_IDLE_HZ=y
2000 +CONFIG_HZ=200
2001 +CONFIG_AEABI=y
2002 +CONFIG_OABI_COMPAT=y
2003 +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
2004 +CONFIG_SELECT_MEMORY_MODEL=y
2005 +CONFIG_FLATMEM_MANUAL=y
2006 +# CONFIG_DISCONTIGMEM_MANUAL is not set
2007 +# CONFIG_SPARSEMEM_MANUAL is not set
2008 +CONFIG_FLATMEM=y
2009 +CONFIG_FLAT_NODE_MEM_MAP=y
2010 +# CONFIG_SPARSEMEM_STATIC is not set
2011 +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
2012 +CONFIG_SPLIT_PTLOCK_CPUS=4096
2013 +# CONFIG_RESOURCES_64BIT is not set
2014 +CONFIG_ZONE_DMA_FLAG=1
2015 +CONFIG_BOUNCE=y
2016 +CONFIG_VIRT_TO_BUS=y
2017 +CONFIG_ALIGNMENT_TRAP=y
2018 +
2019 +#
2020 +# Boot options
2021 +#
2022 +CONFIG_ZBOOT_ROM_TEXT=0x0
2023 +CONFIG_ZBOOT_ROM_BSS=0x0
2024 +CONFIG_CMDLINE="unused -- bootloader passes ATAG list"
2025 +# CONFIG_XIP_KERNEL is not set
2026 +CONFIG_KEXEC=y
2027 +CONFIG_ATAGS_PROC=y
2028 +
2029 +#
2030 +# Floating point emulation
2031 +#
2032 +
2033 +#
2034 +# At least one emulation must be selected
2035 +#
2036 +CONFIG_FPE_NWFPE=y
2037 +# CONFIG_FPE_NWFPE_XP is not set
2038 +# CONFIG_FPE_FASTFPE is not set
2039 +
2040 +#
2041 +# Userspace binary formats
2042 +#
2043 +CONFIG_BINFMT_ELF=y
2044 +# CONFIG_BINFMT_AOUT is not set
2045 +# CONFIG_BINFMT_MISC is not set
2046 +
2047 +#
2048 +# Power management options
2049 +#
2050 +CONFIG_PM=y
2051 +CONFIG_PM_LEGACY=y
2052 +CONFIG_PM_DEBUG=y
2053 +CONFIG_PM_VERBOSE=y
2054 +CONFIG_PM_SLEEP=y
2055 +CONFIG_SUSPEND_UP_POSSIBLE=y
2056 +CONFIG_SUSPEND=y
2057 +CONFIG_APM_EMULATION=y
2058 +
2059 +#
2060 +# Networking
2061 +#
2062 +CONFIG_NET=y
2063 +
2064 +#
2065 +# Networking options
2066 +#
2067 +CONFIG_PACKET=y
2068 +CONFIG_PACKET_MMAP=y
2069 +CONFIG_UNIX=y
2070 +CONFIG_XFRM=y
2071 +# CONFIG_XFRM_USER is not set
2072 +# CONFIG_XFRM_SUB_POLICY is not set
2073 +CONFIG_XFRM_MIGRATE=y
2074 +CONFIG_NET_KEY=m
2075 +CONFIG_NET_KEY_MIGRATE=y
2076 +CONFIG_INET=y
2077 +CONFIG_IP_MULTICAST=y
2078 +CONFIG_IP_ADVANCED_ROUTER=y
2079 +CONFIG_ASK_IP_FIB_HASH=y
2080 +# CONFIG_IP_FIB_TRIE is not set
2081 +CONFIG_IP_FIB_HASH=y
2082 +CONFIG_IP_MULTIPLE_TABLES=y
2083 +# CONFIG_IP_ROUTE_MULTIPATH is not set
2084 +# CONFIG_IP_ROUTE_VERBOSE is not set
2085 +CONFIG_IP_PNP=y
2086 +# CONFIG_IP_PNP_DHCP is not set
2087 +# CONFIG_IP_PNP_BOOTP is not set
2088 +# CONFIG_IP_PNP_RARP is not set
2089 +CONFIG_NET_IPIP=m
2090 +CONFIG_NET_IPGRE=m
2091 +# CONFIG_NET_IPGRE_BROADCAST is not set
2092 +# CONFIG_IP_MROUTE is not set
2093 +# CONFIG_ARPD is not set
2094 +CONFIG_SYN_COOKIES=y
2095 +CONFIG_INET_AH=m
2096 +CONFIG_INET_ESP=m
2097 +CONFIG_INET_IPCOMP=m
2098 +CONFIG_INET_XFRM_TUNNEL=m
2099 +CONFIG_INET_TUNNEL=m
2100 +CONFIG_INET_XFRM_MODE_TRANSPORT=m
2101 +CONFIG_INET_XFRM_MODE_TUNNEL=m
2102 +CONFIG_INET_XFRM_MODE_BEET=m
2103 +# CONFIG_INET_LRO is not set
2104 +CONFIG_INET_DIAG=y
2105 +CONFIG_INET_TCP_DIAG=y
2106 +# CONFIG_TCP_CONG_ADVANCED is not set
2107 +CONFIG_TCP_CONG_CUBIC=y
2108 +CONFIG_DEFAULT_TCP_CONG="cubic"
2109 +CONFIG_TCP_MD5SIG=y
2110 +# CONFIG_IP_VS is not set
2111 +CONFIG_IPV6=m
2112 +# CONFIG_IPV6_PRIVACY is not set
2113 +# CONFIG_IPV6_ROUTER_PREF is not set
2114 +# CONFIG_IPV6_OPTIMISTIC_DAD is not set
2115 +CONFIG_INET6_AH=m
2116 +CONFIG_INET6_ESP=m
2117 +CONFIG_INET6_IPCOMP=m
2118 +# CONFIG_IPV6_MIP6 is not set
2119 +CONFIG_INET6_XFRM_TUNNEL=m
2120 +CONFIG_INET6_TUNNEL=m
2121 +CONFIG_INET6_XFRM_MODE_TRANSPORT=m
2122 +CONFIG_INET6_XFRM_MODE_TUNNEL=m
2123 +CONFIG_INET6_XFRM_MODE_BEET=m
2124 +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
2125 +CONFIG_IPV6_SIT=m
2126 +CONFIG_IPV6_TUNNEL=m
2127 +# CONFIG_IPV6_MULTIPLE_TABLES is not set
2128 +# CONFIG_NETWORK_SECMARK is not set
2129 +CONFIG_NETFILTER=y
2130 +# CONFIG_NETFILTER_DEBUG is not set
2131 +CONFIG_BRIDGE_NETFILTER=y
2132 +
2133 +#
2134 +# Core Netfilter Configuration
2135 +#
2136 +CONFIG_NETFILTER_NETLINK=m
2137 +CONFIG_NETFILTER_NETLINK_QUEUE=m
2138 +CONFIG_NETFILTER_NETLINK_LOG=m
2139 +CONFIG_NF_CONNTRACK_ENABLED=m
2140 +CONFIG_NF_CONNTRACK=m
2141 +CONFIG_NF_CT_ACCT=y
2142 +CONFIG_NF_CONNTRACK_MARK=y
2143 +CONFIG_NF_CONNTRACK_EVENTS=y
2144 +CONFIG_NF_CT_PROTO_GRE=m
2145 +CONFIG_NF_CT_PROTO_SCTP=m
2146 +# CONFIG_NF_CT_PROTO_UDPLITE is not set
2147 +# CONFIG_NF_CONNTRACK_AMANDA is not set
2148 +CONFIG_NF_CONNTRACK_FTP=m
2149 +CONFIG_NF_CONNTRACK_H323=m
2150 +CONFIG_NF_CONNTRACK_IRC=m
2151 +CONFIG_NF_CONNTRACK_NETBIOS_NS=m
2152 +CONFIG_NF_CONNTRACK_PPTP=m
2153 +CONFIG_NF_CONNTRACK_SANE=m
2154 +CONFIG_NF_CONNTRACK_SIP=m
2155 +CONFIG_NF_CONNTRACK_TFTP=m
2156 +CONFIG_NF_CT_NETLINK=m
2157 +CONFIG_NETFILTER_XTABLES=m
2158 +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
2159 +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
2160 +CONFIG_NETFILTER_XT_TARGET_DSCP=m
2161 +CONFIG_NETFILTER_XT_TARGET_MARK=m
2162 +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
2163 +CONFIG_NETFILTER_XT_TARGET_NFLOG=m
2164 +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
2165 +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
2166 +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
2167 +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
2168 +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
2169 +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
2170 +CONFIG_NETFILTER_XT_MATCH_DCCP=m
2171 +CONFIG_NETFILTER_XT_MATCH_DSCP=m
2172 +CONFIG_NETFILTER_XT_MATCH_ESP=m
2173 +CONFIG_NETFILTER_XT_MATCH_HELPER=m
2174 +CONFIG_NETFILTER_XT_MATCH_LENGTH=m
2175 +CONFIG_NETFILTER_XT_MATCH_LIMIT=m
2176 +CONFIG_NETFILTER_XT_MATCH_MAC=m
2177 +CONFIG_NETFILTER_XT_MATCH_MARK=m
2178 +CONFIG_NETFILTER_XT_MATCH_POLICY=m
2179 +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
2180 +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
2181 +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
2182 +CONFIG_NETFILTER_XT_MATCH_QUOTA=m
2183 +CONFIG_NETFILTER_XT_MATCH_REALM=m
2184 +CONFIG_NETFILTER_XT_MATCH_SCTP=m
2185 +CONFIG_NETFILTER_XT_MATCH_STATE=m
2186 +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
2187 +CONFIG_NETFILTER_XT_MATCH_STRING=m
2188 +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
2189 +# CONFIG_NETFILTER_XT_MATCH_TIME is not set
2190 +# CONFIG_NETFILTER_XT_MATCH_U32 is not set
2191 +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
2192 +
2193 +#
2194 +# IP: Netfilter Configuration
2195 +#
2196 +CONFIG_NF_CONNTRACK_IPV4=m
2197 +CONFIG_NF_CONNTRACK_PROC_COMPAT=y
2198 +# CONFIG_IP_NF_QUEUE is not set
2199 +CONFIG_IP_NF_IPTABLES=m
2200 +CONFIG_IP_NF_MATCH_IPRANGE=m
2201 +CONFIG_IP_NF_MATCH_TOS=m
2202 +# CONFIG_IP_NF_MATCH_RECENT is not set
2203 +CONFIG_IP_NF_MATCH_ECN=m
2204 +CONFIG_IP_NF_MATCH_AH=m
2205 +CONFIG_IP_NF_MATCH_TTL=m
2206 +CONFIG_IP_NF_MATCH_OWNER=m
2207 +CONFIG_IP_NF_MATCH_ADDRTYPE=m
2208 +CONFIG_IP_NF_FILTER=m
2209 +CONFIG_IP_NF_TARGET_REJECT=m
2210 +CONFIG_IP_NF_TARGET_LOG=m
2211 +CONFIG_IP_NF_TARGET_ULOG=m
2212 +CONFIG_NF_NAT=m
2213 +CONFIG_NF_NAT_NEEDED=y
2214 +CONFIG_IP_NF_TARGET_MASQUERADE=m
2215 +CONFIG_IP_NF_TARGET_REDIRECT=m
2216 +CONFIG_IP_NF_TARGET_NETMAP=m
2217 +CONFIG_IP_NF_TARGET_SAME=m
2218 +CONFIG_NF_NAT_SNMP_BASIC=m
2219 +CONFIG_NF_NAT_PROTO_GRE=m
2220 +CONFIG_NF_NAT_FTP=m
2221 +CONFIG_NF_NAT_IRC=m
2222 +CONFIG_NF_NAT_TFTP=m
2223 +# CONFIG_NF_NAT_AMANDA is not set
2224 +CONFIG_NF_NAT_PPTP=m
2225 +CONFIG_NF_NAT_H323=m
2226 +CONFIG_NF_NAT_SIP=m
2227 +CONFIG_IP_NF_MANGLE=m
2228 +CONFIG_IP_NF_TARGET_TOS=m
2229 +CONFIG_IP_NF_TARGET_ECN=m
2230 +CONFIG_IP_NF_TARGET_TTL=m
2231 +CONFIG_IP_NF_TARGET_CLUSTERIP=m
2232 +# CONFIG_IP_NF_RAW is not set
2233 +# CONFIG_IP_NF_ARPTABLES is not set
2234 +
2235 +#
2236 +# IPv6: Netfilter Configuration (EXPERIMENTAL)
2237 +#
2238 +CONFIG_NF_CONNTRACK_IPV6=m
2239 +# CONFIG_IP6_NF_QUEUE is not set
2240 +CONFIG_IP6_NF_IPTABLES=m
2241 +CONFIG_IP6_NF_MATCH_RT=m
2242 +CONFIG_IP6_NF_MATCH_OPTS=m
2243 +CONFIG_IP6_NF_MATCH_FRAG=m
2244 +CONFIG_IP6_NF_MATCH_HL=m
2245 +CONFIG_IP6_NF_MATCH_OWNER=m
2246 +CONFIG_IP6_NF_MATCH_IPV6HEADER=m
2247 +CONFIG_IP6_NF_MATCH_AH=m
2248 +CONFIG_IP6_NF_MATCH_MH=m
2249 +CONFIG_IP6_NF_MATCH_EUI64=m
2250 +CONFIG_IP6_NF_FILTER=m
2251 +CONFIG_IP6_NF_TARGET_LOG=m
2252 +CONFIG_IP6_NF_TARGET_REJECT=m
2253 +CONFIG_IP6_NF_MANGLE=m
2254 +CONFIG_IP6_NF_TARGET_HL=m
2255 +# CONFIG_IP6_NF_RAW is not set
2256 +
2257 +#
2258 +# Bridge: Netfilter Configuration
2259 +#
2260 +CONFIG_BRIDGE_NF_EBTABLES=m
2261 +CONFIG_BRIDGE_EBT_BROUTE=m
2262 +CONFIG_BRIDGE_EBT_T_FILTER=m
2263 +CONFIG_BRIDGE_EBT_T_NAT=m
2264 +CONFIG_BRIDGE_EBT_802_3=m
2265 +CONFIG_BRIDGE_EBT_AMONG=m
2266 +CONFIG_BRIDGE_EBT_ARP=m
2267 +CONFIG_BRIDGE_EBT_IP=m
2268 +CONFIG_BRIDGE_EBT_LIMIT=m
2269 +CONFIG_BRIDGE_EBT_MARK=m
2270 +CONFIG_BRIDGE_EBT_PKTTYPE=m
2271 +CONFIG_BRIDGE_EBT_STP=m
2272 +CONFIG_BRIDGE_EBT_VLAN=m
2273 +CONFIG_BRIDGE_EBT_ARPREPLY=m
2274 +CONFIG_BRIDGE_EBT_DNAT=m
2275 +CONFIG_BRIDGE_EBT_MARK_T=m
2276 +CONFIG_BRIDGE_EBT_REDIRECT=m
2277 +CONFIG_BRIDGE_EBT_SNAT=m
2278 +CONFIG_BRIDGE_EBT_LOG=m
2279 +CONFIG_BRIDGE_EBT_ULOG=m
2280 +# CONFIG_IP_DCCP is not set
2281 +# CONFIG_IP_SCTP is not set
2282 +# CONFIG_TIPC is not set
2283 +# CONFIG_ATM is not set
2284 +CONFIG_BRIDGE=y
2285 +# CONFIG_VLAN_8021Q is not set
2286 +# CONFIG_DECNET is not set
2287 +CONFIG_LLC=y
2288 +# CONFIG_LLC2 is not set
2289 +# CONFIG_IPX is not set
2290 +# CONFIG_ATALK is not set
2291 +# CONFIG_X25 is not set
2292 +# CONFIG_LAPB is not set
2293 +# CONFIG_ECONET is not set
2294 +# CONFIG_WAN_ROUTER is not set
2295 +CONFIG_NET_SCHED=y
2296 +
2297 +#
2298 +# Queueing/Scheduling
2299 +#
2300 +CONFIG_NET_SCH_CBQ=m
2301 +CONFIG_NET_SCH_HTB=m
2302 +CONFIG_NET_SCH_HFSC=m
2303 +CONFIG_NET_SCH_PRIO=m
2304 +# CONFIG_NET_SCH_RR is not set
2305 +CONFIG_NET_SCH_RED=m
2306 +CONFIG_NET_SCH_SFQ=m
2307 +CONFIG_NET_SCH_TEQL=m
2308 +CONFIG_NET_SCH_TBF=m
2309 +CONFIG_NET_SCH_GRED=m
2310 +CONFIG_NET_SCH_DSMARK=m
2311 +CONFIG_NET_SCH_NETEM=m
2312 +CONFIG_NET_SCH_INGRESS=m
2313 +
2314 +#
2315 +# Classification
2316 +#
2317 +CONFIG_NET_CLS=y
2318 +CONFIG_NET_CLS_BASIC=m
2319 +CONFIG_NET_CLS_TCINDEX=m
2320 +CONFIG_NET_CLS_ROUTE4=m
2321 +CONFIG_NET_CLS_ROUTE=y
2322 +CONFIG_NET_CLS_FW=m
2323 +CONFIG_NET_CLS_U32=m
2324 +CONFIG_CLS_U32_PERF=y
2325 +CONFIG_CLS_U32_MARK=y
2326 +CONFIG_NET_CLS_RSVP=m
2327 +CONFIG_NET_CLS_RSVP6=m
2328 +# CONFIG_NET_EMATCH is not set
2329 +# CONFIG_NET_CLS_ACT is not set
2330 +# CONFIG_NET_CLS_POLICE is not set
2331 +# CONFIG_NET_CLS_IND is not set
2332 +CONFIG_NET_SCH_FIFO=y
2333 +
2334 +#
2335 +# Network testing
2336 +#
2337 +# CONFIG_NET_PKTGEN is not set
2338 +# CONFIG_HAMRADIO is not set
2339 +# CONFIG_IRDA is not set
2340 +CONFIG_BT=y
2341 +CONFIG_BT_L2CAP=y
2342 +CONFIG_BT_SCO=y
2343 +CONFIG_BT_RFCOMM=y
2344 +CONFIG_BT_RFCOMM_TTY=y
2345 +CONFIG_BT_BNEP=y
2346 +CONFIG_BT_BNEP_MC_FILTER=y
2347 +CONFIG_BT_BNEP_PROTO_FILTER=y
2348 +CONFIG_BT_HIDP=y
2349 +
2350 +#
2351 +# Bluetooth device drivers
2352 +#
2353 +CONFIG_BT_HCIUSB=y
2354 +CONFIG_BT_HCIUSB_SCO=y
2355 +# CONFIG_BT_HCIBTSDIO is not set
2356 +# CONFIG_BT_HCIUART is not set
2357 +# CONFIG_BT_HCIBCM203X is not set
2358 +# CONFIG_BT_HCIBPA10X is not set
2359 +# CONFIG_BT_HCIBFUSB is not set
2360 +# CONFIG_BT_HCIVHCI is not set
2361 +# CONFIG_AF_RXRPC is not set
2362 +CONFIG_FIB_RULES=y
2363 +
2364 +#
2365 +# Wireless
2366 +#
2367 +# CONFIG_CFG80211 is not set
2368 +CONFIG_WIRELESS_EXT=y
2369 +# CONFIG_MAC80211 is not set
2370 +# CONFIG_IEEE80211 is not set
2371 +# CONFIG_RFKILL is not set
2372 +# CONFIG_NET_9P is not set
2373 +
2374 +#
2375 +# Device Drivers
2376 +#
2377 +
2378 +#
2379 +# Generic Driver Options
2380 +#
2381 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
2382 +CONFIG_STANDALONE=y
2383 +CONFIG_PREVENT_FIRMWARE_BUILD=y
2384 +CONFIG_FW_LOADER=m
2385 +# CONFIG_DEBUG_DRIVER is not set
2386 +# CONFIG_DEBUG_DEVRES is not set
2387 +# CONFIG_SYS_HYPERVISOR is not set
2388 +CONFIG_CONNECTOR=m
2389 +CONFIG_MTD=y
2390 +# CONFIG_MTD_DEBUG is not set
2391 +CONFIG_MTD_CONCAT=y
2392 +CONFIG_MTD_PARTITIONS=y
2393 +# CONFIG_MTD_REDBOOT_PARTS is not set
2394 +CONFIG_MTD_CMDLINE_PARTS=y
2395 +# CONFIG_MTD_AFS_PARTS is not set
2396 +
2397 +#
2398 +# User Modules And Translation Layers
2399 +#
2400 +CONFIG_MTD_CHAR=y
2401 +CONFIG_MTD_BLKDEVS=y
2402 +CONFIG_MTD_BLOCK=y
2403 +# CONFIG_FTL is not set
2404 +# CONFIG_NFTL is not set
2405 +# CONFIG_INFTL is not set
2406 +# CONFIG_RFD_FTL is not set
2407 +# CONFIG_SSFDC is not set
2408 +# CONFIG_MTD_OOPS is not set
2409 +
2410 +#
2411 +# RAM/ROM/Flash chip drivers
2412 +#
2413 +CONFIG_MTD_CFI=y
2414 +# CONFIG_MTD_JEDECPROBE is not set
2415 +CONFIG_MTD_GEN_PROBE=y
2416 +# CONFIG_MTD_CFI_ADV_OPTIONS is not set
2417 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
2418 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
2419 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
2420 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
2421 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
2422 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
2423 +CONFIG_MTD_CFI_I1=y
2424 +CONFIG_MTD_CFI_I2=y
2425 +# CONFIG_MTD_CFI_I4 is not set
2426 +# CONFIG_MTD_CFI_I8 is not set
2427 +CONFIG_MTD_CFI_INTELEXT=y
2428 +# CONFIG_MTD_CFI_AMDSTD is not set
2429 +# CONFIG_MTD_CFI_STAA is not set
2430 +CONFIG_MTD_CFI_UTIL=y
2431 +# CONFIG_MTD_RAM is not set
2432 +CONFIG_MTD_ROM=y
2433 +CONFIG_MTD_ABSENT=y
2434 +
2435 +#
2436 +# Mapping drivers for chip access
2437 +#
2438 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
2439 +CONFIG_MTD_PHYSMAP=y
2440 +CONFIG_MTD_PHYSMAP_START=0x0
2441 +CONFIG_MTD_PHYSMAP_LEN=0
2442 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2
2443 +# CONFIG_MTD_ARM_INTEGRATOR is not set
2444 +# CONFIG_MTD_PLATRAM is not set
2445 +
2446 +#
2447 +# Self-contained MTD device drivers
2448 +#
2449 +# CONFIG_MTD_DATAFLASH is not set
2450 +# CONFIG_MTD_M25P80 is not set
2451 +# CONFIG_MTD_SLRAM is not set
2452 +# CONFIG_MTD_PHRAM is not set
2453 +# CONFIG_MTD_MTDRAM is not set
2454 +# CONFIG_MTD_BLOCK2MTD is not set
2455 +
2456 +#
2457 +# Disk-On-Chip Device Drivers
2458 +#
2459 +# CONFIG_MTD_DOC2000 is not set
2460 +# CONFIG_MTD_DOC2001 is not set
2461 +# CONFIG_MTD_DOC2001PLUS is not set
2462 +CONFIG_MTD_NAND=y
2463 +CONFIG_MTD_NAND_VERIFY_WRITE=y
2464 +# CONFIG_MTD_NAND_ECC_SMC is not set
2465 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
2466 +CONFIG_MTD_NAND_IDS=y
2467 +CONFIG_MTD_NAND_S3C2410=y
2468 +# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
2469 +CONFIG_MTD_NAND_S3C2410_HWECC=y
2470 +# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
2471 +# CONFIG_MTD_NAND_DISKONCHIP is not set
2472 +# CONFIG_MTD_NAND_NANDSIM is not set
2473 +# CONFIG_MTD_NAND_PLATFORM is not set
2474 +# CONFIG_MTD_ALAUDA is not set
2475 +# CONFIG_MTD_ONENAND is not set
2476 +
2477 +#
2478 +# UBI - Unsorted block images
2479 +#
2480 +# CONFIG_MTD_UBI is not set
2481 +# CONFIG_PARPORT is not set
2482 +CONFIG_PNP=y
2483 +CONFIG_PNP_DEBUG=y
2484 +
2485 +#
2486 +# Protocols
2487 +#
2488 +# CONFIG_PNPACPI is not set
2489 +CONFIG_BLK_DEV=y
2490 +# CONFIG_BLK_DEV_COW_COMMON is not set
2491 +CONFIG_BLK_DEV_LOOP=m
2492 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
2493 +# CONFIG_BLK_DEV_NBD is not set
2494 +CONFIG_BLK_DEV_UB=m
2495 +CONFIG_BLK_DEV_RAM=y
2496 +CONFIG_BLK_DEV_RAM_COUNT=16
2497 +CONFIG_BLK_DEV_RAM_SIZE=4096
2498 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
2499 +# CONFIG_CDROM_PKTCDVD is not set
2500 +# CONFIG_ATA_OVER_ETH is not set
2501 +CONFIG_MISC_DEVICES=y
2502 +# CONFIG_EEPROM_93CX6 is not set
2503 +# CONFIG_IDE is not set
2504 +
2505 +#
2506 +# SCSI device support
2507 +#
2508 +# CONFIG_RAID_ATTRS is not set
2509 +CONFIG_SCSI=m
2510 +CONFIG_SCSI_DMA=y
2511 +# CONFIG_SCSI_TGT is not set
2512 +# CONFIG_SCSI_NETLINK is not set
2513 +CONFIG_SCSI_PROC_FS=y
2514 +
2515 +#
2516 +# SCSI support type (disk, tape, CD-ROM)
2517 +#
2518 +CONFIG_BLK_DEV_SD=m
2519 +# CONFIG_CHR_DEV_ST is not set
2520 +# CONFIG_CHR_DEV_OSST is not set
2521 +CONFIG_BLK_DEV_SR=m
2522 +# CONFIG_BLK_DEV_SR_VENDOR is not set
2523 +CONFIG_CHR_DEV_SG=m
2524 +# CONFIG_CHR_DEV_SCH is not set
2525 +
2526 +#
2527 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
2528 +#
2529 +# CONFIG_SCSI_MULTI_LUN is not set
2530 +# CONFIG_SCSI_CONSTANTS is not set
2531 +# CONFIG_SCSI_LOGGING is not set
2532 +CONFIG_SCSI_SCAN_ASYNC=y
2533 +CONFIG_SCSI_WAIT_SCAN=m
2534 +
2535 +#
2536 +# SCSI Transports
2537 +#
2538 +# CONFIG_SCSI_SPI_ATTRS is not set
2539 +# CONFIG_SCSI_FC_ATTRS is not set
2540 +# CONFIG_SCSI_ISCSI_ATTRS is not set
2541 +# CONFIG_SCSI_SAS_LIBSAS is not set
2542 +# CONFIG_SCSI_SRP_ATTRS is not set
2543 +CONFIG_SCSI_LOWLEVEL=y
2544 +# CONFIG_ISCSI_TCP is not set
2545 +# CONFIG_SCSI_DEBUG is not set
2546 +# CONFIG_ATA is not set
2547 +CONFIG_MD=y
2548 +# CONFIG_BLK_DEV_MD is not set
2549 +CONFIG_BLK_DEV_DM=m
2550 +# CONFIG_DM_DEBUG is not set
2551 +CONFIG_DM_CRYPT=m
2552 +CONFIG_DM_SNAPSHOT=m
2553 +# CONFIG_DM_MIRROR is not set
2554 +# CONFIG_DM_ZERO is not set
2555 +# CONFIG_DM_MULTIPATH is not set
2556 +# CONFIG_DM_DELAY is not set
2557 +# CONFIG_DM_UEVENT is not set
2558 +CONFIG_NETDEVICES=y
2559 +# CONFIG_NETDEVICES_MULTIQUEUE is not set
2560 +# CONFIG_DUMMY is not set
2561 +# CONFIG_BONDING is not set
2562 +# CONFIG_MACVLAN is not set
2563 +# CONFIG_EQUALIZER is not set
2564 +CONFIG_TUN=m
2565 +# CONFIG_VETH is not set
2566 +# CONFIG_NET_SB1000 is not set
2567 +# CONFIG_PHYLIB is not set
2568 +CONFIG_NET_ETHERNET=y
2569 +CONFIG_MII=y
2570 +# CONFIG_AX88796 is not set
2571 +# CONFIG_SMC91X is not set
2572 +# CONFIG_DM9000 is not set
2573 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
2574 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
2575 +# CONFIG_IBM_NEW_EMAC_TAH is not set
2576 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
2577 +CONFIG_NET_PCI=y
2578 +# CONFIG_B44 is not set
2579 +CONFIG_CS89x0=m
2580 +# CONFIG_NETDEV_1000 is not set
2581 +# CONFIG_NETDEV_10000 is not set
2582 +
2583 +#
2584 +# Wireless LAN
2585 +#
2586 +# CONFIG_WLAN_PRE80211 is not set
2587 +# CONFIG_WLAN_80211 is not set
2588 +
2589 +#
2590 +# USB Network Adapters
2591 +#
2592 +CONFIG_USB_CATC=m
2593 +CONFIG_USB_KAWETH=m
2594 +CONFIG_USB_PEGASUS=m
2595 +CONFIG_USB_RTL8150=m
2596 +CONFIG_USB_USBNET=y
2597 +CONFIG_USB_NET_AX8817X=m
2598 +CONFIG_USB_NET_CDCETHER=m
2599 +CONFIG_USB_NET_DM9601=m
2600 +CONFIG_USB_NET_GL620A=m
2601 +CONFIG_USB_NET_NET1080=m
2602 +CONFIG_USB_NET_PLUSB=m
2603 +CONFIG_USB_NET_MCS7830=m
2604 +CONFIG_USB_NET_RNDIS_HOST=m
2605 +CONFIG_USB_NET_CDC_SUBSET=m
2606 +CONFIG_USB_ALI_M5632=y
2607 +CONFIG_USB_AN2720=y
2608 +CONFIG_USB_BELKIN=y
2609 +CONFIG_USB_ARMLINUX=y
2610 +CONFIG_USB_EPSON2888=y
2611 +CONFIG_USB_KC2190=y
2612 +CONFIG_USB_NET_ZAURUS=m
2613 +# CONFIG_WAN is not set
2614 +CONFIG_PPP=m
2615 +CONFIG_PPP_MULTILINK=y
2616 +CONFIG_PPP_FILTER=y
2617 +CONFIG_PPP_ASYNC=m
2618 +CONFIG_PPP_SYNC_TTY=m
2619 +CONFIG_PPP_DEFLATE=m
2620 +CONFIG_PPP_BSDCOMP=m
2621 +CONFIG_PPP_MPPE=m
2622 +# CONFIG_PPPOE is not set
2623 +# CONFIG_PPPOL2TP is not set
2624 +# CONFIG_SLIP is not set
2625 +CONFIG_SLHC=m
2626 +# CONFIG_SHAPER is not set
2627 +# CONFIG_NETCONSOLE is not set
2628 +# CONFIG_NETPOLL is not set
2629 +# CONFIG_NET_POLL_CONTROLLER is not set
2630 +# CONFIG_ISDN is not set
2631 +
2632 +#
2633 +# Input device support
2634 +#
2635 +CONFIG_INPUT=y
2636 +# CONFIG_INPUT_FF_MEMLESS is not set
2637 +# CONFIG_INPUT_POLLDEV is not set
2638 +
2639 +#
2640 +# Userland interfaces
2641 +#
2642 +CONFIG_INPUT_MOUSEDEV=y
2643 +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
2644 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
2645 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
2646 +# CONFIG_INPUT_JOYDEV is not set
2647 +CONFIG_INPUT_EVDEV=y
2648 +# CONFIG_INPUT_EVBUG is not set
2649 +
2650 +#
2651 +# Input Device Drivers
2652 +#
2653 +CONFIG_INPUT_KEYBOARD=y
2654 +# CONFIG_KEYBOARD_ATKBD is not set
2655 +# CONFIG_KEYBOARD_SUNKBD is not set
2656 +# CONFIG_KEYBOARD_LKKBD is not set
2657 +# CONFIG_KEYBOARD_XTKBD is not set
2658 +# CONFIG_KEYBOARD_NEWTON is not set
2659 +CONFIG_KEYBOARD_STOWAWAY=m
2660 +CONFIG_KEYBOARD_GPIO=m
2661 +CONFIG_KEYBOARD_NEO1973=y
2662 +CONFIG_KEYBOARD_QT2410=y
2663 +CONFIG_INPUT_MOUSE=y
2664 +# CONFIG_MOUSE_PS2 is not set
2665 +# CONFIG_MOUSE_SERIAL is not set
2666 +# CONFIG_MOUSE_APPLETOUCH is not set
2667 +# CONFIG_MOUSE_VSXXXAA is not set
2668 +# CONFIG_MOUSE_GPIO is not set
2669 +# CONFIG_INPUT_JOYSTICK is not set
2670 +# CONFIG_INPUT_TABLET is not set
2671 +CONFIG_INPUT_TOUCHSCREEN=y
2672 +# CONFIG_TOUCHSCREEN_ADS7846 is not set
2673 +# CONFIG_TOUCHSCREEN_FUJITSU is not set
2674 +CONFIG_TOUCHSCREEN_S3C2410=y
2675 +# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
2676 +# CONFIG_TOUCHSCREEN_GUNZE is not set
2677 +# CONFIG_TOUCHSCREEN_ELO is not set
2678 +# CONFIG_TOUCHSCREEN_MTOUCH is not set
2679 +# CONFIG_TOUCHSCREEN_MK712 is not set
2680 +# CONFIG_TOUCHSCREEN_PENMOUNT is not set
2681 +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
2682 +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
2683 +# CONFIG_TOUCHSCREEN_UCB1400 is not set
2684 +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
2685 +CONFIG_INPUT_MISC=y
2686 +# CONFIG_INPUT_ATI_REMOTE is not set
2687 +# CONFIG_INPUT_ATI_REMOTE2 is not set
2688 +# CONFIG_INPUT_KEYSPAN_REMOTE is not set
2689 +# CONFIG_INPUT_POWERMATE is not set
2690 +# CONFIG_INPUT_YEALINK is not set
2691 +CONFIG_INPUT_UINPUT=m
2692 +CONFIG_INPUT_LIS302DL=y
2693 +
2694 +#
2695 +# Hardware I/O ports
2696 +#
2697 +CONFIG_SERIO=y
2698 +# CONFIG_SERIO_SERPORT is not set
2699 +# CONFIG_SERIO_RAW is not set
2700 +# CONFIG_GAMEPORT is not set
2701 +
2702 +#
2703 +# Character devices
2704 +#
2705 +CONFIG_VT=y
2706 +CONFIG_VT_CONSOLE=y
2707 +CONFIG_NR_TTY_DEVICES=4
2708 +CONFIG_HW_CONSOLE=y
2709 +CONFIG_VT_HW_CONSOLE_BINDING=y
2710 +# CONFIG_SERIAL_NONSTANDARD is not set
2711 +
2712 +#
2713 +# Serial drivers
2714 +#
2715 +# CONFIG_SERIAL_8250 is not set
2716 +
2717 +#
2718 +# Non-8250 serial port support
2719 +#
2720 +CONFIG_SERIAL_S3C2410=y
2721 +CONFIG_SERIAL_S3C2410_CONSOLE=y
2722 +CONFIG_SERIAL_CORE=y
2723 +CONFIG_SERIAL_CORE_CONSOLE=y
2724 +CONFIG_UNIX98_PTYS=y
2725 +# CONFIG_LEGACY_PTYS is not set
2726 +# CONFIG_IPMI_HANDLER is not set
2727 +# CONFIG_HW_RANDOM is not set
2728 +# CONFIG_NVRAM is not set
2729 +# CONFIG_R3964 is not set
2730 +# CONFIG_RAW_DRIVER is not set
2731 +# CONFIG_TCG_TPM is not set
2732 +CONFIG_I2C=y
2733 +CONFIG_I2C_BOARDINFO=y
2734 +CONFIG_I2C_CHARDEV=y
2735 +
2736 +#
2737 +# I2C Algorithms
2738 +#
2739 +# CONFIG_I2C_ALGOBIT is not set
2740 +# CONFIG_I2C_ALGOPCF is not set
2741 +# CONFIG_I2C_ALGOPCA is not set
2742 +
2743 +#
2744 +# I2C Hardware Bus support
2745 +#
2746 +# CONFIG_I2C_GPIO is not set
2747 +# CONFIG_I2C_OCORES is not set
2748 +# CONFIG_I2C_PARPORT_LIGHT is not set
2749 +CONFIG_I2C_S3C2410=y
2750 +# CONFIG_I2C_SIMTEC is not set
2751 +# CONFIG_I2C_TAOS_EVM is not set
2752 +# CONFIG_I2C_STUB is not set
2753 +# CONFIG_I2C_TINY_USB is not set
2754 +
2755 +#
2756 +# Miscellaneous I2C Chip support
2757 +#
2758 +# CONFIG_SENSORS_DS1337 is not set
2759 +# CONFIG_SENSORS_DS1374 is not set
2760 +# CONFIG_DS1682 is not set
2761 +# CONFIG_SENSORS_EEPROM is not set
2762 +CONFIG_SENSORS_PCF50606=y
2763 +CONFIG_SENSORS_PCF50633=y
2764 +# CONFIG_SENSORS_PCF8574 is not set
2765 +# CONFIG_SENSORS_PCA9539 is not set
2766 +# CONFIG_SENSORS_PCF8591 is not set
2767 +# CONFIG_SENSORS_MAX6875 is not set
2768 +# CONFIG_SENSORS_TSL2550 is not set
2769 +CONFIG_SENSORS_TSL256X=m
2770 +# CONFIG_I2C_DEBUG_CORE is not set
2771 +# CONFIG_I2C_DEBUG_ALGO is not set
2772 +# CONFIG_I2C_DEBUG_BUS is not set
2773 +# CONFIG_I2C_DEBUG_CHIP is not set
2774 +
2775 +#
2776 +# SPI support
2777 +#
2778 +CONFIG_SPI=y
2779 +# CONFIG_SPI_DEBUG is not set
2780 +CONFIG_SPI_MASTER=y
2781 +
2782 +#
2783 +# SPI Master Controller Drivers
2784 +#
2785 +CONFIG_SPI_BITBANG=y
2786 +# CONFIG_SPI_S3C24XX is not set
2787 +CONFIG_SPI_S3C24XX_GPIO=y
2788 +
2789 +#
2790 +# SPI Protocol Masters
2791 +#
2792 +# CONFIG_SPI_AT25 is not set
2793 +# CONFIG_SPI_SPIDEV is not set
2794 +# CONFIG_SPI_TLE62X0 is not set
2795 +# CONFIG_W1 is not set
2796 +CONFIG_POWER_SUPPLY=y
2797 +CONFIG_POWER_SUPPLY_DEBUG=y
2798 +CONFIG_PDA_POWER=y
2799 +CONFIG_APM_POWER=y
2800 +# CONFIG_BATTERY_DS2760 is not set
2801 +# CONFIG_BATTERY_GTA01 is not set
2802 +CONFIG_BATTERY_BQ27000_HDQ=y
2803 +CONFIG_GTA02_HDQ=y
2804 +CONFIG_HWMON=y
2805 +# CONFIG_HWMON_VID is not set
2806 +# CONFIG_SENSORS_AD7418 is not set
2807 +# CONFIG_SENSORS_ADM1021 is not set
2808 +# CONFIG_SENSORS_ADM1025 is not set
2809 +# CONFIG_SENSORS_ADM1026 is not set
2810 +# CONFIG_SENSORS_ADM1029 is not set
2811 +# CONFIG_SENSORS_ADM1031 is not set
2812 +# CONFIG_SENSORS_ADM9240 is not set
2813 +# CONFIG_SENSORS_ADT7470 is not set
2814 +# CONFIG_SENSORS_ATXP1 is not set
2815 +# CONFIG_SENSORS_DS1621 is not set
2816 +# CONFIG_SENSORS_F71805F is not set
2817 +# CONFIG_SENSORS_F71882FG is not set
2818 +# CONFIG_SENSORS_F75375S is not set
2819 +# CONFIG_SENSORS_GL518SM is not set
2820 +# CONFIG_SENSORS_GL520SM is not set
2821 +# CONFIG_SENSORS_IT87 is not set
2822 +# CONFIG_SENSORS_LM63 is not set
2823 +# CONFIG_SENSORS_LM70 is not set
2824 +# CONFIG_SENSORS_LM75 is not set
2825 +# CONFIG_SENSORS_LM77 is not set
2826 +# CONFIG_SENSORS_LM78 is not set
2827 +# CONFIG_SENSORS_LM80 is not set
2828 +# CONFIG_SENSORS_LM83 is not set
2829 +# CONFIG_SENSORS_LM85 is not set
2830 +# CONFIG_SENSORS_LM87 is not set
2831 +# CONFIG_SENSORS_LM90 is not set
2832 +# CONFIG_SENSORS_LM92 is not set
2833 +# CONFIG_SENSORS_LM93 is not set
2834 +# CONFIG_SENSORS_MAX1619 is not set
2835 +# CONFIG_SENSORS_MAX6650 is not set
2836 +# CONFIG_SENSORS_PC87360 is not set
2837 +# CONFIG_SENSORS_PC87427 is not set
2838 +# CONFIG_SENSORS_DME1737 is not set
2839 +# CONFIG_SENSORS_SMSC47M1 is not set
2840 +# CONFIG_SENSORS_SMSC47M192 is not set
2841 +# CONFIG_SENSORS_SMSC47B397 is not set
2842 +# CONFIG_SENSORS_THMC50 is not set
2843 +# CONFIG_SENSORS_VT1211 is not set
2844 +# CONFIG_SENSORS_W83781D is not set
2845 +# CONFIG_SENSORS_W83791D is not set
2846 +# CONFIG_SENSORS_W83792D is not set
2847 +# CONFIG_SENSORS_W83793 is not set
2848 +# CONFIG_SENSORS_W83L785TS is not set
2849 +# CONFIG_SENSORS_W83627HF is not set
2850 +# CONFIG_SENSORS_W83627EHF is not set
2851 +# CONFIG_HWMON_DEBUG_CHIP is not set
2852 +CONFIG_WATCHDOG=y
2853 +# CONFIG_WATCHDOG_NOWAYOUT is not set
2854 +
2855 +#
2856 +# Watchdog Device Drivers
2857 +#
2858 +# CONFIG_SOFT_WATCHDOG is not set
2859 +CONFIG_S3C2410_WATCHDOG=m
2860 +
2861 +#
2862 +# USB-based Watchdog Cards
2863 +#
2864 +# CONFIG_USBPCWATCHDOG is not set
2865 +
2866 +#
2867 +# Sonics Silicon Backplane
2868 +#
2869 +CONFIG_SSB_POSSIBLE=y
2870 +# CONFIG_SSB is not set
2871 +
2872 +#
2873 +# Multifunction device drivers
2874 +#
2875 +# CONFIG_MFD_SM501 is not set
2876 +CONFIG_MFD_GLAMO=y
2877 +CONFIG_MFD_GLAMO_FB=y
2878 +CONFIG_MFD_GLAMO_SPI_GPIO=y
2879 +CONFIG_MFD_GLAMO_SPI_FB=y
2880 +CONFIG_MFD_GLAMO_MCI=y
2881 +
2882 +#
2883 +# Multimedia devices
2884 +#
2885 +# CONFIG_VIDEO_DEV is not set
2886 +# CONFIG_DVB_CORE is not set
2887 +CONFIG_DAB=y
2888 +# CONFIG_USB_DABUSB is not set
2889 +
2890 +#
2891 +# Graphics support
2892 +#
2893 +# CONFIG_VGASTATE is not set
2894 +CONFIG_VIDEO_OUTPUT_CONTROL=y
2895 +CONFIG_FB=y
2896 +# CONFIG_FIRMWARE_EDID is not set
2897 +# CONFIG_FB_DDC is not set
2898 +CONFIG_FB_CFB_FILLRECT=y
2899 +CONFIG_FB_CFB_COPYAREA=y
2900 +CONFIG_FB_CFB_IMAGEBLIT=y
2901 +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
2902 +# CONFIG_FB_SYS_FILLRECT is not set
2903 +# CONFIG_FB_SYS_COPYAREA is not set
2904 +# CONFIG_FB_SYS_IMAGEBLIT is not set
2905 +# CONFIG_FB_SYS_FOPS is not set
2906 +CONFIG_FB_DEFERRED_IO=y
2907 +# CONFIG_FB_SVGALIB is not set
2908 +# CONFIG_FB_MACMODES is not set
2909 +# CONFIG_FB_BACKLIGHT is not set
2910 +# CONFIG_FB_MODE_HELPERS is not set
2911 +# CONFIG_FB_TILEBLITTING is not set
2912 +
2913 +#
2914 +# Frame buffer hardware drivers
2915 +#
2916 +# CONFIG_FB_UVESA is not set
2917 +# CONFIG_FB_S1D13XXX is not set
2918 +CONFIG_FB_S3C2410=y
2919 +# CONFIG_FB_S3C2410_DEBUG is not set
2920 +# CONFIG_FB_VIRTUAL is not set
2921 +CONFIG_BACKLIGHT_LCD_SUPPORT=y
2922 +CONFIG_LCD_CLASS_DEVICE=y
2923 +CONFIG_LCD_LTV350QV=y
2924 +CONFIG_BACKLIGHT_CLASS_DEVICE=y
2925 +# CONFIG_BACKLIGHT_CORGI is not set
2926 +CONFIG_BACKLIGHT_GTA01=y
2927 +
2928 +#
2929 +# Display device support
2930 +#
2931 +CONFIG_DISPLAY_SUPPORT=y
2932 +
2933 +#
2934 +# Display hardware drivers
2935 +#
2936 +CONFIG_DISPLAY_JBT6K74=y
2937 +
2938 +#
2939 +# Console display driver support
2940 +#
2941 +# CONFIG_VGA_CONSOLE is not set
2942 +CONFIG_DUMMY_CONSOLE=y
2943 +CONFIG_FRAMEBUFFER_CONSOLE=y
2944 +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
2945 +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
2946 +CONFIG_FONTS=y
2947 +# CONFIG_FONT_8x8 is not set
2948 +# CONFIG_FONT_8x16 is not set
2949 +CONFIG_FONT_6x11=y
2950 +# CONFIG_FONT_7x14 is not set
2951 +# CONFIG_FONT_PEARL_8x8 is not set
2952 +# CONFIG_FONT_ACORN_8x8 is not set
2953 +# CONFIG_FONT_MINI_4x6 is not set
2954 +# CONFIG_FONT_SUN8x16 is not set
2955 +# CONFIG_FONT_SUN12x22 is not set
2956 +# CONFIG_FONT_10x18 is not set
2957 +# CONFIG_LOGO is not set
2958 +
2959 +#
2960 +# Sound
2961 +#
2962 +CONFIG_SOUND=y
2963 +
2964 +#
2965 +# Advanced Linux Sound Architecture
2966 +#
2967 +CONFIG_SND=y
2968 +CONFIG_SND_TIMER=y
2969 +CONFIG_SND_PCM=y
2970 +CONFIG_SND_HWDEP=y
2971 +CONFIG_SND_RAWMIDI=y
2972 +# CONFIG_SND_SEQUENCER is not set
2973 +CONFIG_SND_OSSEMUL=y
2974 +CONFIG_SND_MIXER_OSS=y
2975 +CONFIG_SND_PCM_OSS=y
2976 +CONFIG_SND_PCM_OSS_PLUGINS=y
2977 +# CONFIG_SND_DYNAMIC_MINORS is not set
2978 +CONFIG_SND_SUPPORT_OLD_API=y
2979 +CONFIG_SND_VERBOSE_PROCFS=y
2980 +# CONFIG_SND_VERBOSE_PRINTK is not set
2981 +# CONFIG_SND_DEBUG is not set
2982 +
2983 +#
2984 +# Generic devices
2985 +#
2986 +# CONFIG_SND_DUMMY is not set
2987 +# CONFIG_SND_MTPAV is not set
2988 +# CONFIG_SND_SERIAL_U16550 is not set
2989 +# CONFIG_SND_MPU401 is not set
2990 +
2991 +#
2992 +# ALSA ARM devices
2993 +#
2994 +
2995 +#
2996 +# SPI devices
2997 +#
2998 +
2999 +#
3000 +# USB devices
3001 +#
3002 +CONFIG_SND_USB_AUDIO=m
3003 +# CONFIG_SND_USB_CAIAQ is not set
3004 +
3005 +#
3006 +# System on Chip audio support
3007 +#
3008 +CONFIG_SND_SOC=y
3009 +CONFIG_SND_S3C24XX_SOC=y
3010 +CONFIG_SND_S3C24XX_SOC_I2S=y
3011 +# CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753 is not set
3012 +CONFIG_SND_S3C24XX_SOC_NEO1973_GTA02_WM8753=y
3013 +
3014 +#
3015 +# SoC Audio support for SuperH
3016 +#
3017 +CONFIG_SND_SOC_WM8753=y
3018 +
3019 +#
3020 +# Open Sound System
3021 +#
3022 +# CONFIG_SOUND_PRIME is not set
3023 +CONFIG_HID_SUPPORT=y
3024 +CONFIG_HID=y
3025 +# CONFIG_HID_DEBUG is not set
3026 +# CONFIG_HIDRAW is not set
3027 +
3028 +#
3029 +# USB Input Devices
3030 +#
3031 +CONFIG_USB_HID=y
3032 +# CONFIG_USB_HIDINPUT_POWERBOOK is not set
3033 +# CONFIG_HID_FF is not set
3034 +CONFIG_USB_HIDDEV=y
3035 +CONFIG_USB_SUPPORT=y
3036 +CONFIG_USB_ARCH_HAS_HCD=y
3037 +CONFIG_USB_ARCH_HAS_OHCI=y
3038 +# CONFIG_USB_ARCH_HAS_EHCI is not set
3039 +CONFIG_USB=y
3040 +# CONFIG_USB_DEBUG is not set
3041 +
3042 +#
3043 +# Miscellaneous USB options
3044 +#
3045 +CONFIG_USB_DEVICEFS=y
3046 +CONFIG_USB_DEVICE_CLASS=y
3047 +# CONFIG_USB_DYNAMIC_MINORS is not set
3048 +CONFIG_USB_SUSPEND=y
3049 +CONFIG_USB_PERSIST=y
3050 +# CONFIG_USB_OTG is not set
3051 +
3052 +#
3053 +# USB Host Controller Drivers
3054 +#
3055 +# CONFIG_USB_ISP116X_HCD is not set
3056 +CONFIG_USB_OHCI_HCD=y
3057 +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
3058 +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
3059 +CONFIG_USB_OHCI_LITTLE_ENDIAN=y
3060 +# CONFIG_USB_SL811_HCD is not set
3061 +# CONFIG_USB_R8A66597_HCD is not set
3062 +
3063 +#
3064 +# USB Device Class drivers
3065 +#
3066 +CONFIG_USB_ACM=m
3067 +CONFIG_USB_PRINTER=m
3068 +
3069 +#
3070 +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
3071 +#
3072 +
3073 +#
3074 +# may also be needed; see USB_STORAGE Help for more information
3075 +#
3076 +CONFIG_USB_STORAGE=m
3077 +# CONFIG_USB_STORAGE_DEBUG is not set
3078 +CONFIG_USB_STORAGE_DATAFAB=y
3079 +CONFIG_USB_STORAGE_FREECOM=y
3080 +# CONFIG_USB_STORAGE_ISD200 is not set
3081 +CONFIG_USB_STORAGE_DPCM=y
3082 +CONFIG_USB_STORAGE_USBAT=y
3083 +CONFIG_USB_STORAGE_SDDR09=y
3084 +CONFIG_USB_STORAGE_SDDR55=y
3085 +CONFIG_USB_STORAGE_JUMPSHOT=y
3086 +CONFIG_USB_STORAGE_ALAUDA=y
3087 +CONFIG_USB_STORAGE_KARMA=y
3088 +CONFIG_USB_LIBUSUAL=y
3089 +
3090 +#
3091 +# USB Imaging devices
3092 +#
3093 +# CONFIG_USB_MDC800 is not set
3094 +# CONFIG_USB_MICROTEK is not set
3095 +CONFIG_USB_MON=y
3096 +
3097 +#
3098 +# USB port drivers
3099 +#
3100 +
3101 +#
3102 +# USB Serial Converter support
3103 +#
3104 +CONFIG_USB_SERIAL=y
3105 +CONFIG_USB_SERIAL_GENERIC=y
3106 +CONFIG_USB_SERIAL_AIRCABLE=m
3107 +CONFIG_USB_SERIAL_AIRPRIME=m
3108 +CONFIG_USB_SERIAL_ARK3116=m
3109 +CONFIG_USB_SERIAL_BELKIN=m
3110 +# CONFIG_USB_SERIAL_CH341 is not set
3111 +CONFIG_USB_SERIAL_WHITEHEAT=m
3112 +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
3113 +CONFIG_USB_SERIAL_CP2101=m
3114 +CONFIG_USB_SERIAL_CYPRESS_M8=m
3115 +CONFIG_USB_SERIAL_EMPEG=m
3116 +CONFIG_USB_SERIAL_FTDI_SIO=m
3117 +CONFIG_USB_SERIAL_FUNSOFT=m
3118 +CONFIG_USB_SERIAL_VISOR=m
3119 +CONFIG_USB_SERIAL_IPAQ=m
3120 +CONFIG_USB_SERIAL_IR=m
3121 +CONFIG_USB_SERIAL_EDGEPORT=m
3122 +CONFIG_USB_SERIAL_EDGEPORT_TI=m
3123 +CONFIG_USB_SERIAL_GARMIN=m
3124 +CONFIG_USB_SERIAL_IPW=m
3125 +CONFIG_USB_SERIAL_KEYSPAN_PDA=m
3126 +CONFIG_USB_SERIAL_KEYSPAN=m
3127 +CONFIG_USB_SERIAL_KEYSPAN_MPR=y
3128 +CONFIG_USB_SERIAL_KEYSPAN_USA28=y
3129 +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
3130 +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
3131 +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
3132 +CONFIG_USB_SERIAL_KEYSPAN_USA19=y
3133 +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
3134 +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
3135 +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
3136 +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
3137 +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
3138 +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
3139 +CONFIG_USB_SERIAL_KLSI=m
3140 +CONFIG_USB_SERIAL_KOBIL_SCT=m
3141 +CONFIG_USB_SERIAL_MCT_U232=m
3142 +CONFIG_USB_SERIAL_MOS7720=m
3143 +CONFIG_USB_SERIAL_MOS7840=m
3144 +CONFIG_USB_SERIAL_NAVMAN=m
3145 +CONFIG_USB_SERIAL_PL2303=m
3146 +# CONFIG_USB_SERIAL_OTI6858 is not set
3147 +CONFIG_USB_SERIAL_HP4X=m
3148 +CONFIG_USB_SERIAL_SAFE=m
3149 +CONFIG_USB_SERIAL_SAFE_PADDED=y
3150 +CONFIG_USB_SERIAL_SIERRAWIRELESS=m
3151 +CONFIG_USB_SERIAL_TI=m
3152 +CONFIG_USB_SERIAL_CYBERJACK=m
3153 +CONFIG_USB_SERIAL_XIRCOM=m
3154 +CONFIG_USB_SERIAL_OPTION=y
3155 +CONFIG_USB_SERIAL_OMNINET=m
3156 +# CONFIG_USB_SERIAL_DEBUG is not set
3157 +CONFIG_USB_EZUSB=y
3158 +
3159 +#
3160 +# USB Miscellaneous drivers
3161 +#
3162 +# CONFIG_USB_EMI62 is not set
3163 +# CONFIG_USB_EMI26 is not set
3164 +# CONFIG_USB_ADUTUX is not set
3165 +# CONFIG_USB_AUERSWALD is not set
3166 +# CONFIG_USB_RIO500 is not set
3167 +# CONFIG_USB_LEGOTOWER is not set
3168 +# CONFIG_USB_LCD is not set
3169 +CONFIG_USB_BERRY_CHARGE=m
3170 +# CONFIG_USB_LED is not set
3171 +# CONFIG_USB_CYPRESS_CY7C63 is not set
3172 +# CONFIG_USB_CYTHERM is not set
3173 +# CONFIG_USB_PHIDGET is not set
3174 +# CONFIG_USB_IDMOUSE is not set
3175 +# CONFIG_USB_FTDI_ELAN is not set
3176 +# CONFIG_USB_APPLEDISPLAY is not set
3177 +# CONFIG_USB_LD is not set
3178 +CONFIG_USB_TRANCEVIBRATOR=m
3179 +CONFIG_USB_IOWARRIOR=m
3180 +# CONFIG_USB_TEST is not set
3181 +
3182 +#
3183 +# USB DSL modem support
3184 +#
3185 +
3186 +#
3187 +# USB Gadget Support
3188 +#
3189 +CONFIG_USB_GADGET=y
3190 +# CONFIG_USB_GADGET_DEBUG is not set
3191 +# CONFIG_USB_GADGET_DEBUG_FILES is not set
3192 +# CONFIG_USB_GADGET_DEBUG_FS is not set
3193 +CONFIG_USB_GADGET_SELECTED=y
3194 +# CONFIG_USB_GADGET_AMD5536UDC is not set
3195 +# CONFIG_USB_GADGET_ATMEL_USBA is not set
3196 +# CONFIG_USB_GADGET_FSL_USB2 is not set
3197 +# CONFIG_USB_GADGET_NET2280 is not set
3198 +# CONFIG_USB_GADGET_PXA2XX is not set
3199 +# CONFIG_USB_GADGET_M66592 is not set
3200 +# CONFIG_USB_GADGET_GOKU is not set
3201 +# CONFIG_USB_GADGET_LH7A40X is not set
3202 +# CONFIG_USB_GADGET_OMAP is not set
3203 +CONFIG_USB_GADGET_S3C2410=y
3204 +CONFIG_USB_S3C2410=y
3205 +# CONFIG_USB_S3C2410_DEBUG is not set
3206 +# CONFIG_USB_GADGET_AT91 is not set
3207 +# CONFIG_USB_GADGET_DUMMY_HCD is not set
3208 +# CONFIG_USB_GADGET_DUALSPEED is not set
3209 +# CONFIG_USB_ZERO is not set
3210 +CONFIG_USB_ETH=y
3211 +CONFIG_USB_ETH_RNDIS=y
3212 +# CONFIG_USB_GADGETFS is not set
3213 +# CONFIG_USB_FILE_STORAGE is not set
3214 +# CONFIG_USB_G_SERIAL is not set
3215 +# CONFIG_USB_MIDI_GADGET is not set
3216 +
3217 +#
3218 +# SDIO support
3219 +#
3220 +CONFIG_SDIO=y
3221 +CONFIG_SDIO_S3C24XX=y
3222 +CONFIG_SDIO_S3C24XX_DMA=y
3223 +CONFIG_SDIO_AR6000_WLAN=y
3224 +CONFIG_MMC=y
3225 +# CONFIG_MMC_DEBUG is not set
3226 +CONFIG_MMC_UNSAFE_RESUME=y
3227 +
3228 +#
3229 +# MMC/SD Card Drivers
3230 +#
3231 +CONFIG_MMC_BLOCK=y
3232 +# CONFIG_MMC_BLOCK_BOUNCE is not set
3233 +# CONFIG_SDIO_UART is not set
3234 +
3235 +#
3236 +# MMC/SD Host Controller Drivers
3237 +#
3238 +# CONFIG_MMC_SPI is not set
3239 +# CONFIG_MMC_S3C is not set
3240 +CONFIG_NEW_LEDS=y
3241 +CONFIG_LEDS_CLASS=y
3242 +
3243 +#
3244 +# LED drivers
3245 +#
3246 +CONFIG_LEDS_S3C24XX=m
3247 +CONFIG_LEDS_GPIO=y
3248 +CONFIG_LEDS_NEO1973_VIBRATOR=y
3249 +CONFIG_LEDS_NEO1973_GTA02=y
3250 +
3251 +#
3252 +# LED Triggers
3253 +#
3254 +CONFIG_LEDS_TRIGGERS=y
3255 +CONFIG_LEDS_TRIGGER_TIMER=y
3256 +# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
3257 +CONFIG_RTC_LIB=y
3258 +CONFIG_RTC_CLASS=y
3259 +CONFIG_RTC_HCTOSYS=y
3260 +CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
3261 +CONFIG_RTC_DEBUG=y
3262 +
3263 +#
3264 +# RTC interfaces
3265 +#
3266 +CONFIG_RTC_INTF_SYSFS=y
3267 +CONFIG_RTC_INTF_PROC=y
3268 +CONFIG_RTC_INTF_DEV=y
3269 +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
3270 +# CONFIG_RTC_DRV_TEST is not set
3271 +
3272 +#
3273 +# I2C RTC drivers
3274 +#
3275 +# CONFIG_RTC_DRV_DS1307 is not set
3276 +# CONFIG_RTC_DRV_DS1374 is not set
3277 +# CONFIG_RTC_DRV_DS1672 is not set
3278 +# CONFIG_RTC_DRV_MAX6900 is not set
3279 +# CONFIG_RTC_DRV_RS5C372 is not set
3280 +# CONFIG_RTC_DRV_ISL1208 is not set
3281 +# CONFIG_RTC_DRV_X1205 is not set
3282 +# CONFIG_RTC_DRV_PCF8563 is not set
3283 +# CONFIG_RTC_DRV_PCF8583 is not set
3284 +# CONFIG_RTC_DRV_M41T80 is not set
3285 +
3286 +#
3287 +# SPI RTC drivers
3288 +#
3289 +# CONFIG_RTC_DRV_RS5C348 is not set
3290 +# CONFIG_RTC_DRV_MAX6902 is not set
3291 +
3292 +#
3293 +# Platform RTC drivers
3294 +#
3295 +# CONFIG_RTC_DRV_CMOS is not set
3296 +# CONFIG_RTC_DRV_DS1553 is not set
3297 +# CONFIG_RTC_DRV_STK17TA8 is not set
3298 +# CONFIG_RTC_DRV_DS1742 is not set
3299 +# CONFIG_RTC_DRV_M48T86 is not set
3300 +# CONFIG_RTC_DRV_M48T59 is not set
3301 +# CONFIG_RTC_DRV_V3020 is not set
3302 +
3303 +#
3304 +# on-CPU RTC drivers
3305 +#
3306 +CONFIG_RTC_DRV_S3C=m
3307 +
3308 +#
3309 +# File systems
3310 +#
3311 +CONFIG_EXT2_FS=y
3312 +# CONFIG_EXT2_FS_XATTR is not set
3313 +# CONFIG_EXT2_FS_XIP is not set
3314 +CONFIG_EXT3_FS=y
3315 +# CONFIG_EXT3_FS_XATTR is not set
3316 +# CONFIG_EXT4DEV_FS is not set
3317 +CONFIG_JBD=y
3318 +# CONFIG_JBD_DEBUG is not set
3319 +# CONFIG_REISERFS_FS is not set
3320 +# CONFIG_JFS_FS is not set
3321 +# CONFIG_FS_POSIX_ACL is not set
3322 +# CONFIG_XFS_FS is not set
3323 +# CONFIG_GFS2_FS is not set
3324 +# CONFIG_OCFS2_FS is not set
3325 +# CONFIG_MINIX_FS is not set
3326 +CONFIG_ROMFS_FS=y
3327 +CONFIG_INOTIFY=y
3328 +CONFIG_INOTIFY_USER=y
3329 +# CONFIG_QUOTA is not set
3330 +CONFIG_DNOTIFY=y
3331 +# CONFIG_AUTOFS_FS is not set
3332 +CONFIG_AUTOFS4_FS=m
3333 +CONFIG_FUSE_FS=m
3334 +
3335 +#
3336 +# CD-ROM/DVD Filesystems
3337 +#
3338 +CONFIG_ISO9660_FS=y
3339 +CONFIG_JOLIET=y
3340 +# CONFIG_ZISOFS is not set
3341 +CONFIG_UDF_FS=y
3342 +
3343 +#
3344 +# DOS/FAT/NT Filesystems
3345 +#
3346 +CONFIG_FAT_FS=y
3347 +CONFIG_MSDOS_FS=y
3348 +CONFIG_VFAT_FS=y
3349 +CONFIG_FAT_DEFAULT_CODEPAGE=437
3350 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
3351 +# CONFIG_NTFS_FS is not set
3352 +
3353 +#
3354 +# Pseudo filesystems
3355 +#
3356 +CONFIG_PROC_FS=y
3357 +CONFIG_PROC_SYSCTL=y
3358 +CONFIG_SYSFS=y
3359 +CONFIG_TMPFS=y
3360 +# CONFIG_TMPFS_POSIX_ACL is not set
3361 +# CONFIG_HUGETLB_PAGE is not set
3362 +CONFIG_CONFIGFS_FS=m
3363 +
3364 +#
3365 +# Miscellaneous filesystems
3366 +#
3367 +# CONFIG_ADFS_FS is not set
3368 +# CONFIG_AFFS_FS is not set
3369 +# CONFIG_HFS_FS is not set
3370 +# CONFIG_HFSPLUS_FS is not set
3371 +# CONFIG_BEFS_FS is not set
3372 +# CONFIG_BFS_FS is not set
3373 +# CONFIG_EFS_FS is not set
3374 +CONFIG_YAFFS_FS=y
3375 +CONFIG_YAFFS_YAFFS1=y
3376 +CONFIG_YAFFS_9BYTE_TAGS=y
3377 +CONFIG_YAFFS_YAFFS2=y
3378 +CONFIG_YAFFS_AUTO_YAFFS2=y
3379 +# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set
3380 +CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS=10
3381 +# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set
3382 +# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set
3383 +CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
3384 +CONFIG_JFFS2_FS=y
3385 +CONFIG_JFFS2_FS_DEBUG=0
3386 +CONFIG_JFFS2_FS_WRITEBUFFER=y
3387 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
3388 +CONFIG_JFFS2_SUMMARY=y
3389 +# CONFIG_JFFS2_FS_XATTR is not set
3390 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
3391 +CONFIG_JFFS2_ZLIB=y
3392 +# CONFIG_JFFS2_LZO is not set
3393 +CONFIG_JFFS2_RTIME=y
3394 +# CONFIG_JFFS2_RUBIN is not set
3395 +CONFIG_CRAMFS=y
3396 +# CONFIG_VXFS_FS is not set
3397 +# CONFIG_HPFS_FS is not set
3398 +# CONFIG_QNX4FS_FS is not set
3399 +# CONFIG_SYSV_FS is not set
3400 +# CONFIG_UFS_FS is not set
3401 +# CONFIG_NETWORK_FILESYSTEMS is not set
3402 +
3403 +#
3404 +# Partition Types
3405 +#
3406 +# CONFIG_PARTITION_ADVANCED is not set
3407 +CONFIG_MSDOS_PARTITION=y
3408 +CONFIG_NLS=y
3409 +CONFIG_NLS_DEFAULT="iso8859-1"
3410 +CONFIG_NLS_CODEPAGE_437=y
3411 +# CONFIG_NLS_CODEPAGE_737 is not set
3412 +# CONFIG_NLS_CODEPAGE_775 is not set
3413 +CONFIG_NLS_CODEPAGE_850=m
3414 +# CONFIG_NLS_CODEPAGE_852 is not set
3415 +# CONFIG_NLS_CODEPAGE_855 is not set
3416 +# CONFIG_NLS_CODEPAGE_857 is not set
3417 +# CONFIG_NLS_CODEPAGE_860 is not set
3418 +# CONFIG_NLS_CODEPAGE_861 is not set
3419 +# CONFIG_NLS_CODEPAGE_862 is not set
3420 +# CONFIG_NLS_CODEPAGE_863 is not set
3421 +# CONFIG_NLS_CODEPAGE_864 is not set
3422 +# CONFIG_NLS_CODEPAGE_865 is not set
3423 +# CONFIG_NLS_CODEPAGE_866 is not set
3424 +# CONFIG_NLS_CODEPAGE_869 is not set
3425 +CONFIG_NLS_CODEPAGE_936=m
3426 +CONFIG_NLS_CODEPAGE_950=m
3427 +# CONFIG_NLS_CODEPAGE_932 is not set
3428 +# CONFIG_NLS_CODEPAGE_949 is not set
3429 +# CONFIG_NLS_CODEPAGE_874 is not set
3430 +# CONFIG_NLS_ISO8859_8 is not set
3431 +# CONFIG_NLS_CODEPAGE_1250 is not set
3432 +# CONFIG_NLS_CODEPAGE_1251 is not set
3433 +# CONFIG_NLS_ASCII is not set
3434 +CONFIG_NLS_ISO8859_1=y
3435 +# CONFIG_NLS_ISO8859_2 is not set
3436 +# CONFIG_NLS_ISO8859_3 is not set
3437 +# CONFIG_NLS_ISO8859_4 is not set
3438 +# CONFIG_NLS_ISO8859_5 is not set
3439 +# CONFIG_NLS_ISO8859_6 is not set
3440 +# CONFIG_NLS_ISO8859_7 is not set
3441 +# CONFIG_NLS_ISO8859_9 is not set
3442 +# CONFIG_NLS_ISO8859_13 is not set
3443 +# CONFIG_NLS_ISO8859_14 is not set
3444 +# CONFIG_NLS_ISO8859_15 is not set
3445 +# CONFIG_NLS_KOI8_R is not set
3446 +# CONFIG_NLS_KOI8_U is not set
3447 +CONFIG_NLS_UTF8=m
3448 +# CONFIG_DLM is not set
3449 +CONFIG_INSTRUMENTATION=y
3450 +CONFIG_PROFILING=y
3451 +CONFIG_OPROFILE=m
3452 +CONFIG_MARKERS=y
3453 +
3454 +#
3455 +# Kernel hacking
3456 +#
3457 +CONFIG_PRINTK_TIME=y
3458 +CONFIG_ENABLE_WARN_DEPRECATED=y
3459 +CONFIG_ENABLE_MUST_CHECK=y
3460 +CONFIG_MAGIC_SYSRQ=y
3461 +# CONFIG_UNUSED_SYMBOLS is not set
3462 +CONFIG_DEBUG_FS=y
3463 +# CONFIG_HEADERS_CHECK is not set
3464 +CONFIG_DEBUG_KERNEL=y
3465 +CONFIG_DEBUG_SHIRQ=y
3466 +CONFIG_DETECT_SOFTLOCKUP=y
3467 +CONFIG_SCHED_DEBUG=y
3468 +# CONFIG_SCHEDSTATS is not set
3469 +CONFIG_TIMER_STATS=y
3470 +# CONFIG_DEBUG_SLAB is not set
3471 +CONFIG_DEBUG_PREEMPT=y
3472 +# CONFIG_DEBUG_RT_MUTEXES is not set
3473 +# CONFIG_RT_MUTEX_TESTER is not set
3474 +CONFIG_DEBUG_SPINLOCK=y
3475 +CONFIG_DEBUG_MUTEXES=y
3476 +CONFIG_DEBUG_LOCK_ALLOC=y
3477 +# CONFIG_PROVE_LOCKING is not set
3478 +CONFIG_LOCKDEP=y
3479 +CONFIG_LOCK_STAT=y
3480 +CONFIG_DEBUG_LOCKDEP=y
3481 +CONFIG_DEBUG_SPINLOCK_SLEEP=y
3482 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
3483 +CONFIG_STACKTRACE=y
3484 +# CONFIG_DEBUG_KOBJECT is not set
3485 +CONFIG_DEBUG_BUGVERBOSE=y
3486 +CONFIG_DEBUG_INFO=y
3487 +# CONFIG_DEBUG_VM is not set
3488 +# CONFIG_DEBUG_LIST is not set
3489 +CONFIG_DEBUG_SG=y
3490 +CONFIG_FRAME_POINTER=y
3491 +CONFIG_FORCED_INLINING=y
3492 +# CONFIG_BOOT_PRINTK_DELAY is not set
3493 +# CONFIG_RCU_TORTURE_TEST is not set
3494 +# CONFIG_FAULT_INJECTION is not set
3495 +# CONFIG_SAMPLES is not set
3496 +# CONFIG_DEBUG_USER is not set
3497 +CONFIG_DEBUG_ERRORS=y
3498 +# CONFIG_DEBUG_LL is not set
3499 +# CONFIG_DEBUG_ICEDCC is not set
3500 +# CONFIG_DEBUG_S3C_PORT is not set
3501 +CONFIG_DEBUG_S3C_UART=2
3502 +
3503 +#
3504 +# Security options
3505 +#
3506 +# CONFIG_KEYS is not set
3507 +# CONFIG_SECURITY is not set
3508 +# CONFIG_SECURITY_FILE_CAPABILITIES is not set
3509 +CONFIG_CRYPTO=y
3510 +CONFIG_CRYPTO_ALGAPI=y
3511 +CONFIG_CRYPTO_BLKCIPHER=y
3512 +CONFIG_CRYPTO_HASH=y
3513 +CONFIG_CRYPTO_MANAGER=y
3514 +CONFIG_CRYPTO_HMAC=y
3515 +CONFIG_CRYPTO_XCBC=m
3516 +CONFIG_CRYPTO_NULL=m
3517 +CONFIG_CRYPTO_MD4=m
3518 +CONFIG_CRYPTO_MD5=y
3519 +CONFIG_CRYPTO_SHA1=m
3520 +CONFIG_CRYPTO_SHA256=m
3521 +CONFIG_CRYPTO_SHA512=m
3522 +CONFIG_CRYPTO_WP512=m
3523 +CONFIG_CRYPTO_TGR192=m
3524 +CONFIG_CRYPTO_GF128MUL=m
3525 +CONFIG_CRYPTO_ECB=m
3526 +CONFIG_CRYPTO_CBC=y
3527 +CONFIG_CRYPTO_PCBC=m
3528 +CONFIG_CRYPTO_LRW=m
3529 +# CONFIG_CRYPTO_XTS is not set
3530 +# CONFIG_CRYPTO_CRYPTD is not set
3531 +CONFIG_CRYPTO_DES=y
3532 +CONFIG_CRYPTO_FCRYPT=m
3533 +CONFIG_CRYPTO_BLOWFISH=m
3534 +CONFIG_CRYPTO_TWOFISH=m
3535 +CONFIG_CRYPTO_TWOFISH_COMMON=m
3536 +CONFIG_CRYPTO_SERPENT=m
3537 +CONFIG_CRYPTO_AES=m
3538 +CONFIG_CRYPTO_CAST5=m
3539 +CONFIG_CRYPTO_CAST6=m
3540 +CONFIG_CRYPTO_TEA=m
3541 +CONFIG_CRYPTO_ARC4=m
3542 +CONFIG_CRYPTO_KHAZAD=m
3543 +CONFIG_CRYPTO_ANUBIS=m
3544 +# CONFIG_CRYPTO_SEED is not set
3545 +CONFIG_CRYPTO_DEFLATE=m
3546 +CONFIG_CRYPTO_MICHAEL_MIC=m
3547 +CONFIG_CRYPTO_CRC32C=m
3548 +CONFIG_CRYPTO_CAMELLIA=m
3549 +CONFIG_CRYPTO_TEST=m
3550 +# CONFIG_CRYPTO_AUTHENC is not set
3551 +CONFIG_CRYPTO_HW=y
3552 +
3553 +#
3554 +# Library routines
3555 +#
3556 +CONFIG_BITREVERSE=y
3557 +CONFIG_CRC_CCITT=m
3558 +CONFIG_CRC16=m
3559 +# CONFIG_CRC_ITU_T is not set
3560 +CONFIG_CRC32=y
3561 +# CONFIG_CRC7 is not set
3562 +CONFIG_LIBCRC32C=m
3563 +CONFIG_ZLIB_INFLATE=y
3564 +CONFIG_ZLIB_DEFLATE=y
3565 +CONFIG_TEXTSEARCH=y
3566 +CONFIG_TEXTSEARCH_KMP=m
3567 +CONFIG_TEXTSEARCH_BM=m
3568 +CONFIG_TEXTSEARCH_FSM=m
3569 +CONFIG_PLIST=y
3570 +CONFIG_HAS_IOMEM=y
3571 +CONFIG_HAS_DMA=y
3572 Index: linux-2.6.24.7/arch/arm/Kconfig
3573 ===================================================================
3574 --- linux-2.6.24.7.orig/arch/arm/Kconfig 2008-12-11 22:46:07.000000000 +0100
3575 +++ linux-2.6.24.7/arch/arm/Kconfig 2008-12-11 22:46:48.000000000 +0100
3576 @@ -865,6 +865,13 @@ config KEXEC
3577 initially work for you. It may help to enable device hotplugging
3578 support.
3579
3580 +config ATAGS_PROC
3581 + bool "Export atags in procfs"
3582 + default n
3583 + help
3584 + Should the atags used to boot the kernel be exported in an "atags"
3585 + file in procfs. Useful with kexec.
3586 +
3587 endmenu
3588
3589 if (ARCH_SA1100 || ARCH_INTEGRATOR || ARCH_OMAP || ARCH_IMX )
3590 @@ -1064,6 +1071,8 @@ source "drivers/hid/Kconfig"
3591
3592 source "drivers/usb/Kconfig"
3593
3594 +source "drivers/sdio/Kconfig"
3595 +
3596 source "drivers/mmc/Kconfig"
3597
3598 source "drivers/leds/Kconfig"
3599 Index: linux-2.6.24.7/arch/arm/kernel/atags.c
3600 ===================================================================
3601 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
3602 +++ linux-2.6.24.7/arch/arm/kernel/atags.c 2008-12-11 22:46:48.000000000 +0100
3603 @@ -0,0 +1,86 @@
3604 +#include <linux/slab.h>
3605 +#include <linux/kexec.h>
3606 +#include <linux/proc_fs.h>
3607 +#include <asm/setup.h>
3608 +#include <asm/types.h>
3609 +#include <asm/page.h>
3610 +
3611 +struct buffer {
3612 + size_t size;
3613 + char *data;
3614 +};
3615 +static struct buffer tags_buffer;
3616 +
3617 +static int
3618 +read_buffer(char* page, char** start, off_t off, int count,
3619 + int* eof, void* data)
3620 +{
3621 + struct buffer *buffer = (struct buffer *)data;
3622 +
3623 + if (off >= buffer->size) {
3624 + *eof = 1;
3625 + return 0;
3626 + }
3627 +
3628 + count = min((int) (buffer->size - off), count);
3629 +
3630 + memcpy(page, &buffer->data[off], count);
3631 +
3632 + return count;
3633 +}
3634 +
3635 +
3636 +static int
3637 +create_proc_entries(void)
3638 +{
3639 + struct proc_dir_entry* tags_entry;
3640 +
3641 + tags_entry = create_proc_read_entry("atags", 0400, &proc_root, read_buffer, &tags_buffer);
3642 + if (!tags_entry)
3643 + return -ENOMEM;
3644 +
3645 + return 0;
3646 +}
3647 +
3648 +
3649 +static char __initdata atags_copy_buf[KEXEC_BOOT_PARAMS_SIZE];
3650 +static char __initdata *atags_copy;
3651 +
3652 +void __init save_atags(const struct tag *tags)
3653 +{
3654 + atags_copy = atags_copy_buf;
3655 + memcpy(atags_copy, tags, KEXEC_BOOT_PARAMS_SIZE);
3656 +}
3657 +
3658 +
3659 +static int __init init_atags_procfs(void)
3660 +{
3661 + struct tag *tag;
3662 + int error;
3663 +
3664 + if (!atags_copy) {
3665 + printk(KERN_WARNING "Exporting ATAGs: No saved tags found\n");
3666 + return -EIO;
3667 + }
3668 +
3669 + for (tag = (struct tag *) atags_copy; tag->hdr.size; tag = tag_next(tag))
3670 + ;
3671 +
3672 + tags_buffer.size = ((char *) tag - atags_copy) + sizeof(tag->hdr);
3673 + tags_buffer.data = kmalloc(tags_buffer.size, GFP_KERNEL);
3674 + if (tags_buffer.data == NULL)
3675 + return -ENOMEM;
3676 + memcpy(tags_buffer.data, atags_copy, tags_buffer.size);
3677 +
3678 + error = create_proc_entries();
3679 + if (error) {
3680 + printk(KERN_ERR "Exporting ATAGs: not enough memory\n");
3681 + kfree(tags_buffer.data);
3682 + tags_buffer.size = 0;
3683 + tags_buffer.data = NULL;
3684 + }
3685 +
3686 + return error;
3687 +}
3688 +
3689 +arch_initcall(init_atags_procfs);
3690 Index: linux-2.6.24.7/arch/arm/kernel/atags.h
3691 ===================================================================
3692 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
3693 +++ linux-2.6.24.7/arch/arm/kernel/atags.h 2008-12-11 22:46:48.000000000 +0100
3694 @@ -0,0 +1,5 @@
3695 +#ifdef CONFIG_ATAGS_PROC
3696 +extern void save_atags(struct tag *tags);
3697 +#else
3698 +static inline void save_atags(struct tag *tags) { }
3699 +#endif
3700 Index: linux-2.6.24.7/arch/arm/kernel/machine_kexec.c
3701 ===================================================================
3702 --- linux-2.6.24.7.orig/arch/arm/kernel/machine_kexec.c 2008-12-11 22:46:07.000000000 +0100
3703 +++ linux-2.6.24.7/arch/arm/kernel/machine_kexec.c 2008-12-11 22:46:48.000000000 +0100
3704 @@ -21,6 +21,7 @@ extern void setup_mm_for_reboot(char mod
3705 extern unsigned long kexec_start_address;
3706 extern unsigned long kexec_indirection_page;
3707 extern unsigned long kexec_mach_type;
3708 +extern unsigned long kexec_boot_atags;
3709
3710 /*
3711 * Provide a dummy crash_notes definition while crash dump arrives to arm.
3712 @@ -62,6 +63,7 @@ void machine_kexec(struct kimage *image)
3713 kexec_start_address = image->start;
3714 kexec_indirection_page = page_list;
3715 kexec_mach_type = machine_arch_type;
3716 + kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET;
3717
3718 /* copy our kernel relocation code to the control code page */
3719 memcpy(reboot_code_buffer,
3720 Index: linux-2.6.24.7/arch/arm/kernel/Makefile
3721 ===================================================================
3722 --- linux-2.6.24.7.orig/arch/arm/kernel/Makefile 2008-12-11 22:46:07.000000000 +0100
3723 +++ linux-2.6.24.7/arch/arm/kernel/Makefile 2008-12-11 22:46:48.000000000 +0100
3724 @@ -19,6 +19,7 @@ obj-$(CONFIG_ISA_DMA) += dma-isa.o
3725 obj-$(CONFIG_PCI) += bios32.o isa.o
3726 obj-$(CONFIG_SMP) += smp.o
3727 obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
3728 +obj-$(CONFIG_ATAGS_PROC) += atags.o
3729 obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o
3730
3731 obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o
3732 Index: linux-2.6.24.7/arch/arm/kernel/relocate_kernel.S
3733 ===================================================================
3734 --- linux-2.6.24.7.orig/arch/arm/kernel/relocate_kernel.S 2008-12-11 22:46:07.000000000 +0100
3735 +++ linux-2.6.24.7/arch/arm/kernel/relocate_kernel.S 2008-12-11 22:46:48.000000000 +0100
3736 @@ -7,23 +7,6 @@
3737 .globl relocate_new_kernel
3738 relocate_new_kernel:
3739
3740 - /* Move boot params back to where the kernel expects them */
3741 -
3742 - ldr r0,kexec_boot_params_address
3743 - teq r0,#0
3744 - beq 8f
3745 -
3746 - ldr r1,kexec_boot_params_copy
3747 - mov r6,#KEXEC_BOOT_PARAMS_SIZE/4
3748 -7:
3749 - ldr r5,[r1],#4
3750 - str r5,[r0],#4
3751 - subs r6,r6,#1
3752 - bne 7b
3753 -
3754 -8:
3755 - /* Boot params moved, now go on with the kernel */
3756 -
3757 ldr r0,kexec_indirection_page
3758 ldr r1,kexec_start_address
3759
3760 @@ -67,7 +50,7 @@ relocate_new_kernel:
3761 mov lr,r1
3762 mov r0,#0
3763 ldr r1,kexec_mach_type
3764 - ldr r2,kexec_boot_params_address
3765 + ldr r2,kexec_boot_atags
3766 mov pc,lr
3767
3768 .globl kexec_start_address
3769 @@ -82,14 +65,9 @@ kexec_indirection_page:
3770 kexec_mach_type:
3771 .long 0x0
3772
3773 - /* phy addr where new kernel will expect to find boot params */
3774 - .globl kexec_boot_params_address
3775 -kexec_boot_params_address:
3776 - .long 0x0
3777 -
3778 - /* phy addr where old kernel put a copy of orig boot params */
3779 - .globl kexec_boot_params_copy
3780 -kexec_boot_params_copy:
3781 + /* phy addr of the atags for the new kernel */
3782 + .globl kexec_boot_atags
3783 +kexec_boot_atags:
3784 .long 0x0
3785
3786 relocate_new_kernel_end:
3787 Index: linux-2.6.24.7/arch/arm/kernel/setup.c
3788 ===================================================================
3789 --- linux-2.6.24.7.orig/arch/arm/kernel/setup.c 2008-12-11 22:46:07.000000000 +0100
3790 +++ linux-2.6.24.7/arch/arm/kernel/setup.c 2008-12-11 22:46:48.000000000 +0100
3791 @@ -24,7 +24,6 @@
3792 #include <linux/interrupt.h>
3793 #include <linux/smp.h>
3794 #include <linux/fs.h>
3795 -#include <linux/kexec.h>
3796
3797 #include <asm/cpu.h>
3798 #include <asm/elf.h>
3799 @@ -39,6 +38,7 @@
3800 #include <asm/mach/time.h>
3801
3802 #include "compat.h"
3803 +#include "atags.h"
3804
3805 #ifndef MEM_SIZE
3806 #define MEM_SIZE (16*1024*1024)
3807 @@ -784,23 +784,6 @@ static int __init customize_machine(void
3808 }
3809 arch_initcall(customize_machine);
3810
3811 -#ifdef CONFIG_KEXEC
3812 -
3813 -/* Physical addr of where the boot params should be for this machine */
3814 -extern unsigned long kexec_boot_params_address;
3815 -
3816 -/* Physical addr of the buffer into which the boot params are copied */
3817 -extern unsigned long kexec_boot_params_copy;
3818 -
3819 -/* Pointer to the boot params buffer, for manipulation and display */
3820 -unsigned long kexec_boot_params;
3821 -EXPORT_SYMBOL(kexec_boot_params);
3822 -
3823 -/* The buffer itself - make sure it is sized correctly */
3824 -static unsigned long kexec_boot_params_buf[(KEXEC_BOOT_PARAMS_SIZE + 3) / 4];
3825 -
3826 -#endif
3827 -
3828 void __init setup_arch(char **cmdline_p)
3829 {
3830 struct tag *tags = (struct tag *)&init_tags;
3831 @@ -819,18 +802,6 @@ void __init setup_arch(char **cmdline_p)
3832 else if (mdesc->boot_params)
3833 tags = phys_to_virt(mdesc->boot_params);
3834
3835 -#ifdef CONFIG_KEXEC
3836 - kexec_boot_params_copy = virt_to_phys(kexec_boot_params_buf);
3837 - kexec_boot_params = (unsigned long)kexec_boot_params_buf;
3838 - if (__atags_pointer) {
3839 - kexec_boot_params_address = __atags_pointer;
3840 - memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE);
3841 - } else if (mdesc->boot_params) {
3842 - kexec_boot_params_address = mdesc->boot_params;
3843 - memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE);
3844 - }
3845 -#endif
3846 -
3847 /*
3848 * If we have the old style parameters, convert them to
3849 * a tag list.
3850 @@ -846,6 +817,7 @@ void __init setup_arch(char **cmdline_p)
3851 if (tags->hdr.tag == ATAG_CORE) {
3852 if (meminfo.nr_banks != 0)
3853 squash_mem_tags(tags);
3854 + save_atags(tags);
3855 parse_tags(tags);
3856 }
3857
3858 Index: linux-2.6.24.7/arch/arm/mach-s3c2410/Kconfig
3859 ===================================================================
3860 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2410/Kconfig 2008-12-11 22:46:07.000000000 +0100
3861 +++ linux-2.6.24.7/arch/arm/mach-s3c2410/Kconfig 2008-12-11 22:46:48.000000000 +0100
3862 @@ -9,6 +9,7 @@ config CPU_S3C2410
3863 depends on ARCH_S3C2410
3864 select S3C2410_CLOCK
3865 select S3C2410_GPIO
3866 + select S3C2410_PWM
3867 select CPU_LLSERIAL_S3C2410
3868 select S3C2410_PM if PM
3869 help
3870 @@ -37,6 +38,11 @@ config S3C2410_CLOCK
3871 help
3872 Clock code for the S3C2410, and similar processors
3873
3874 +config S3C2410_PWM
3875 + bool
3876 + help
3877 + PWM timer code for the S3C2410, and similar processors
3878 +
3879
3880 menu "S3C2410 Machines"
3881
3882 @@ -107,8 +113,17 @@ config MACH_VR1000
3883 config MACH_QT2410
3884 bool "QT2410"
3885 select CPU_S3C2410
3886 + select DISPLAY_JBT6K74
3887 help
3888 Say Y here if you are using the Armzone QT2410
3889
3890 +config MACH_NEO1973_GTA01
3891 + bool "FIC Neo1973 GSM Phone (GTA01 Hardware)"
3892 + select CPU_S3C2410
3893 + select MACH_NEO1973
3894 + select SENSORS_PCF50606
3895 + help
3896 + Say Y here if you are using the FIC Neo1973 GSM Phone
3897 +
3898 endmenu
3899
3900 Index: linux-2.6.24.7/arch/arm/mach-s3c2410/mach-gta01.c
3901 ===================================================================
3902 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
3903 +++ linux-2.6.24.7/arch/arm/mach-s3c2410/mach-gta01.c 2008-12-11 22:46:48.000000000 +0100
3904 @@ -0,0 +1,763 @@
3905 +/*
3906 + * linux/arch/arm/mach-s3c2410/mach-gta01.c
3907 + *
3908 + * S3C2410 Machine Support for the FIC Neo1973 GTA01
3909 + *
3910 + * Copyright (C) 2006-2007 by Openmoko, Inc.
3911 + * Author: Harald Welte <laforge@openmoko.org>
3912 + * All rights reserved.
3913 + *
3914 + * This program is free software; you can redistribute it and/or
3915 + * modify it under the terms of the GNU General Public License as
3916 + * published by the Free Software Foundation; either version 2 of
3917 + * the License, or (at your option) any later version.
3918 + *
3919 + * This program is distributed in the hope that it will be useful,
3920 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
3921 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3922 + * GNU General Public License for more details.
3923 + *
3924 + * You should have received a copy of the GNU General Public License
3925 + * along with this program; if not, write to the Free Software
3926 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
3927 + * MA 02111-1307 USA
3928 + *
3929 + */
3930 +
3931 +#include <linux/kernel.h>
3932 +#include <linux/types.h>
3933 +#include <linux/interrupt.h>
3934 +#include <linux/list.h>
3935 +#include <linux/timer.h>
3936 +#include <linux/init.h>
3937 +#include <linux/workqueue.h>
3938 +#include <linux/platform_device.h>
3939 +#include <linux/serial_core.h>
3940 +#include <asm/arch/ts.h>
3941 +#include <linux/spi/spi.h>
3942 +#include <linux/spi/spi_bitbang.h>
3943 +#include <linux/mmc/mmc.h>
3944 +#include <linux/mmc/host.h>
3945 +
3946 +#include <linux/mtd/mtd.h>
3947 +#include <linux/mtd/nand.h>
3948 +#include <linux/mtd/nand_ecc.h>
3949 +#include <linux/mtd/partitions.h>
3950 +
3951 +#include <linux/mmc/host.h>
3952 +
3953 +#include <linux/pcf50606.h>
3954 +
3955 +#include <asm/mach/arch.h>
3956 +#include <asm/mach/map.h>
3957 +#include <asm/mach/irq.h>
3958 +
3959 +#include <asm/hardware.h>
3960 +#include <asm/io.h>
3961 +#include <asm/irq.h>
3962 +#include <asm/mach-types.h>
3963 +
3964 +#include <asm/arch/regs-gpio.h>
3965 +#include <asm/arch/fb.h>
3966 +#include <asm/arch/mci.h>
3967 +#include <asm/arch/spi.h>
3968 +#include <asm/arch/spi-gpio.h>
3969 +#include <asm/arch/usb-control.h>
3970 +
3971 +#include <asm/arch/gta01.h>
3972 +
3973 +#include <asm/plat-s3c/regs-serial.h>
3974 +#include <asm/plat-s3c/nand.h>
3975 +#include <asm/plat-s3c24xx/devs.h>
3976 +#include <asm/plat-s3c24xx/cpu.h>
3977 +#include <asm/plat-s3c24xx/pm.h>
3978 +#include <asm/plat-s3c24xx/udc.h>
3979 +#include <asm/plat-s3c24xx/neo1973.h>
3980 +#include <asm/arch-s3c2410/neo1973-pm-gsm.h>
3981 +
3982 +#include "../plat-s3c24xx/neo1973_pm_gps.h"
3983 +
3984 +#include <linux/jbt6k74.h>
3985 +
3986 +static struct map_desc gta01_iodesc[] __initdata = {
3987 + {
3988 + .virtual = 0xe0000000,
3989 + .pfn = __phys_to_pfn(S3C2410_CS3+0x01000000),
3990 + .length = SZ_1M,
3991 + .type = MT_DEVICE
3992 + },
3993 +};
3994 +
3995 +#define UCON S3C2410_UCON_DEFAULT
3996 +#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
3997 +#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
3998 +/* UFCON for the gta01 sets the FIFO trigger level at 4, not 8 */
3999 +#define UFCON_GTA01_PORT0 S3C2410_UFCON_FIFOMODE
4000 +
4001 +static struct s3c2410_uartcfg gta01_uartcfgs[] = {
4002 + [0] = {
4003 + .hwport = 0,
4004 + .flags = 0,
4005 + .ucon = UCON,
4006 + .ulcon = ULCON,
4007 + .ufcon = UFCON_GTA01_PORT0,
4008 + },
4009 + [1] = {
4010 + .hwport = 1,
4011 + .flags = 0,
4012 + .ucon = UCON,
4013 + .ulcon = ULCON,
4014 + .ufcon = UFCON,
4015 + },
4016 +};
4017 +
4018 +/* PMU driver info */
4019 +
4020 +static int pmu_callback(struct device *dev, unsigned int feature,
4021 + enum pmu_event event)
4022 +{
4023 + switch (feature) {
4024 + case PCF50606_FEAT_ACD:
4025 + switch (event) {
4026 + case PMU_EVT_INSERT:
4027 + pcf50606_charge_fast(pcf50606_global, 1);
4028 + break;
4029 + case PMU_EVT_REMOVE:
4030 + pcf50606_charge_fast(pcf50606_global, 0);
4031 + break;
4032 + default:
4033 + break;
4034 + }
4035 + break;
4036 + default:
4037 + break;
4038 + }
4039 +
4040 + return 0;
4041 +}
4042 +
4043 +static struct pcf50606_platform_data gta01_pcf_pdata = {
4044 + .used_features = PCF50606_FEAT_EXTON |
4045 + PCF50606_FEAT_MBC |
4046 + PCF50606_FEAT_BBC |
4047 + PCF50606_FEAT_RTC |
4048 + PCF50606_FEAT_WDT |
4049 + PCF50606_FEAT_CHGCUR |
4050 + PCF50606_FEAT_BATVOLT |
4051 + PCF50606_FEAT_BATTEMP,
4052 + .onkey_seconds_required = 3,
4053 + .cb = &pmu_callback,
4054 + .r_fix_batt = 10000,
4055 + .r_fix_batt_par = 10000,
4056 + .r_sense_milli = 220,
4057 + .rails = {
4058 + [PCF50606_REGULATOR_D1REG] = {
4059 + .name = "bt_3v15",
4060 + .voltage = {
4061 + .init = 3150,
4062 + .max = 3150,
4063 + },
4064 + },
4065 + [PCF50606_REGULATOR_D2REG] = {
4066 + .name = "gl_2v5",
4067 + .voltage = {
4068 + .init = 2500,
4069 + .max = 2500,
4070 + },
4071 + },
4072 + [PCF50606_REGULATOR_D3REG] = {
4073 + .name = "stby_1v8",
4074 + .flags = PMU_VRAIL_F_SUSPEND_ON,
4075 + .voltage = {
4076 + .init = 1800,
4077 + .max = 2100,
4078 + },
4079 + },
4080 + [PCF50606_REGULATOR_DCD] = {
4081 + .name = "gl_1v5",
4082 + .voltage = {
4083 + .init = 1500,
4084 + .max = 1500,
4085 + },
4086 + },
4087 + [PCF50606_REGULATOR_DCDE] = {
4088 + .name = "io_3v3",
4089 + .flags = PMU_VRAIL_F_SUSPEND_ON,
4090 + .voltage = {
4091 + .init = 3300,
4092 + .max = 3330,
4093 + },
4094 + },
4095 + [PCF50606_REGULATOR_DCUD] = {
4096 + .name = "core_1v8",
4097 + .flags = PMU_VRAIL_F_SUSPEND_ON,
4098 + .voltage = {
4099 + .init = 2100,
4100 + .max = 2100,
4101 + },
4102 + },
4103 + [PCF50606_REGULATOR_IOREG] = {
4104 + .name = "codec_3v3",
4105 + .voltage = {
4106 + .init = 3300,
4107 + .max = 3300,
4108 + },
4109 + },
4110 + [PCF50606_REGULATOR_LPREG] = {
4111 + .name = "lcm_3v3",
4112 + .voltage = {
4113 + .init = 3300,
4114 + .max = 3300,
4115 + },
4116 + }
4117 + },
4118 +};
4119 +
4120 +static void cfg_pmu_vrail(struct pmu_voltage_rail *vrail, char *name,
4121 + unsigned int flags, unsigned int init,
4122 + unsigned int max)
4123 +{
4124 + vrail->name = name;
4125 + vrail->flags = flags;
4126 + vrail->voltage.init = init;
4127 + vrail->voltage.max = max;
4128 +}
4129 +
4130 +static void mangle_pmu_pdata_by_system_rev(void)
4131 +{
4132 + switch (system_rev) {
4133 + case GTA01Bv4_SYSTEM_REV:
4134 + gta01_pcf_pdata.used_features |= PCF50606_FEAT_ACD;
4135 + break;
4136 + case GTA01Bv3_SYSTEM_REV:
4137 + case GTA01Bv2_SYSTEM_REV:
4138 + gta01_pcf_pdata.rails[PCF50606_REGULATOR_D3REG]
4139 + .name = "user1";
4140 + gta01_pcf_pdata.rails[PCF50606_REGULATOR_D3REG]
4141 + .flags &= ~PMU_VRAIL_F_SUSPEND_ON;
4142 + gta01_pcf_pdata.rails[PCF50606_REGULATOR_D3REG]
4143 + .flags = PMU_VRAIL_F_UNUSED;
4144 + break;
4145 + case GTA01v4_SYSTEM_REV:
4146 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_DCUD],
4147 + "core_1v8", PMU_VRAIL_F_SUSPEND_ON, 1800, 1800);
4148 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_D1REG],
4149 + "vrf_3v", 0, 3000, 3000);
4150 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_D3REG],
4151 + "vtcxo_2v8", 0, 2800, 2800);
4152 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_DCD],
4153 + "gl_3v5", 0, 3500, 3500);
4154 + break;
4155 + case GTA01v3_SYSTEM_REV:
4156 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_D1REG],
4157 + "vrf_3v", 0, 3000, 3000);
4158 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_D2REG],
4159 + "sd_3v3", 0, 3300, 3300);
4160 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_D3REG],
4161 + "codec_3v3", 0, 3300, 3300);
4162 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_DCD],
4163 + "gpsio_3v3", 0, 3300, 3300);
4164 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_DCUD],
4165 + "core_1v8", PMU_VRAIL_F_SUSPEND_ON, 1800, 1800);
4166 + cfg_pmu_vrail(&gta01_pcf_pdata.rails[PCF50606_REGULATOR_IOREG],
4167 + "vtcxo_2v8", 0, 2800, 2800);
4168 + break;
4169 + }
4170 +}
4171 +
4172 +static struct resource gta01_pmu_resources[] = {
4173 + [0] = {
4174 + .flags = IORESOURCE_IRQ,
4175 + .start = GTA01_IRQ_PCF50606,
4176 + .end = GTA01_IRQ_PCF50606,
4177 + },
4178 +};
4179 +
4180 +struct platform_device gta01_pmu_dev = {
4181 + .name = "pcf50606",
4182 + .num_resources = ARRAY_SIZE(gta01_pmu_resources),
4183 + .resource = gta01_pmu_resources,
4184 + .dev = {
4185 + .platform_data = &gta01_pcf_pdata,
4186 + },
4187 +};
4188 +
4189 +/* LCD driver info */
4190 +
4191 +/* Configuration for 480x640 toppoly TD028TTEC1.
4192 + * Do not mark this as __initdata or it will break! */
4193 +static struct s3c2410fb_display gta01_displays[] = {
4194 + {
4195 + .type = S3C2410_LCDCON1_TFT,
4196 + .width = 43,
4197 + .height = 58,
4198 + .xres = 480,
4199 + .yres = 640,
4200 + .bpp = 16,
4201 +
4202 + .pixclock = 40000, /* HCLK/4 */
4203 + .left_margin = 104,
4204 + .right_margin = 8,
4205 + .hsync_len = 8,
4206 + .upper_margin = 2,
4207 + .lower_margin = 16,
4208 + .vsync_len = 2,
4209 + .lcdcon5 = S3C2410_LCDCON5_FRM565 |
4210 + S3C2410_LCDCON5_INVVCLK |
4211 + S3C2410_LCDCON5_INVVLINE |
4212 + S3C2410_LCDCON5_INVVFRAME |
4213 + S3C2410_LCDCON5_PWREN |
4214 + S3C2410_LCDCON5_HWSWP,
4215 + },
4216 + {
4217 + .type = S3C2410_LCDCON1_TFT,
4218 + .width = 43,
4219 + .height = 58,
4220 + .xres = 480,
4221 + .yres = 640,
4222 + .bpp = 32,
4223 +
4224 + .pixclock = 40000, /* HCLK/4 */
4225 + .left_margin = 104,
4226 + .right_margin = 8,
4227 + .hsync_len = 8,
4228 + .upper_margin = 2,
4229 + .lower_margin = 16,
4230 + .vsync_len = 2,
4231 + .lcdcon5 = S3C2410_LCDCON5_FRM565 |
4232 + S3C2410_LCDCON5_INVVCLK |
4233 + S3C2410_LCDCON5_INVVLINE |
4234 + S3C2410_LCDCON5_INVVFRAME |
4235 + S3C2410_LCDCON5_PWREN |
4236 + S3C2410_LCDCON5_HWSWP,
4237 + },
4238 + {
4239 + .type = S3C2410_LCDCON1_TFT,
4240 + .width = 43,
4241 + .height = 58,
4242 + .xres = 240,
4243 + .yres = 320,
4244 + .bpp = 16,
4245 +
4246 + .pixclock = 40000, /* HCLK/4 */
4247 + .left_margin = 104,
4248 + .right_margin = 8,
4249 + .hsync_len = 8,
4250 + .upper_margin = 2,
4251 + .lower_margin = 16,
4252 + .vsync_len = 2,
4253 + .lcdcon5 = S3C2410_LCDCON5_FRM565 |
4254 + S3C2410_LCDCON5_INVVCLK |
4255 + S3C2410_LCDCON5_INVVLINE |
4256 + S3C2410_LCDCON5_INVVFRAME |
4257 + S3C2410_LCDCON5_PWREN |
4258 + S3C2410_LCDCON5_HWSWP,
4259 + },
4260 +};
4261 +
4262 +static struct s3c2410fb_mach_info gta01_lcd_cfg __initdata = {
4263 + .displays = gta01_displays,
4264 + .num_displays = ARRAY_SIZE(gta01_displays),
4265 + .default_display = 0,
4266 +
4267 + .lpcsel = ((0xCE6) & ~7) | 1<<4,
4268 +};
4269 +
4270 +static struct platform_device *gta01_devices[] __initdata = {
4271 + &s3c_device_usb,
4272 + &s3c_device_lcd,
4273 + &s3c_device_wdt,
4274 + &s3c_device_i2c,
4275 + &s3c_device_iis,
4276 + &s3c_device_sdi,
4277 + &s3c_device_usbgadget,
4278 + &s3c_device_nand,
4279 + &s3c_device_ts,
4280 +};
4281 +
4282 +static struct s3c2410_nand_set gta01_nand_sets[] = {
4283 + [0] = {
4284 + .name = "neo1973-nand",
4285 + .nr_chips = 1,
4286 + .flags = S3C2410_NAND_BBT,
4287 + },
4288 +};
4289 +
4290 +static struct s3c2410_platform_nand gta01_nand_info = {
4291 + .tacls = 20,
4292 + .twrph0 = 60,
4293 + .twrph1 = 20,
4294 + .nr_sets = ARRAY_SIZE(gta01_nand_sets),
4295 + .sets = gta01_nand_sets,
4296 +};
4297 +
4298 +static void gta01_mmc_set_power(unsigned char power_mode, unsigned short vdd)
4299 +{
4300 + int bit;
4301 + int mv = 1700; /* 1.7V for MMC_VDD_165_195 */
4302 +
4303 + printk(KERN_DEBUG "mmc_set_power(power_mode=%u, vdd=%u)\n",
4304 + power_mode, vdd);
4305 +
4306 + switch (system_rev) {
4307 + case GTA01v3_SYSTEM_REV:
4308 + switch (power_mode) {
4309 + case MMC_POWER_OFF:
4310 + pcf50606_onoff_set(pcf50606_global,
4311 + PCF50606_REGULATOR_D2REG, 0);
4312 + break;
4313 + case MMC_POWER_ON:
4314 + /* translate MMC_VDD_* VDD bit to mv */
4315 + for (bit = 8; bit != 24; bit++)
4316 + if (vdd == (1 << bit))
4317 + mv += 100 * (bit - 4);
4318 + pcf50606_voltage_set(pcf50606_global,
4319 + PCF50606_REGULATOR_D2REG, mv);
4320 + pcf50606_onoff_set(pcf50606_global,
4321 + PCF50606_REGULATOR_D2REG, 1);
4322 + break;
4323 + }
4324 + break;
4325 + case GTA01v4_SYSTEM_REV:
4326 + case GTA01Bv2_SYSTEM_REV:
4327 + case GTA01Bv3_SYSTEM_REV:
4328 + case GTA01Bv4_SYSTEM_REV:
4329 + switch (power_mode) {
4330 + case MMC_POWER_OFF:
4331 + neo1973_gpb_setpin(GTA01_GPIO_SDMMC_ON, 1);
4332 + break;
4333 + case MMC_POWER_ON:
4334 + neo1973_gpb_setpin(GTA01_GPIO_SDMMC_ON, 0);
4335 + break;
4336 + }
4337 + break;
4338 + }
4339 +}
4340 +
4341 +static int gta01_mmc_use_slow(void)
4342 +{
4343 + return neo1973_pm_gps_is_on();
4344 +}
4345 +
4346 +static struct s3c24xx_mci_pdata gta01_mmc_cfg = {
4347 + .gpio_detect = GTA01_GPIO_nSD_DETECT,
4348 + .set_power = &gta01_mmc_set_power,
4349 + .use_slow = &gta01_mmc_use_slow,
4350 + .ocr_avail = MMC_VDD_165_195|MMC_VDD_20_21|
4351 + MMC_VDD_21_22|MMC_VDD_22_23|MMC_VDD_23_24|
4352 + MMC_VDD_24_25|MMC_VDD_25_26|MMC_VDD_26_27|
4353 + MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|
4354 + MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33,
4355 +};
4356 +
4357 +static void gta01_udc_command(enum s3c2410_udc_cmd_e cmd)
4358 +{
4359 + printk(KERN_DEBUG "%s(%d)\n", __func__, cmd);
4360 +
4361 + switch (cmd) {
4362 + case S3C2410_UDC_P_ENABLE:
4363 + neo1973_gpb_setpin(GTA01_GPIO_USB_PULLUP, 1);
4364 + break;
4365 + case S3C2410_UDC_P_DISABLE:
4366 + neo1973_gpb_setpin(GTA01_GPIO_USB_PULLUP, 0);
4367 + break;
4368 + default:
4369 + break;
4370 + }
4371 +}
4372 +
4373 +/* use a work queue, since I2C API inherently schedules
4374 + * and we get called in hardirq context from UDC driver */
4375 +
4376 +struct vbus_draw {
4377 + struct work_struct work;
4378 + int ma;
4379 +};
4380 +static struct vbus_draw gta01_udc_vbus_drawer;
4381 +
4382 +static void __gta01_udc_vbus_draw(struct work_struct *work)
4383 +{
4384 + /* this is a fix to work around boot-time ordering problems if the
4385 + * s3c2410_udc is initialized before the pcf50606 driver has defined
4386 + * pcf50606_global */
4387 + if (!pcf50606_global)
4388 + return;
4389 +
4390 + if (gta01_udc_vbus_drawer.ma >= 500) {
4391 + /* enable fast charge */
4392 + printk(KERN_DEBUG "udc: enabling fast charge\n");
4393 + pcf50606_charge_fast(pcf50606_global, 1);
4394 + } else {
4395 + /* disable fast charge */
4396 + printk(KERN_DEBUG "udc: disabling fast charge\n");
4397 + pcf50606_charge_fast(pcf50606_global, 0);
4398 + }
4399 +}
4400 +
4401 +static void gta01_udc_vbus_draw(unsigned int ma)
4402 +{
4403 + gta01_udc_vbus_drawer.ma = ma;
4404 + schedule_work(&gta01_udc_vbus_drawer.work);
4405 +}
4406 +
4407 +static struct s3c2410_udc_mach_info gta01_udc_cfg = {
4408 + .vbus_draw = gta01_udc_vbus_draw,
4409 +};
4410 +
4411 +static struct s3c2410_ts_mach_info gta01_ts_cfg = {
4412 + .delay = 10000,
4413 + .presc = 50000000 / 1000000, /* 50 MHz PCLK / 1MHz */
4414 + /* simple averaging, 2^n samples */
4415 + .oversampling_shift = 5,
4416 + /* averaging filter length, 2^n */
4417 + .excursion_filter_len_bits = 5,
4418 + /* flagged for beauty contest on next sample if differs from
4419 + * average more than this
4420 + */
4421 + .reject_threshold_vs_avg = 2,
4422 +};
4423 +
4424 +/* SPI */
4425 +
4426 +static void gta01_jbt6k74_reset(int devidx, int level)
4427 +{
4428 + /* empty place holder; gta01 does not yet use this */
4429 + printk(KERN_DEBUG "gta01_jbt6k74_reset\n");
4430 +}
4431 +
4432 +static void gta01_jbt6k74_resuming(int devidx)
4433 +{
4434 + gta01bl_deferred_resume();
4435 +}
4436 +
4437 +const struct jbt6k74_platform_data gta01_jbt6k74_pdata = {
4438 + .reset = gta01_jbt6k74_reset,
4439 + .resuming = gta01_jbt6k74_resuming,
4440 +};
4441 +
4442 +static struct spi_board_info gta01_spi_board_info[] = {
4443 + {
4444 + .modalias = "jbt6k74",
4445 + .platform_data = &gta01_jbt6k74_pdata,
4446 + /* controller_data */
4447 + /* irq */
4448 + .max_speed_hz = 10 * 1000 * 1000,
4449 + .bus_num = 1,
4450 + /* chip_select */
4451 + },
4452 +};
4453 +
4454 +static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int csidx, int cs)
4455 +{
4456 + switch (cs) {
4457 + case BITBANG_CS_ACTIVE:
4458 + s3c2410_gpio_setpin(S3C2410_GPG3, 0);
4459 + break;
4460 + case BITBANG_CS_INACTIVE:
4461 + s3c2410_gpio_setpin(S3C2410_GPG3, 1);
4462 + break;
4463 + }
4464 +}
4465 +
4466 +static struct s3c2410_spigpio_info spi_gpio_cfg = {
4467 + .pin_clk = S3C2410_GPG7,
4468 + .pin_mosi = S3C2410_GPG6,
4469 + .pin_miso = S3C2410_GPG5,
4470 + .board_size = ARRAY_SIZE(gta01_spi_board_info),
4471 + .board_info = gta01_spi_board_info,
4472 + .chip_select = &spi_gpio_cs,
4473 + .num_chipselect = 2, /*** Should be 1 or 2 for gta01? ***/
4474 +};
4475 +
4476 +static struct resource s3c_spi_lcm_resource[] = {
4477 + [0] = {
4478 + .start = S3C2410_GPG3,
4479 + .end = S3C2410_GPG3,
4480 + },
4481 + [1] = {
4482 + .start = S3C2410_GPG5,
4483 + .end = S3C2410_GPG5,
4484 + },
4485 + [2] = {
4486 + .start = S3C2410_GPG6,
4487 + .end = S3C2410_GPG6,
4488 + },
4489 + [3] = {
4490 + .start = S3C2410_GPG7,
4491 + .end = S3C2410_GPG7,
4492 + },
4493 +};
4494 +
4495 +struct platform_device s3c_device_spi_lcm = {
4496 + .name = "spi_s3c24xx_gpio",
4497 + .id = 1,
4498 + .num_resources = ARRAY_SIZE(s3c_spi_lcm_resource),
4499 + .resource = s3c_spi_lcm_resource,
4500 + .dev = {
4501 + .platform_data = &spi_gpio_cfg,
4502 + },
4503 +};
4504 +
4505 +static struct gta01bl_machinfo backlight_machinfo = {
4506 + .default_intensity = 1,
4507 + .max_intensity = 1,
4508 + .limit_mask = 1,
4509 + .defer_resume_backlight = 1,
4510 +};
4511 +
4512 +static struct resource gta01_bl_resources[] = {
4513 + [0] = {
4514 + .start = GTA01_GPIO_BACKLIGHT,
4515 + .end = GTA01_GPIO_BACKLIGHT,
4516 + },
4517 +};
4518 +
4519 +struct platform_device gta01_bl_dev = {
4520 + .name = "gta01-bl",
4521 + .num_resources = ARRAY_SIZE(gta01_bl_resources),
4522 + .resource = gta01_bl_resources,
4523 + .dev = {
4524 + .platform_data = &backlight_machinfo,
4525 + },
4526 +};
4527 +
4528 +static struct resource gta01_led_resources[] = {
4529 + [0] = {
4530 + .start = GTA01_GPIO_VIBRATOR_ON,
4531 + .end = GTA01_GPIO_VIBRATOR_ON,
4532 + },
4533 +};
4534 +
4535 +struct platform_device gta01_led_dev = {
4536 + .name = "neo1973-vibrator",
4537 + .num_resources = ARRAY_SIZE(gta01_led_resources),
4538 + .resource = gta01_led_resources,
4539 +};
4540 +
4541 +static struct resource gta01_button_resources[] = {
4542 + [0] = {
4543 + .start = GTA01_GPIO_AUX_KEY,
4544 + .end = GTA01_GPIO_AUX_KEY,
4545 + },
4546 + [1] = {
4547 + .start = GTA01_GPIO_HOLD_KEY,
4548 + .end = GTA01_GPIO_HOLD_KEY,
4549 + },
4550 + [2] = {
4551 + .start = GTA01_GPIO_JACK_INSERT,
4552 + .end = GTA01_GPIO_JACK_INSERT,
4553 + },
4554 +};
4555 +
4556 +struct platform_device gta01_button_dev = {
4557 + .name = "neo1973-button",
4558 + .num_resources = ARRAY_SIZE(gta01_button_resources),
4559 + .resource = gta01_button_resources,
4560 +};
4561 +
4562 +static struct platform_device gta01_pm_gsm_dev = {
4563 + .name = "neo1973-pm-gsm",
4564 +};
4565 +
4566 +/* USB */
4567 +static struct s3c2410_hcd_info gta01_usb_info = {
4568 + .port[0] = {
4569 + .flags = S3C_HCDFLG_USED,
4570 + },
4571 + .port[1] = {
4572 + .flags = 0,
4573 + },
4574 +};
4575 +
4576 +static void __init gta01_map_io(void)
4577 +{
4578 + s3c24xx_init_io(gta01_iodesc, ARRAY_SIZE(gta01_iodesc));
4579 + s3c24xx_init_clocks(12*1000*1000);
4580 + s3c24xx_init_uarts(gta01_uartcfgs, ARRAY_SIZE(gta01_uartcfgs));
4581 +}
4582 +
4583 +static irqreturn_t gta01_modem_irq(int irq, void *param)
4584 +{
4585 + printk(KERN_DEBUG "GSM wakeup interrupt (IRQ %d)\n", irq);
4586 + gta_gsm_interrupts++;
4587 + return IRQ_HANDLED;
4588 +}
4589 +
4590 +static void __init gta01_machine_init(void)
4591 +{
4592 + int rc;
4593 +
4594 + if (system_rev == GTA01v4_SYSTEM_REV ||
4595 + system_rev == GTA01Bv2_SYSTEM_REV ||
4596 + system_rev == GTA01Bv3_SYSTEM_REV ||
4597 + system_rev == GTA01Bv4_SYSTEM_REV) {
4598 + gta01_udc_cfg.udc_command = gta01_udc_command;
4599 + gta01_mmc_cfg.ocr_avail = MMC_VDD_32_33;
4600 + }
4601 +
4602 + s3c_device_usb.dev.platform_data = &gta01_usb_info;
4603 + s3c_device_nand.dev.platform_data = &gta01_nand_info;
4604 + s3c_device_sdi.dev.platform_data = &gta01_mmc_cfg;
4605 +
4606 + s3c24xx_fb_set_platdata(&gta01_lcd_cfg);
4607 +
4608 + INIT_WORK(&gta01_udc_vbus_drawer.work, __gta01_udc_vbus_draw);
4609 + s3c24xx_udc_set_platdata(&gta01_udc_cfg);
4610 + set_s3c2410ts_info(&gta01_ts_cfg);
4611 +
4612 + /* Set LCD_RESET / XRES to high */
4613 + s3c2410_gpio_cfgpin(S3C2410_GPC6, S3C2410_GPIO_OUTPUT);
4614 + s3c2410_gpio_setpin(S3C2410_GPC6, 1);
4615 +
4616 + /* SPI chip select is gpio output */
4617 + s3c2410_gpio_cfgpin(S3C2410_GPG3, S3C2410_GPIO_OUTPUT);
4618 + s3c2410_gpio_setpin(S3C2410_GPG3, 1);
4619 + platform_device_register(&s3c_device_spi_lcm);
4620 +
4621 + platform_device_register(&gta01_bl_dev);
4622 + platform_device_register(&gta01_button_dev);
4623 + platform_device_register(&gta01_pm_gsm_dev);
4624 +
4625 + switch (system_rev) {
4626 + case GTA01v3_SYSTEM_REV:
4627 + case GTA01v4_SYSTEM_REV:
4628 + /* just use the default (GTA01_IRQ_PCF50606) */
4629 + break;
4630 + case GTA01Bv2_SYSTEM_REV:
4631 + case GTA01Bv3_SYSTEM_REV:
4632 + /* just use the default (GTA01_IRQ_PCF50606) */
4633 + gta01_led_resources[0].start =
4634 + gta01_led_resources[0].end = GTA01Bv2_GPIO_VIBRATOR_ON;
4635 + break;
4636 + case GTA01Bv4_SYSTEM_REV:
4637 + gta01_pmu_resources[0].start =
4638 + gta01_pmu_resources[0].end = GTA01Bv4_IRQ_PCF50606;
4639 + gta01_led_resources[0].start =
4640 + gta01_led_resources[0].end = GTA01Bv4_GPIO_VIBRATOR_ON;
4641 + break;
4642 + }
4643 + mangle_pmu_pdata_by_system_rev();
4644 + platform_device_register(&gta01_pmu_dev);
4645 + platform_device_register(&gta01_led_dev);
4646 +
4647 + platform_add_devices(gta01_devices, ARRAY_SIZE(gta01_devices));
4648 +
4649 + s3c2410_pm_init();
4650 +
4651 + set_irq_type(GTA01_IRQ_MODEM, IRQT_RISING);
4652 + rc = request_irq(GTA01_IRQ_MODEM, gta01_modem_irq, IRQF_DISABLED,
4653 + "modem", NULL);
4654 + enable_irq_wake(GTA01_IRQ_MODEM);
4655 + printk(KERN_DEBUG "Enabled GSM wakeup IRQ %d (rc=%d)\n",
4656 + GTA01_IRQ_MODEM, rc);
4657 +}
4658 +
4659 +MACHINE_START(NEO1973_GTA01, "GTA01")
4660 + .phys_io = S3C2410_PA_UART,
4661 + .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
4662 + .boot_params = S3C2410_SDRAM_PA + 0x100,
4663 + .map_io = gta01_map_io,
4664 + .init_irq = s3c24xx_init_irq,
4665 + .init_machine = gta01_machine_init,
4666 + .timer = &s3c24xx_timer,
4667 +MACHINE_END
4668 Index: linux-2.6.24.7/arch/arm/mach-s3c2410/mach-h1940.c
4669 ===================================================================
4670 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2410/mach-h1940.c 2008-12-11 22:46:07.000000000 +0100
4671 +++ linux-2.6.24.7/arch/arm/mach-s3c2410/mach-h1940.c 2008-12-11 22:46:48.000000000 +0100
4672 @@ -38,6 +38,7 @@
4673 #include <asm/arch/h1940.h>
4674 #include <asm/arch/h1940-latch.h>
4675 #include <asm/arch/fb.h>
4676 +#include <asm/arch/tc.h>
4677 #include <asm/plat-s3c24xx/udc.h>
4678
4679 #include <asm/plat-s3c24xx/clock.h>
4680 @@ -129,6 +130,11 @@ static struct s3c2410_udc_mach_info h194
4681 .vbus_pin_inverted = 1,
4682 };
4683
4684 +static struct s3c2410_ts_mach_info h1940_ts_cfg __initdata = {
4685 + .delay = 10000,
4686 + .presc = 49,
4687 + .oversampling_shift = 2,
4688 +};
4689
4690 /**
4691 * Set lcd on or off
4692 @@ -186,6 +192,7 @@ static struct platform_device *h1940_dev
4693 &s3c_device_i2c,
4694 &s3c_device_iis,
4695 &s3c_device_usbgadget,
4696 + &s3c_device_ts,
4697 &s3c_device_leds,
4698 &s3c_device_bluetooth,
4699 };
4700 @@ -214,6 +221,7 @@ static void __init h1940_init(void)
4701 u32 tmp;
4702
4703 s3c24xx_fb_set_platdata(&h1940_fb_info);
4704 + set_s3c2410ts_info(&h1940_ts_cfg);
4705 s3c24xx_udc_set_platdata(&h1940_udc_cfg);
4706
4707 /* Turn off suspend on both USB ports, and switch the
4708 Index: linux-2.6.24.7/arch/arm/mach-s3c2410/mach-qt2410.c
4709 ===================================================================
4710 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2410/mach-qt2410.c 2008-12-11 22:46:07.000000000 +0100
4711 +++ linux-2.6.24.7/arch/arm/mach-s3c2410/mach-qt2410.c 2008-12-11 22:46:48.000000000 +0100
4712 @@ -1,6 +1,6 @@
4713 /* linux/arch/arm/mach-s3c2410/mach-qt2410.c
4714 *
4715 - * Copyright (C) 2006 by OpenMoko, Inc.
4716 + * Copyright (C) 2006 by Openmoko, Inc.
4717 * Author: Harald Welte <laforge@openmoko.org>
4718 * All rights reserved.
4719 *
4720 @@ -214,7 +214,7 @@ static struct platform_device qt2410_led
4721
4722 /* SPI */
4723
4724 -static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int cs)
4725 +static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int csidx, int cs)
4726 {
4727 switch (cs) {
4728 case BITBANG_CS_ACTIVE:
4729 @@ -321,6 +321,24 @@ static int __init qt2410_tft_setup(char
4730
4731 __setup("tft=", qt2410_tft_setup);
4732
4733 +static struct resource qt2410_button_resources[] = {
4734 + [0] = {
4735 + .start = S3C2410_GPF0,
4736 + .end = S3C2410_GPF0,
4737 + },
4738 + [1] = {
4739 + .start = S3C2410_GPF2,
4740 + .end = S3C2410_GPF2,
4741 + },
4742 +};
4743 +
4744 +struct platform_device qt2410_button_dev = {
4745 + .name ="qt2410-button",
4746 + .num_resources = ARRAY_SIZE(qt2410_button_resources),
4747 + .resource = qt2410_button_resources,
4748 +};
4749 +
4750 +
4751 static void __init qt2410_map_io(void)
4752 {
4753 s3c24xx_init_io(qt2410_iodesc, ARRAY_SIZE(qt2410_iodesc));
4754 Index: linux-2.6.24.7/arch/arm/mach-s3c2410/Makefile
4755 ===================================================================
4756 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2410/Makefile 2008-12-11 22:46:07.000000000 +0100
4757 +++ linux-2.6.24.7/arch/arm/mach-s3c2410/Makefile 2008-12-11 22:46:48.000000000 +0100
4758 @@ -16,6 +16,7 @@ obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o
4759 obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o
4760 obj-$(CONFIG_S3C2410_GPIO) += gpio.o
4761 obj-$(CONFIG_S3C2410_CLOCK) += clock.o
4762 +obj-$(CONFIG_S3C2410_PWM) += pwm.o
4763
4764 # Machine support
4765
4766 @@ -29,3 +30,4 @@ obj-$(CONFIG_MACH_AML_M5900) += mach-aml
4767 obj-$(CONFIG_BAST_PC104_IRQ) += bast-irq.o
4768 obj-$(CONFIG_MACH_VR1000) += mach-vr1000.o usb-simtec.o
4769 obj-$(CONFIG_MACH_QT2410) += mach-qt2410.o
4770 +obj-$(CONFIG_MACH_NEO1973_GTA01)+= mach-gta01.o
4771 Index: linux-2.6.24.7/arch/arm/mach-s3c2410/pwm.c
4772 ===================================================================
4773 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
4774 +++ linux-2.6.24.7/arch/arm/mach-s3c2410/pwm.c 2008-12-11 22:46:48.000000000 +0100
4775 @@ -0,0 +1,277 @@
4776 +/*
4777 + * arch/arm/mach-s3c2410/3c2410-pwm.c
4778 + *
4779 + * Copyright (c) by Javi Roman <javiroman@kernel-labs.org>
4780 + * for the Openmoko Project.
4781 + *
4782 + * S3C2410A SoC PWM support
4783 + *
4784 + * This program is free software; you can redistribute it and/or modify
4785 + * it under the terms of the GNU General Public License as published by
4786 + * the Free Software Foundation; either version 2 of the License, or
4787 + * (at your option) any later version.
4788 + *
4789 + * You should have received a copy of the GNU General Public License
4790 + * along with this program; if not, write to the Free Software
4791 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4792 + *
4793 + */
4794 +
4795 +#include <linux/kernel.h>
4796 +#include <linux/init.h>
4797 +#include <linux/clk.h>
4798 +#include <linux/device.h>
4799 +#include <asm/hardware.h>
4800 +#include <asm/plat-s3c/regs-timer.h>
4801 +#include <asm/arch/pwm.h>
4802 +
4803 +#ifdef CONFIG_PM
4804 + static unsigned long standby_reg_tcon;
4805 + static unsigned long standby_reg_tcfg0;
4806 + static unsigned long standby_reg_tcfg1;
4807 +#endif
4808 +
4809 +int s3c2410_pwm_disable(struct s3c2410_pwm *pwm)
4810 +{
4811 + unsigned long tcon;
4812 +
4813 + /* stop timer */
4814 + tcon = __raw_readl(S3C2410_TCON);
4815 + tcon &= 0xffffff00;
4816 + __raw_writel(tcon, S3C2410_TCON);
4817 +
4818 + clk_disable(pwm->pclk);
4819 + clk_put(pwm->pclk);
4820 +
4821 + return 0;
4822 +}
4823 +EXPORT_SYMBOL_GPL(s3c2410_pwm_disable);
4824 +
4825 +int s3c2410_pwm_init(struct s3c2410_pwm *pwm)
4826 +{
4827 + pwm->pclk = clk_get(NULL, "timers");
4828 + if (IS_ERR(pwm->pclk))
4829 + return PTR_ERR(pwm->pclk);
4830 +
4831 + clk_enable(pwm->pclk);
4832 + pwm->pclk_rate = clk_get_rate(pwm->pclk);
4833 + return 0;
4834 +}
4835 +EXPORT_SYMBOL_GPL(s3c2410_pwm_init);
4836 +
4837 +int s3c2410_pwm_enable(struct s3c2410_pwm *pwm)
4838 +{
4839 + unsigned long tcfg0, tcfg1, tcnt, tcmp;
4840 +
4841 + /* control registers bits */
4842 + tcfg1 = __raw_readl(S3C2410_TCFG1);
4843 + tcfg0 = __raw_readl(S3C2410_TCFG0);
4844 +
4845 + /* divider & scaler slection */
4846 + switch (pwm->timerid) {
4847 + case PWM0:
4848 + tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;
4849 + tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
4850 + break;
4851 + case PWM1:
4852 + tcfg1 &= ~S3C2410_TCFG1_MUX1_MASK;
4853 + tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
4854 + break;
4855 + case PWM2:
4856 + tcfg1 &= ~S3C2410_TCFG1_MUX2_MASK;
4857 + tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
4858 + break;
4859 + case PWM3:
4860 + tcfg1 &= ~S3C2410_TCFG1_MUX3_MASK;
4861 + tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
4862 + break;
4863 + case PWM4:
4864 + /* timer four is not capable of doing PWM */
4865 + break;
4866 + default:
4867 + clk_disable(pwm->pclk);
4868 + clk_put(pwm->pclk);
4869 + return -1;
4870 + }
4871 +
4872 + /* divider & scaler values */
4873 + tcfg1 |= pwm->divider;
4874 + __raw_writel(tcfg1, S3C2410_TCFG1);
4875 +
4876 + switch (pwm->timerid) {
4877 + case PWM0:
4878 + case PWM1:
4879 + tcfg0 |= pwm->prescaler;
4880 + __raw_writel(tcfg0, S3C2410_TCFG0);
4881 + break;
4882 + default:
4883 + if ((tcfg0 | pwm->prescaler) != tcfg0) {
4884 + printk(KERN_WARNING "not changing prescaler of PWM %u,"
4885 + " since it's shared with timer4 (clock tick)\n",
4886 + pwm->timerid);
4887 + }
4888 + break;
4889 + }
4890 +
4891 + /* timer count and compare buffer initial values */
4892 + tcnt = pwm->counter;
4893 + tcmp = pwm->comparer;
4894 +
4895 + __raw_writel(tcnt, S3C2410_TCNTB(pwm->timerid));
4896 + __raw_writel(tcmp, S3C2410_TCMPB(pwm->timerid));
4897 +
4898 + /* ensure timer is stopped */
4899 + s3c2410_pwm_stop(pwm);
4900 +
4901 + return 0;
4902 +}
4903 +EXPORT_SYMBOL_GPL(s3c2410_pwm_enable);
4904 +
4905 +int s3c2410_pwm_start(struct s3c2410_pwm *pwm)
4906 +{
4907 + unsigned long tcon;
4908 +
4909 + tcon = __raw_readl(S3C2410_TCON);
4910 +
4911 + switch (pwm->timerid) {
4912 + case PWM0:
4913 + tcon |= S3C2410_TCON_T0START;
4914 + tcon &= ~S3C2410_TCON_T0MANUALUPD;
4915 + break;
4916 + case PWM1:
4917 + tcon |= S3C2410_TCON_T1START;
4918 + tcon &= ~S3C2410_TCON_T1MANUALUPD;
4919 + break;
4920 + case PWM2:
4921 + tcon |= S3C2410_TCON_T2START;
4922 + tcon &= ~S3C2410_TCON_T2MANUALUPD;
4923 + break;
4924 + case PWM3:
4925 + tcon |= S3C2410_TCON_T3START;
4926 + tcon &= ~S3C2410_TCON_T3MANUALUPD;
4927 + break;
4928 + case PWM4:
4929 + /* timer four is not capable of doing PWM */
4930 + default:
4931 + return -ENODEV;
4932 + }
4933 +
4934 + __raw_writel(tcon, S3C2410_TCON);
4935 +
4936 + return 0;
4937 +}
4938 +EXPORT_SYMBOL_GPL(s3c2410_pwm_start);
4939 +
4940 +int s3c2410_pwm_stop(struct s3c2410_pwm *pwm)
4941 +{
4942 + unsigned long tcon;
4943 +
4944 + tcon = __raw_readl(S3C2410_TCON);
4945 +
4946 + switch (pwm->timerid) {
4947 + case PWM0:
4948 + tcon &= ~0x00000000;
4949 + tcon |= S3C2410_TCON_T0RELOAD;
4950 + tcon |= S3C2410_TCON_T0MANUALUPD;
4951 + break;
4952 + case PWM1:
4953 + tcon &= ~0x00000080;
4954 + tcon |= S3C2410_TCON_T1RELOAD;
4955 + tcon |= S3C2410_TCON_T1MANUALUPD;
4956 + break;
4957 + case PWM2:
4958 + tcon &= ~0x00000800;
4959 + tcon |= S3C2410_TCON_T2RELOAD;
4960 + tcon |= S3C2410_TCON_T2MANUALUPD;
4961 + break;
4962 + case PWM3:
4963 + tcon &= ~0x00008000;
4964 + tcon |= S3C2410_TCON_T3RELOAD;
4965 + tcon |= S3C2410_TCON_T3MANUALUPD;
4966 + break;
4967 + case PWM4:
4968 + /* timer four is not capable of doing PWM */
4969 + default:
4970 + return -ENODEV;
4971 + }
4972 +
4973 + __raw_writel(tcon, S3C2410_TCON);
4974 +
4975 + return 0;
4976 +}
4977 +EXPORT_SYMBOL_GPL(s3c2410_pwm_stop);
4978 +
4979 +int s3c2410_pwm_duty_cycle(int reg_value, struct s3c2410_pwm *pwm)
4980 +{
4981 + __raw_writel(reg_value, S3C2410_TCMPB(pwm->timerid));
4982 +
4983 + return 0;
4984 +}
4985 +EXPORT_SYMBOL_GPL(s3c2410_pwm_duty_cycle);
4986 +
4987 +int s3c2410_pwm_dumpregs(void)
4988 +{
4989 + printk(KERN_INFO "TCON: %08lx, TCFG0: %08lx, TCFG1: %08lx\n",
4990 + (unsigned long) __raw_readl(S3C2410_TCON),
4991 + (unsigned long) __raw_readl(S3C2410_TCFG0),
4992 + (unsigned long) __raw_readl(S3C2410_TCFG1));
4993 +
4994 + return 0;
4995 +}
4996 +EXPORT_SYMBOL_GPL(s3c2410_pwm_dumpregs);
4997 +
4998 +static int __init s3c24xx_pwm_probe(struct platform_device *pdev)
4999 +{
5000 + dev_info(&pdev->dev, "s3c24xx_pwm is registered \n");
5001 +
5002 + return 0;
5003 +}
5004 +
5005 +#ifdef CONFIG_PM
5006 +static int s3c24xx_pwm_suspend(struct platform_device *pdev, pm_message_t state)
5007 +{
5008 + /* PWM config should be kept in suspending */
5009 + standby_reg_tcon = __raw_readl(S3C2410_TCON);
5010 + standby_reg_tcfg0 = __raw_readl(S3C2410_TCFG0);
5011 + standby_reg_tcfg1 = __raw_readl(S3C2410_TCFG1);
5012 +
5013 + return 0;
5014 +}
5015 +
5016 +static int s3c24xx_pwm_resume(struct platform_device *pdev)
5017 +{
5018 + __raw_writel(standby_reg_tcon, S3C2410_TCON);
5019 + __raw_writel(standby_reg_tcfg0, S3C2410_TCFG0);
5020 + __raw_writel(standby_reg_tcfg1, S3C2410_TCFG1);
5021 +
5022 + return 0;
5023 +}
5024 +#else
5025 +#define sc32440_pwm_suspend NULL
5026 +#define sc32440_pwm_resume NULL
5027 +#endif
5028 +
5029 +static struct platform_driver s3c24xx_pwm_driver = {
5030 + .driver = {
5031 + .name = "s3c24xx_pwm",
5032 + .owner = THIS_MODULE,
5033 + },
5034 + .probe = s3c24xx_pwm_probe,
5035 + .suspend = s3c24xx_pwm_suspend,
5036 + .resume = s3c24xx_pwm_resume,
5037 +};
5038 +
5039 +static int __init s3c24xx_pwm_init(void)
5040 +{
5041 + return platform_driver_register(&s3c24xx_pwm_driver);
5042 +}
5043 +
5044 +static void __exit s3c24xx_pwm_exit(void)
5045 +{
5046 +}
5047 +
5048 +MODULE_AUTHOR("Javi Roman <javiroman@kernel-labs.org>");
5049 +MODULE_LICENSE("GPL");
5050 +
5051 +module_init(s3c24xx_pwm_init);
5052 +module_exit(s3c24xx_pwm_exit);
5053 Index: linux-2.6.24.7/arch/arm/mach-s3c2412/s3c2412.c
5054 ===================================================================
5055 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2412/s3c2412.c 2008-12-11 22:46:07.000000000 +0100
5056 +++ linux-2.6.24.7/arch/arm/mach-s3c2412/s3c2412.c 2008-12-11 22:46:48.000000000 +0100
5057 @@ -214,5 +214,8 @@ int __init s3c2412_init(void)
5058 {
5059 printk("S3C2412: Initialising architecture\n");
5060
5061 + /* make sure SD/MMC driver can distinguish 2412 from 2410 */
5062 + s3c_device_sdi.name = "s3c2412-sdi";
5063 +
5064 return sysdev_register(&s3c2412_sysdev);
5065 }
5066 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/bits.h
5067 ===================================================================
5068 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
5069 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/bits.h 2008-12-11 22:46:48.000000000 +0100
5070 @@ -0,0 +1,48 @@
5071 +/*
5072 + * Copyright (C) Samsung Electroincs 2003
5073 + * Author: SW.LEE <hitchcar@samsung.com>
5074 + *
5075 + * This program is free software; you can redistribute it and/or modify
5076 + * it under the terms of the GNU General Public License as published by
5077 + * the Free Software Foundation; either version 2 of the License, or
5078 + * (at your option) any later version.
5079 + *
5080 + */
5081 +
5082 +#ifndef __SW_BITS_H
5083 +#define __SW_BITS_H
5084 +
5085 +#define BIT0 0x00000001
5086 +#define BIT1 0x00000002
5087 +#define BIT2 0x00000004
5088 +#define BIT3 0x00000008
5089 +#define BIT4 0x00000010
5090 +#define BIT5 0x00000020
5091 +#define BIT6 0x00000040
5092 +#define BIT7 0x00000080
5093 +#define BIT8 0x00000100
5094 +#define BIT9 0x00000200
5095 +#define BIT10 0x00000400
5096 +#define BIT11 0x00000800
5097 +#define BIT12 0x00001000
5098 +#define BIT13 0x00002000
5099 +#define BIT14 0x00004000
5100 +#define BIT15 0x00008000
5101 +#define BIT16 0x00010000
5102 +#define BIT17 0x00020000
5103 +#define BIT18 0x00040000
5104 +#define BIT19 0x00080000
5105 +#define BIT20 0x00100000
5106 +#define BIT21 0x00200000
5107 +#define BIT22 0x00400000
5108 +#define BIT23 0x00800000
5109 +#define BIT24 0x01000000
5110 +#define BIT25 0x02000000
5111 +#define BIT26 0x04000000
5112 +#define BIT27 0x08000000
5113 +#define BIT28 0x10000000
5114 +#define BIT29 0x20000000
5115 +#define BIT30 0x40000000
5116 +#define BIT31 0x80000000
5117 +
5118 +#endif
5119 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/camif.c
5120 ===================================================================
5121 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
5122 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/camif.c 2008-12-11 22:46:48.000000000 +0100
5123 @@ -0,0 +1,1047 @@
5124 +/*
5125 + * Copyright (C) 2004 Samsung Electronics
5126 + * SW.LEE <hitchcar@samsung.com>
5127 + *
5128 + * This file is subject to the terms and conditions of the GNU General Public
5129 + * License 2. See the file COPYING in the main directory of this archive
5130 + * for more details.
5131 + */
5132 +
5133 +#include <linux/module.h>
5134 +#include <linux/kernel.h>
5135 +#include <linux/init.h>
5136 +#include <linux/sched.h>
5137 +#include <linux/irq.h>
5138 +#include <linux/completion.h>
5139 +#include <linux/delay.h>
5140 +#include <linux/slab.h>
5141 +#include <linux/vmalloc.h>
5142 +#include <linux/miscdevice.h>
5143 +#include <linux/wait.h>
5144 +#include <linux/miscdevice.h>
5145 +#include <asm/io.h>
5146 +#include <asm/semaphore.h>
5147 +#include <asm/hardware.h>
5148 +#include <asm/uaccess.h>
5149 +#include <linux/device.h>
5150 +#include <linux/dma-mapping.h>
5151 +#include <linux/clk.h>
5152 +
5153 +#ifdef CONFIG_ARCH_S3C24A0A
5154 +#include <asm/arch/S3C24A0.h>
5155 +#include <asm/arch/clocks.h>
5156 +#else
5157 +#include <asm/arch/regs-gpio.h>
5158 +#include <asm/arch/regs-gpioj.h>
5159 +#include <asm/arch/regs-irq.h>
5160 +#endif
5161 +
5162 +#include "cam_reg.h"
5163 +//#define SW_DEBUG
5164 +#define CONFIG_VIDEO_V4L1_COMPAT
5165 +#include <linux/videodev.h>
5166 +#include "camif.h"
5167 +#include "miscdevice.h"
5168 +
5169 +static int camif_dma_burst(camif_cfg_t *);
5170 +static int camif_scaler(camif_cfg_t *);
5171 +
5172 +/* For SXGA Image */
5173 +#define RESERVE_MEM 15*1024*1024
5174 +#define YUV_MEM 10*1024*1024
5175 +#define RGB_MEM (RESERVE_MEM - YUV_MEM)
5176 +
5177 +static int camif_malloc(camif_cfg_t *cfg)
5178 +{
5179 + unsigned int t_size;
5180 + unsigned int daon = cfg->target_x *cfg->target_y;
5181 +
5182 + if(cfg->dma_type & CAMIF_CODEC) {
5183 + if (cfg->fmt & CAMIF_OUT_YCBCR420) {
5184 + t_size = daon * 3 / 2 ;
5185 + }
5186 + else { t_size = daon * 2; /* CAMIF_OUT_YCBCR422 */ }
5187 + t_size = t_size *cfg->pp_num;
5188 +
5189 +#ifndef SAMSUNG_SXGA_CAM
5190 + cfg->pp_virt_buf = dma_alloc_coherent(cfg->v->dev,
5191 + t_size, &cfg->pp_phys_buf,
5192 + GFP_KERNEL);
5193 +#else
5194 + printk(KERN_INFO "Reserving High RAM Addresses \n");
5195 + cfg->pp_phys_buf = PHYS_OFFSET + (MEM_SIZE - RESERVE_MEM);
5196 + cfg->pp_virt_buf = ioremap_nocache(cfg->pp_phys_buf, YUV_MEM);
5197 +#endif
5198 +
5199 + if ( !cfg->pp_virt_buf ) {
5200 + printk(KERN_ERR"CAMERA:Failed to request YCBCR MEM\n");
5201 + return -ENOMEM;
5202 + }
5203 + memset(cfg->pp_virt_buf, 0, t_size);
5204 + cfg->pp_totalsize = t_size;
5205 + return 0;
5206 + }
5207 + if ( cfg->dma_type & CAMIF_PREVIEW ) {
5208 + if (cfg->fmt & CAMIF_RGB16)
5209 + t_size = daon * 2; /* 4byte per two pixel*/
5210 + else {
5211 + assert(cfg->fmt & CAMIF_RGB24);
5212 + t_size = daon * 4; /* 4byte per one pixel */
5213 + }
5214 + t_size = t_size * cfg->pp_num;
5215 +#ifndef SAMSUNG_SXGA_CAM
5216 + cfg->pp_virt_buf = dma_alloc_coherent(cfg->v->dev,
5217 + t_size, &cfg->pp_phys_buf,
5218 + GFP_KERNEL);
5219 +#else
5220 + printk(KERN_INFO "Reserving High RAM Addresses \n");
5221 + cfg->pp_phys_buf = PHYS_OFFSET + (MEM_SIZE - RESERVE_MEM ) + YUV_MEM;
5222 + cfg->pp_virt_buf = ioremap_nocache(cfg->pp_phys_buf,RGB_MEM);
5223 +#endif
5224 + if ( !cfg->pp_virt_buf ) {
5225 + printk(KERN_ERR"CAMERA:Failed to request RGB MEM\n");
5226 + return -ENOMEM;
5227 + }
5228 + memset(cfg->pp_virt_buf, 0, t_size);
5229 + cfg->pp_totalsize = t_size;
5230 + return 0;
5231 + }
5232 +
5233 + return 0; /* Never come. */
5234 +}
5235 +
5236 +static int camif_demalloc(camif_cfg_t *cfg)
5237 +{
5238 +#ifndef SAMSUNG_SXGA_CAM
5239 + if ( cfg->pp_virt_buf ) {
5240 + dma_free_coherent(cfg->v->dev, cfg->pp_totalsize,
5241 + cfg->pp_virt_buf, cfg->pp_phys_buf);
5242 + cfg->pp_virt_buf = 0;
5243 + }
5244 +#else
5245 + iounmap(cfg->pp_virt_buf);
5246 + cfg->pp_virt_buf = 0;
5247 +#endif
5248 + return 0;
5249 +}
5250 +
5251 +/*
5252 + * advise a person to use this func in ISR
5253 + * index value indicates the next frame count to be used
5254 + */
5255 +int camif_g_frame_num(camif_cfg_t *cfg)
5256 +{
5257 + int index = 0;
5258 +
5259 + if (cfg->dma_type & CAMIF_CODEC ) {
5260 + index = FRAME_CNT(readl(camregs + S3C2440_CAM_REG_CICOSTATUS));
5261 + DPRINTK("CAMIF_CODEC frame %d \n", index);
5262 + }
5263 + else {
5264 + assert(cfg->dma_type & CAMIF_PREVIEW );
5265 + index = FRAME_CNT(readl(camregs + S3C2440_CAM_REG_CIPRSTATUS));
5266 + DPRINTK("CAMIF_PREVIEW frame %d 0x%08X \n", index,
5267 + readl(camregs + S3C2440_CAM_REG_CIPRSTATUS));
5268 + }
5269 + cfg->now_frame_num = (index + 2) % 4; /* When 4 PingPong */
5270 + return index; /* meaningless */
5271 +}
5272 +
5273 +static int camif_pp_codec(camif_cfg_t *cfg)
5274 +{
5275 + u32 i, c_size; /* Cb,Cr size */
5276 + u32 one_p_size;
5277 + u32 daon = cfg->target_x * cfg->target_y;
5278 + if (cfg->fmt & CAMIF_OUT_YCBCR420)
5279 + c_size = daon / 4;
5280 + else {
5281 + assert(cfg->fmt & CAMIF_OUT_YCBCR422);
5282 + c_size = daon / 2;
5283 + }
5284 + switch ( cfg->pp_num ) {
5285 + case 1 :
5286 + for (i =0 ; i < 4; i++) {
5287 + cfg->img_buf[i].virt_y = cfg->pp_virt_buf;
5288 + cfg->img_buf[i].phys_y = cfg->pp_phys_buf;
5289 + cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon;
5290 + cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon;
5291 + cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size;
5292 + cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size;
5293 + writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i));
5294 + writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i));
5295 + writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i));
5296 + }
5297 + break;
5298 + case 2:
5299 +#define TRY (( i%2 ) ? 1 :0)
5300 + one_p_size = daon + 2*c_size;
5301 + for (i = 0; i < 4 ; i++) {
5302 + cfg->img_buf[i].virt_y = cfg->pp_virt_buf + TRY * one_p_size;
5303 + cfg->img_buf[i].phys_y = cfg->pp_phys_buf + TRY * one_p_size;
5304 + cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + TRY * one_p_size;
5305 + cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + TRY * one_p_size;
5306 + cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + TRY * one_p_size;
5307 + cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + TRY * one_p_size;
5308 + writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i));
5309 + writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i));
5310 + writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i));
5311 + }
5312 + break;
5313 + case 4:
5314 + one_p_size = daon + 2*c_size;
5315 + for (i = 0; i < 4 ; i++) {
5316 + cfg->img_buf[i].virt_y = cfg->pp_virt_buf + i * one_p_size;
5317 + cfg->img_buf[i].phys_y = cfg->pp_phys_buf + i * one_p_size;
5318 + cfg->img_buf[i].virt_cb = cfg->pp_virt_buf + daon + i * one_p_size;
5319 + cfg->img_buf[i].phys_cb = cfg->pp_phys_buf + daon + i * one_p_size;
5320 + cfg->img_buf[i].virt_cr = cfg->pp_virt_buf + daon + c_size + i * one_p_size;
5321 + cfg->img_buf[i].phys_cr = cfg->pp_phys_buf + daon + c_size + i * one_p_size;
5322 + writel(cfg->img_buf[i].phys_y, camregs + S3C2440_CAM_REG_CICOYSA(i));
5323 + writel(cfg->img_buf[i].phys_cb, camregs + S3C2440_CAM_REG_CICOCBSA(i));
5324 + writel(cfg->img_buf[i].phys_cr, camregs + S3C2440_CAM_REG_CICOCRSA(i));
5325 + }
5326 + break;
5327 + default:
5328 + printk("Invalid PingPong Number %d \n",cfg->pp_num);
5329 + panic("halt\n");
5330 +}
5331 + return 0;
5332 +}
5333 +
5334 +/* RGB Buffer Allocation */
5335 +static int camif_pp_preview(camif_cfg_t *cfg)
5336 +{
5337 + int i;
5338 + u32 daon = cfg->target_x * cfg->target_y;
5339 +
5340 + if(cfg->fmt & CAMIF_RGB24)
5341 + daon = daon * 4 ;
5342 + else {
5343 + assert (cfg->fmt & CAMIF_RGB16);
5344 + daon = daon *2;
5345 + }
5346 + switch ( cfg->pp_num ) {
5347 + case 1:
5348 + for ( i = 0; i < 4 ; i++ ) {
5349 + cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf ;
5350 + cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf ;
5351 + writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i));
5352 + }
5353 + break;
5354 + case 2:
5355 + for ( i = 0; i < 4 ; i++) {
5356 + cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf + TRY * daon;
5357 + cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf + TRY * daon;
5358 + writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i));
5359 + }
5360 + break;
5361 + case 4:
5362 + for ( i = 0; i < 4 ; i++) {
5363 + cfg->img_buf[i].virt_rgb = cfg->pp_virt_buf + i * daon;
5364 + cfg->img_buf[i].phys_rgb = cfg->pp_phys_buf + i * daon;
5365 + writel(cfg->img_buf[i].phys_rgb, camregs + S3C2440_CAM_REG_CICOCRSA(i));
5366 + }
5367 + break;
5368 + default:
5369 + printk("Invalid PingPong Number %d \n",cfg->pp_num);
5370 + panic("halt\n");
5371 + }
5372 + return 0;
5373 +}
5374 +
5375 +static int camif_pingpong(camif_cfg_t *cfg)
5376 +{
5377 + if (cfg->dma_type & CAMIF_CODEC ) {
5378 + camif_pp_codec(cfg);
5379 + }
5380 +
5381 + if ( cfg->dma_type & CAMIF_PREVIEW) {
5382 + camif_pp_preview(cfg);
5383 + }
5384 + return 0;
5385 +}
5386 +
5387 +
5388 +/*********** Image Convert *******************************/
5389 +/* Return Format
5390 + * Supported by Hardware
5391 + * V4L2_PIX_FMT_YUV420,
5392 + * V4L2_PIX_FMT_YUV422P,
5393 + * V4L2_PIX_FMT_BGR32 (BGR4)
5394 + * -----------------------------------
5395 + * V4L2_PIX_FMT_RGB565(X)
5396 + * Currenly 2byte --> BGR656 Format
5397 + * S3C2440A,S3C24A0 supports vairants with reversed FMT_RGB565
5398 + i.e blue toward the least, red towards the most significant bit
5399 + -- by SW.LEE
5400 + */
5401 +
5402 +
5403 +/*
5404 + * After calling camif_g_frame_num,
5405 + * this func must be called
5406 + */
5407 +u8 * camif_g_frame(camif_cfg_t *cfg)
5408 +{
5409 + u8 * ret = NULL;
5410 + int cnt = cfg->now_frame_num;
5411 +
5412 + if(cfg->dma_type & CAMIF_PREVIEW) {
5413 + ret = cfg->img_buf[cnt].virt_rgb;
5414 + }
5415 + if (cfg->dma_type & CAMIF_CODEC) {
5416 + ret = cfg->img_buf[cnt].virt_y;
5417 + }
5418 + return ret;
5419 +}
5420 +
5421 +/* This function must be called in module initial time */
5422 +static int camif_source_fmt(camif_gc_t *gc)
5423 +{
5424 + u32 cmd = 0;
5425 +
5426 + /* Configure CISRCFMT --Source Format */
5427 + if (gc->itu_fmt & CAMIF_ITU601) {
5428 + cmd = CAMIF_ITU601;
5429 + }
5430 + else {
5431 + assert ( gc->itu_fmt & CAMIF_ITU656);
5432 + cmd = CAMIF_ITU656;
5433 + }
5434 + cmd |= SOURCE_HSIZE(gc->source_x)| SOURCE_VSIZE(gc->source_y);
5435 + /* Order422 */
5436 + cmd |= gc->order422;
5437 + writel(cmd, camregs + S3C2440_CAM_REG_CISRCFMT);
5438 +
5439 + return 0 ;
5440 +}
5441 +
5442 +
5443 +/*
5444 + * Codec Input YCBCR422 will be Fixed
5445 + */
5446 +static int camif_target_fmt(camif_cfg_t *cfg)
5447 +{
5448 + u32 cmd = 0;
5449 +
5450 + if (cfg->dma_type & CAMIF_CODEC) {
5451 + /* YCBCR setting */
5452 + cmd = TARGET_HSIZE(cfg->target_x)| TARGET_VSIZE(cfg->target_y);
5453 + if ( cfg->fmt & CAMIF_OUT_YCBCR420 ) {
5454 + cmd |= OUT_YCBCR420|IN_YCBCR422;
5455 + }
5456 + else {
5457 + assert(cfg->fmt & CAMIF_OUT_YCBCR422);
5458 + cmd |= OUT_YCBCR422|IN_YCBCR422;
5459 + }
5460 + writel(cmd | cfg->flip, camregs + S3C2440_CAM_REG_CICOTRGFMT);
5461 +
5462 + } else {
5463 + assert(cfg->dma_type & CAMIF_PREVIEW);
5464 + writel(TARGET_HSIZE(cfg->target_x)|TARGET_VSIZE(cfg->target_y)|cfg->flip,
5465 + camregs + S3C2440_CAM_REG_CIPRTRGFMT);
5466 + }
5467 + return 0;
5468 +}
5469 +
5470 +void camif_change_flip(camif_cfg_t *cfg)
5471 +{
5472 + u32 cmd = readl(camregs + S3C2440_CAM_REG_CICOTRGFMT);
5473 +
5474 + cmd &= ~(BIT14|BIT15);
5475 + cmd |= cfg->flip;
5476 +
5477 + writel(cmd, camregs + S3C2440_CAM_REG_CICOTRGFMT);
5478 +}
5479 +
5480 +
5481 +
5482 +/* Must:
5483 + * Before calling this function,
5484 + * you must use "camif_dynamic_open"
5485 + * If you want to enable both CODEC and preview
5486 + * you must do it at the same time.
5487 + */
5488 +int camif_capture_start(camif_cfg_t *cfg)
5489 +{
5490 + u32 n_cmd = 0; /* Next Command */
5491 +
5492 + switch(cfg->exec) {
5493 + case CAMIF_BOTH_DMA_ON:
5494 + camif_reset(CAMIF_RESET, 0); /* Flush Camera Core Buffer */
5495 + writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) |
5496 + SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL);
5497 + writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) |
5498 + SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL);
5499 + n_cmd = CAMIF_CAP_PREVIEW_ON | CAMIF_CAP_CODEC_ON;
5500 + break;
5501 + case CAMIF_DMA_ON:
5502 + camif_reset(CAMIF_RESET, 0); /* Flush Camera Core Buffer */
5503 + if (cfg->dma_type&CAMIF_CODEC) {
5504 + writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) |
5505 + SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL);
5506 + n_cmd = CAMIF_CAP_CODEC_ON;
5507 + } else {
5508 + writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) |
5509 + SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL);
5510 + n_cmd = CAMIF_CAP_PREVIEW_ON;
5511 + }
5512 +
5513 + /* wait until Sync Time expires */
5514 + /* First settting, to wait VSYNC fall */
5515 + /* By VESA spec,in 640x480 @60Hz
5516 + MAX Delay Time is around 64us which "while" has.*/
5517 + while(VSYNC & readl(camregs + S3C2440_CAM_REG_CICOSTATUS));
5518 + break;
5519 + default:
5520 + break;
5521 +}
5522 + writel(n_cmd | CAMIF_CAP_ON, camregs + S3C2440_CAM_REG_CIIMGCPT);
5523 + return 0;
5524 +}
5525 +
5526 +
5527 +int camif_capture_stop(camif_cfg_t *cfg)
5528 +{
5529 + u32 n_cmd = readl(camregs + S3C2440_CAM_REG_CIIMGCPT); /* Next Command */
5530 +
5531 + switch(cfg->exec) {
5532 + case CAMIF_BOTH_DMA_OFF:
5533 + writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) &
5534 + ~SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL);
5535 + writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) &
5536 + ~SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL);
5537 + n_cmd = 0;
5538 + break;
5539 + case CAMIF_DMA_OFF_L_IRQ: /* fall thru */
5540 + case CAMIF_DMA_OFF:
5541 + if (cfg->dma_type&CAMIF_CODEC) {
5542 + writel(readl(camregs + S3C2440_CAM_REG_CICOSCCTRL) &
5543 + ~SCALERSTART, camregs + S3C2440_CAM_REG_CICOSCCTRL);
5544 + n_cmd &= ~CAMIF_CAP_CODEC_ON;
5545 + if (!(n_cmd & CAMIF_CAP_PREVIEW_ON))
5546 + n_cmd = 0;
5547 + } else {
5548 + writel(readl(camregs + S3C2440_CAM_REG_CIPRSCCTRL) &
5549 + ~SCALERSTART, camregs + S3C2440_CAM_REG_CIPRSCCTRL);
5550 + n_cmd &= ~CAMIF_CAP_PREVIEW_ON;
5551 + if (!(n_cmd & CAMIF_CAP_CODEC_ON))
5552 + n_cmd = 0;
5553 + }
5554 + break;
5555 + default:
5556 + panic("Unexpected \n");
5557 + }
5558 + writel(n_cmd, camregs + S3C2440_CAM_REG_CIIMGCPT);
5559 +
5560 + if (cfg->exec == CAMIF_DMA_OFF_L_IRQ) { /* Last IRQ */
5561 + if (cfg->dma_type & CAMIF_CODEC)
5562 + writel(readl(camregs + S3C2440_CAM_REG_CICOCTRL) |
5563 + LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CICOCTRL);
5564 + else
5565 + writel(readl(camregs + S3C2440_CAM_REG_CIPRCTRL) |
5566 + LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CIPRCTRL);
5567 + }
5568 +#if 0
5569 + else { /* to make internal state machine of CAMERA stop */
5570 + camif_reset(CAMIF_RESET, 0);
5571 + }
5572 +#endif
5573 + return 0;
5574 +}
5575 +
5576 +
5577 +/* LastIRQEn is autoclear */
5578 +void camif_last_irq_en(camif_cfg_t *cfg)
5579 +{
5580 + if ((cfg->exec == CAMIF_BOTH_DMA_ON) || (cfg->dma_type & CAMIF_CODEC))
5581 + writel(readl(camregs + S3C2440_CAM_REG_CICOCTRL) |
5582 + LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CICOCTRL);
5583 +
5584 + if ((cfg->exec == CAMIF_BOTH_DMA_ON) || !(cfg->dma_type & CAMIF_CODEC))
5585 + writel(readl(camregs + S3C2440_CAM_REG_CIPRCTRL) |
5586 + LAST_IRQ_EN, camregs + S3C2440_CAM_REG_CIPRCTRL);
5587 +}
5588 +
5589 +static int
5590 +camif_scaler_internal(u32 srcWidth, u32 dstWidth, u32 *ratio, u32 *shift)
5591 +{
5592 + if(srcWidth>=64*dstWidth){
5593 + printk(KERN_ERR"CAMERA:out of prescaler range: srcWidth /dstWidth = %d(< 64)\n",
5594 + srcWidth/dstWidth);
5595 + return 1;
5596 + }
5597 + else if(srcWidth>=32*dstWidth){
5598 + *ratio=32;
5599 + *shift=5;
5600 + }
5601 + else if(srcWidth>=16*dstWidth){
5602 + *ratio=16;
5603 + *shift=4;
5604 + }
5605 + else if(srcWidth>=8*dstWidth){
5606 + *ratio=8;
5607 + *shift=3;
5608 + }
5609 + else if(srcWidth>=4*dstWidth){
5610 + *ratio=4;
5611 + *shift=2;
5612 + }
5613 + else if(srcWidth>=2*dstWidth){
5614 + *ratio=2;
5615 + *shift=1;
5616 + }
5617 + else {
5618 + *ratio=1;
5619 + *shift=0;
5620 + }
5621 + return 0;
5622 +}
5623 +
5624 +
5625 +int camif_g_fifo_status(camif_cfg_t *cfg)
5626 +{
5627 + u32 reg;
5628 +
5629 + if (cfg->dma_type & CAMIF_CODEC) {
5630 + u32 flag = CO_OVERFLOW_Y | CO_OVERFLOW_CB | CO_OVERFLOW_CR;
5631 + reg = readl(camregs + S3C2440_CAM_REG_CICOSTATUS);
5632 + if (reg & flag) {
5633 + printk("CODEC: FIFO error(0x%08x) and corrected\n",reg);
5634 + /* FIFO Error Count ++ */
5635 + writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) |
5636 + CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR,
5637 + camregs + S3C2440_CAM_REG_CIWDOFST);
5638 +
5639 + writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) &
5640 + ~(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR),
5641 + camregs + S3C2440_CAM_REG_CIWDOFST);
5642 + return 1; /* Error */
5643 + }
5644 + }
5645 + if (cfg->dma_type & CAMIF_PREVIEW) {
5646 + u32 flag = PR_OVERFLOW_CB | PR_OVERFLOW_CR;
5647 + reg = readl(camregs + S3C2440_CAM_REG_CIPRSTATUS);
5648 + if (reg & flag) {
5649 + printk("PREVIEW:FIFO error(0x%08x) and corrected\n",reg);
5650 + writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) |
5651 + CO_FIFO_CB | CO_FIFO_CR,
5652 + camregs + S3C2440_CAM_REG_CIWDOFST);
5653 +
5654 + writel(readl(camregs + S3C2440_CAM_REG_CIWDOFST) &
5655 + ~(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR),
5656 + camregs + S3C2440_CAM_REG_CIWDOFST);
5657 + /* FIFO Error Count ++ */
5658 + return 1; /* Error */
5659 + }
5660 + }
5661 + return 0; /* No Error */
5662 +}
5663 +
5664 +
5665 +/* Policy:
5666 + * if codec or preview define the win offset,
5667 + * other must follow that value.
5668 + */
5669 +int camif_win_offset(camif_gc_t *gc )
5670 +{
5671 + u32 h = gc->win_hor_ofst;
5672 + u32 v = gc->win_ver_ofst;
5673 +
5674 + /*Clear Overflow */
5675 + writel(CO_FIFO_Y | CO_FIFO_CB | CO_FIFO_CR | PR_FIFO_CB | PR_FIFO_CB,
5676 + camregs + S3C2440_CAM_REG_CIWDOFST);
5677 + writel(0, camregs + S3C2440_CAM_REG_CIWDOFST);
5678 +
5679 + if (!h && !v) {
5680 + writel(0, camregs + S3C2440_CAM_REG_CIWDOFST);
5681 + return 0;
5682 + }
5683 +
5684 + writel(WINOFEN | WINHOROFST(h) | WINVEROFST(v), camregs + S3C2440_CAM_REG_CIWDOFST);
5685 + return 0;
5686 +}
5687 +
5688 +/*
5689 + * when you change the resolution in a specific camera,
5690 + * sometimes, it is necessary to change the polarity
5691 + * -- SW.LEE
5692 + */
5693 +static void camif_polarity(camif_gc_t *gc)
5694 +{
5695 + u32 cmd = readl(camregs + S3C2440_CAM_REG_CIGCTRL);;
5696 +
5697 + cmd = cmd & ~(BIT26|BIT25|BIT24); /* clear polarity */
5698 + if (gc->polarity_pclk)
5699 + cmd |= GC_INVPOLPCLK;
5700 + if (gc->polarity_vsync)
5701 + cmd |= GC_INVPOLVSYNC;
5702 + if (gc->polarity_href)
5703 + cmd |= GC_INVPOLHREF;
5704 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
5705 + cmd, camregs + S3C2440_CAM_REG_CIGCTRL);
5706 +}
5707 +
5708 +
5709 +int camif_dynamic_open(camif_cfg_t *cfg)
5710 +{
5711 + camif_win_offset(cfg->gc);
5712 + camif_polarity(cfg->gc);
5713 +
5714 + if(camif_scaler(cfg)) {
5715 + printk(KERN_ERR "CAMERA:Preview Scaler, Change WinHorOfset or Target Size\n");
5716 + return 1;
5717 + }
5718 + camif_target_fmt(cfg);
5719 + if (camif_dma_burst(cfg)) {
5720 + printk(KERN_ERR "CAMERA:DMA Busrt Length Error \n");
5721 + return 1;
5722 + }
5723 + if(camif_malloc(cfg) ) {
5724 + printk(KERN_ERR " Instead of using consistent_alloc()\n"
5725 + " lease use dedicated memory allocation for DMA memory\n");
5726 + return -1;
5727 + }
5728 + camif_pingpong(cfg);
5729 + return 0;
5730 +}
5731 +
5732 +int camif_dynamic_close(camif_cfg_t *cfg)
5733 +{
5734 + camif_demalloc(cfg);
5735 + return 0;
5736 +}
5737 +
5738 +static int camif_target_area(camif_cfg_t *cfg)
5739 +{
5740 + u32 rect = cfg->target_x * cfg->target_y;
5741 +
5742 + if (cfg->dma_type & CAMIF_CODEC)
5743 + writel(rect, camregs + S3C2440_CAM_REG_CICOTAREA);
5744 +
5745 + if (cfg->dma_type & CAMIF_PREVIEW)
5746 + writel(rect, camregs + S3C2440_CAM_REG_CIPRTAREA);
5747 +
5748 + return 0;
5749 +}
5750 +
5751 +static int inline camif_hw_reg(camif_cfg_t *cfg)
5752 +{
5753 + u32 cmd = 0;
5754 +
5755 + if (cfg->dma_type & CAMIF_CODEC) {
5756 + writel(PRE_SHIFT(cfg->sc.shfactor) |
5757 + PRE_HRATIO(cfg->sc.prehratio) |
5758 + PRE_VRATIO(cfg->sc.prevratio),
5759 + camregs + S3C2440_CAM_REG_CICOSCPRERATIO);
5760 + writel(PRE_DST_WIDTH(cfg->sc.predst_x) |
5761 + PRE_DST_HEIGHT(cfg->sc.predst_y),
5762 + camregs + S3C2440_CAM_REG_CICOSCPREDST);
5763 +
5764 + /* Differ from Preview */
5765 + if (cfg->sc.scalerbypass)
5766 + cmd |= SCALERBYPASS;
5767 + if (cfg->sc.scaleup_h & cfg->sc.scaleup_v)
5768 + cmd |= BIT30|BIT29;
5769 + writel(cmd | MAIN_HRATIO(cfg->sc.mainhratio) |
5770 + MAIN_VRATIO(cfg->sc.mainvratio),
5771 + camregs + S3C2440_CAM_REG_CICOSCCTRL);
5772 + return 0;
5773 + }
5774 + if (cfg->dma_type & CAMIF_PREVIEW) {
5775 + writel(PRE_SHIFT(cfg->sc.shfactor) |
5776 + PRE_HRATIO(cfg->sc.prehratio) |
5777 + PRE_VRATIO(cfg->sc.prevratio),
5778 + camregs + S3C2440_CAM_REG_CIPRSCPRERATIO);
5779 + writel(PRE_DST_WIDTH(cfg->sc.predst_x) |
5780 + PRE_DST_HEIGHT(cfg->sc.predst_y),
5781 + camregs + S3C2440_CAM_REG_CIPRSCPREDST);
5782 + /* Differ from Codec */
5783 + if (cfg->fmt & CAMIF_RGB24)
5784 + cmd |= RGB_FMT24;
5785 + if (cfg->sc.scaleup_h & cfg->sc.scaleup_v)
5786 + cmd |= BIT29 | BIT28;
5787 + writel(cmd | MAIN_HRATIO(cfg->sc.mainhratio) | S_METHOD |
5788 + MAIN_VRATIO(cfg->sc.mainvratio),
5789 + camregs + S3C2440_CAM_REG_CIPRSCCTRL);
5790 + return 0;
5791 + }
5792 +
5793 + panic("CAMERA:DMA_TYPE Wrong \n");
5794 + return 0;
5795 +}
5796 +
5797 +
5798 +/* Configure Pre-scaler control & main scaler control register */
5799 +static int camif_scaler(camif_cfg_t *cfg)
5800 +{
5801 + int tx = cfg->target_x, ty = cfg->target_y;
5802 + int sx, sy;
5803 +
5804 + if (tx <= 0 || ty <= 0)
5805 + panic("CAMERA: Invalid target size \n");
5806 +
5807 + sx = cfg->gc->source_x - 2 * cfg->gc->win_hor_ofst;
5808 + sy = cfg->gc->source_y - 2 * cfg->gc->win_ver_ofst;
5809 + if (sx <= 0 || sy <= 0)
5810 + panic("CAMERA: Invalid source size \n");
5811 +
5812 + cfg->sc.modified_src_x = sx;
5813 + cfg->sc.modified_src_y = sy;
5814 +
5815 + /* Pre-scaler control register 1 */
5816 + camif_scaler_internal(sx, tx, &cfg->sc.prehratio, &cfg->sc.hfactor);
5817 + camif_scaler_internal(sy, ty, &cfg->sc.prevratio, &cfg->sc.vfactor);
5818 +
5819 + if (cfg->dma_type & CAMIF_PREVIEW)
5820 + if ((sx / cfg->sc.prehratio) > 640) {
5821 + printk(KERN_INFO "CAMERA: Internal Preview line "
5822 + "buffer is 640 pixels\n");
5823 + return 1; /* Error */
5824 + }
5825 +
5826 + cfg->sc.shfactor = 10 - (cfg->sc.hfactor + cfg->sc.vfactor);
5827 + /* Pre-scaler control register 2 */
5828 + cfg->sc.predst_x = sx / cfg->sc.prehratio;
5829 + cfg->sc.predst_y = sy / cfg->sc.prevratio;
5830 +
5831 + /* Main-scaler control register */
5832 + cfg->sc.mainhratio = (sx << 8) / (tx << cfg->sc.hfactor);
5833 + cfg->sc.mainvratio = (sy << 8) / (ty << cfg->sc.vfactor);
5834 + DPRINTK(" sx %d, sy %d tx %d ty %d \n", sx, sy, tx, ty);
5835 + DPRINTK(" hfactor %d vfactor %d \n",cfg->sc.hfactor, cfg->sc.vfactor);
5836 +
5837 + cfg->sc.scaleup_h = (sx <= tx) ? 1: 0;
5838 + cfg->sc.scaleup_v = (sy <= ty) ? 1: 0;
5839 + if (cfg->sc.scaleup_h != cfg->sc.scaleup_v)
5840 + printk(KERN_ERR "scaleup_h must be same to scaleup_v \n");
5841 +
5842 + camif_hw_reg(cfg);
5843 + camif_target_area(cfg);
5844 +
5845 + return 0;
5846 +}
5847 +
5848 +/******************************************************
5849 + CalculateBurstSize - Calculate the busrt lengths
5850 + Description:
5851 + - dstHSize: the number of the byte of H Size.
5852 +********************************************************/
5853 +static void camif_g_bsize(u32 hsize, u32 *mburst, u32 *rburst)
5854 +{
5855 + u32 tmp;
5856 +
5857 + tmp = (hsize / 4) % 16;
5858 + switch(tmp) {
5859 + case 0:
5860 + *mburst=16;
5861 + *rburst=16;
5862 + break;
5863 + case 4:
5864 + *mburst=16;
5865 + *rburst=4;
5866 + break;
5867 + case 8:
5868 + *mburst=16;
5869 + *rburst=8;
5870 + break;
5871 + default:
5872 + tmp=(hsize / 4) % 8;
5873 + switch(tmp) {
5874 + case 0:
5875 + *mburst = 8;
5876 + *rburst = 8;
5877 + break;
5878 + case 4:
5879 + *mburst = 8;
5880 + *rburst = 4;
5881 + default:
5882 + *mburst = 4;
5883 + tmp = (hsize / 4) % 4;
5884 + *rburst= (tmp) ? tmp: 4;
5885 + break;
5886 + }
5887 + break;
5888 + }
5889 +}
5890 +
5891 +/* SXGA 1028x1024*/
5892 +/* XGA 1024x768 */
5893 +/* SVGA 800x600 */
5894 +/* VGA 640x480 */
5895 +/* CIF 352x288 */
5896 +/* QVGA 320x240 */
5897 +/* QCIF 176x144 */
5898 +/* ret val
5899 + 1 : DMA Size Error
5900 +*/
5901 +#define BURST_ERR 1
5902 +static int camif_dma_burst(camif_cfg_t *cfg)
5903 +{
5904 + int width = cfg->target_x;
5905 +
5906 + if (cfg->dma_type & CAMIF_CODEC ) {
5907 + u32 yburst_m, yburst_r;
5908 + u32 cburst_m, cburst_r;
5909 + /* CODEC DMA WIDHT is multiple of 16 */
5910 + if (width % 16)
5911 + return BURST_ERR; /* DMA Burst Length Error */
5912 + camif_g_bsize(width, &yburst_m, &yburst_r);
5913 + camif_g_bsize(width / 2, &cburst_m, &cburst_r);
5914 +
5915 + writel(YBURST_M(yburst_m) | CBURST_M(cburst_m) |
5916 + YBURST_R(yburst_r) | CBURST_R(cburst_r),
5917 + camregs + S3C2440_CAM_REG_CICOCTRL);
5918 + }
5919 +
5920 + if (cfg->dma_type & CAMIF_PREVIEW) {
5921 + u32 rgburst_m, rgburst_r;
5922 + if(cfg->fmt == CAMIF_RGB24) {
5923 + if (width % 2)
5924 + return BURST_ERR; /* DMA Burst Length Error */
5925 + camif_g_bsize(width*4,&rgburst_m,&rgburst_r);
5926 + } else { /* CAMIF_RGB16 */
5927 + if ((width / 2) %2)
5928 + return BURST_ERR; /* DMA Burst Length Error */
5929 + camif_g_bsize(width*2,&rgburst_m,&rgburst_r);
5930 + }
5931 +
5932 + writel(RGBURST_M(rgburst_m) | RGBURST_R(rgburst_r),
5933 + camregs + S3C2440_CAM_REG_CIPRCTRL);
5934 + }
5935 + return 0;
5936 +}
5937 +
5938 +static int camif_gpio_init(void)
5939 +{
5940 +#ifdef CONFIG_ARCH_S3C24A0A
5941 + /* S3C24A0A has the dedicated signal pins for Camera */
5942 +#else
5943 + s3c2410_gpio_cfgpin(S3C2440_GPJ0, S3C2440_GPJ0_CAMDATA0);
5944 + s3c2410_gpio_cfgpin(S3C2440_GPJ1, S3C2440_GPJ1_CAMDATA1);
5945 + s3c2410_gpio_cfgpin(S3C2440_GPJ2, S3C2440_GPJ2_CAMDATA2);
5946 + s3c2410_gpio_cfgpin(S3C2440_GPJ3, S3C2440_GPJ3_CAMDATA3);
5947 + s3c2410_gpio_cfgpin(S3C2440_GPJ4, S3C2440_GPJ4_CAMDATA4);
5948 + s3c2410_gpio_cfgpin(S3C2440_GPJ5, S3C2440_GPJ5_CAMDATA5);
5949 + s3c2410_gpio_cfgpin(S3C2440_GPJ6, S3C2440_GPJ6_CAMDATA6);
5950 + s3c2410_gpio_cfgpin(S3C2440_GPJ7, S3C2440_GPJ7_CAMDATA7);
5951 +
5952 + s3c2410_gpio_cfgpin(S3C2440_GPJ8, S3C2440_GPJ8_CAMPCLK);
5953 + s3c2410_gpio_cfgpin(S3C2440_GPJ9, S3C2440_GPJ9_CAMVSYNC);
5954 + s3c2410_gpio_cfgpin(S3C2440_GPJ10, S3C2440_GPJ10_CAMHREF);
5955 + s3c2410_gpio_cfgpin(S3C2440_GPJ11, S3C2440_GPJ11_CAMCLKOUT);
5956 + s3c2410_gpio_cfgpin(S3C2440_GPJ12, S3C2440_GPJ12_CAMRESET);
5957 +#endif
5958 + return 0;
5959 +}
5960 +
5961 +
5962 +#define ROUND_ADD 0x100000
5963 +
5964 +#ifdef CONFIG_ARCH_S3C24A0A
5965 +int camif_clock_init(camif_gc_t *gc)
5966 +{
5967 + unsigned int upll, camclk_div, camclk;
5968 +
5969 + if (!gc) camclk = 24000000;
5970 + else {
5971 + camclk = gc->camclk;
5972 + if (camclk > 48000000)
5973 + printk(KERN_ERR "Wrong Camera Clock\n");
5974 + }
5975 +
5976 + CLKCON |= CLKCON_CAM_UPLL | CLKCON_CAM_HCLK;
5977 + upll = get_bus_clk(GET_UPLL);
5978 + printk(KERN_INFO "CAMERA:Default UPLL %08d and Assing 96Mhz to UPLL\n",upll);
5979 + UPLLCON = FInsrt(56, fPLL_MDIV) | FInsrt(2, fPLL_PDIV)| FInsrt(1, fPLL_SDIV);
5980 + upll = get_bus_clk(GET_UPLL);
5981 +
5982 + camclk_div = (upll+ROUND_ADD) / camclk - 1;
5983 + CLKDIVN = (CLKDIVN & 0xFF) | CLKDIVN_CAM(camclk_div);
5984 + printk(KERN_INFO"CAMERA:upll %d MACRO 0x%08X CLKDIVN 0x%08X \n",
5985 + upll, CLKDIVN_CAM(camclk_div), CLKDIVN);
5986 + writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT); /* Dummy ? */
5987 +
5988 + return 0;
5989 +}
5990 +#else
5991 +int camif_clock_init(camif_gc_t *gc)
5992 +{
5993 + unsigned int camclk;
5994 + struct clk *clk_camif = clk_get(NULL, "camif");
5995 + struct clk *clk_camif_upll = clk_get(NULL, "camif-upll");
5996 +
5997 + if (!gc)
5998 + camclk = 24000000;
5999 + else {
6000 + camclk = gc->camclk;
6001 + if (camclk > 48000000)
6002 + printk(KERN_ERR "Wrong Camera Clock\n");
6003 + }
6004 +
6005 + clk_set_rate(clk_camif, camclk);
6006 +
6007 + clk_enable(clk_camif);
6008 + clk_enable(clk_camif_upll);
6009 +
6010 +
6011 +#if 0
6012 + CLKCON |= CLKCON_CAMIF;
6013 + upll = elfin_get_bus_clk(GET_UPLL);
6014 + printk(KERN_INFO "CAMERA:Default UPLL %08d and Assing 96Mhz to UPLL\n",upll);
6015 + {
6016 + UPLLCON = FInsrt(60, fPLL_MDIV) | FInsrt(4, fPLL_PDIV)| FInsrt(1, fPLL_SDIV);
6017 + CLKDIVN |= DIVN_UPLL; /* For USB */
6018 + upll = elfin_get_bus_clk(GET_UPLL);
6019 + }
6020 +
6021 + camclk_div = (upll+ROUND_ADD) /(camclk * 2) -1;
6022 + CAMDIVN = CAMCLK_SET_DIV|(camclk_div&0xf);
6023 + printk(KERN_INFO "CAMERA:upll %08d cam_clk %08d CAMDIVN 0x%08x \n",upll,camclk, CAMDIVN);
6024 +#endif
6025 + writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT); /* Dummy ? */
6026 +
6027 + return 0;
6028 +}
6029 +#endif
6030 +
6031 +/*
6032 + Reset Camera IP in CPU
6033 + Reset External Sensor
6034 + */
6035 +void camif_reset(int is, int delay)
6036 +{
6037 + switch (is) {
6038 + case CAMIF_RESET:
6039 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
6040 + GC_SWRST,
6041 + camregs + S3C2440_CAM_REG_CIGCTRL);
6042 + mdelay(1);
6043 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) &
6044 + ~GC_SWRST,
6045 + camregs + S3C2440_CAM_REG_CIGCTRL);
6046 + break;
6047 + case CAMIF_EX_RESET_AH: /*Active High */
6048 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) &
6049 + ~GC_CAMRST,
6050 + camregs + S3C2440_CAM_REG_CIGCTRL);
6051 + udelay(200);
6052 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
6053 + GC_CAMRST,
6054 + camregs + S3C2440_CAM_REG_CIGCTRL);
6055 + udelay(delay);
6056 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) &
6057 + ~GC_CAMRST,
6058 + camregs + S3C2440_CAM_REG_CIGCTRL);
6059 + break;
6060 + case CAMIF_EX_RESET_AL: /*Active Low */
6061 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
6062 + GC_CAMRST,
6063 + camregs + S3C2440_CAM_REG_CIGCTRL);
6064 + udelay(200);
6065 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) &
6066 + ~GC_CAMRST,
6067 + camregs + S3C2440_CAM_REG_CIGCTRL);
6068 + udelay(delay);
6069 + writel(readl(camregs + S3C2440_CAM_REG_CIGCTRL) |
6070 + GC_CAMRST,
6071 + camregs + S3C2440_CAM_REG_CIGCTRL);
6072 + break;
6073 + default:
6074 + break;
6075 + }
6076 +}
6077 +
6078 +/* For Camera Operation,
6079 + * we can give the high priority to REQ2 of ARBITER1
6080 + */
6081 +
6082 +/* Please move me into proper place
6083 + * camif_gc_t is not because "rmmod imgsenor" will delete the instance of camif_gc_t
6084 + */
6085 +static u32 old_priority;
6086 +
6087 +static void camif_bus_priority(int flag)
6088 +{
6089 + if (flag) {
6090 +#ifdef CONFIG_ARCH_S3C24A0A
6091 + old_priority = PRIORITY0;
6092 + PRIORITY0 = PRIORITY_I_FIX;
6093 + PRIORITY1 = PRIORITY_I_FIX;
6094 +
6095 +#else
6096 + old_priority = readl(S3C2410_PRIORITY);
6097 + writel(readl(S3C2410_PRIORITY) & ~(3<<7), S3C2410_PRIORITY);
6098 + writel(readl(S3C2410_PRIORITY) | (1<<7), S3C2410_PRIORITY); /* Arbiter 1, REQ2 first */
6099 + writel(readl(S3C2410_PRIORITY) & ~(1<<1), S3C2410_PRIORITY); /* Disable Priority Rotate */
6100 +#endif
6101 + }
6102 + else {
6103 +#ifdef CONFIG_ARCH_S3C24A0A
6104 + PRIORITY0 = old_priority;
6105 + PRIORITY1 = old_priority;
6106 +#else
6107 + writel(old_priority, S3C2410_PRIORITY);
6108 +#endif
6109 + }
6110 +}
6111 +
6112 +static void inline camif_clock_off(void)
6113 +{
6114 +#if defined (CONFIG_ARCH_S3C24A0A)
6115 + writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT);
6116 +
6117 + CLKCON &= ~CLKCON_CAM_UPLL;
6118 + CLKCON &= ~CLKCON_CAM_HCLK;
6119 +#else
6120 + struct clk *clk_camif = clk_get(NULL, "camif");
6121 + struct clk *clk_camif_upll = clk_get(NULL, "camif-upll");
6122 +
6123 + writel(0, camregs + S3C2440_CAM_REG_CIIMGCPT);
6124 +
6125 + clk_disable(clk_camif);
6126 + clk_disable(clk_camif_upll);
6127 +#endif
6128 +}
6129 +
6130 +
6131 +/* Init external image sensor
6132 + * Before make some value into image senor,
6133 + * you must set up the pixel clock.
6134 + */
6135 +void camif_setup_sensor(void)
6136 +{
6137 + camif_reset(CAMIF_RESET, 0);
6138 + camif_gpio_init();
6139 + camif_clock_init(NULL);
6140 +/* Sometimes ,Before loading I2C module, we need the reset signal */
6141 +#ifdef CONFIG_ARCH_S3C24A0A
6142 + camif_reset(CAMIF_EX_RESET_AL,1000);
6143 +#else
6144 + camif_reset(CAMIF_EX_RESET_AH,1000);
6145 +#endif
6146 +}
6147 +
6148 +void camif_hw_close(camif_cfg_t *cfg)
6149 +{
6150 + camif_bus_priority(0);
6151 + camif_clock_off();
6152 +}
6153 +
6154 +void camif_hw_open(camif_gc_t *gc)
6155 +{
6156 + camif_source_fmt(gc);
6157 + camif_win_offset(gc);
6158 + camif_bus_priority(1);
6159 +}
6160 +
6161 +
6162 +
6163 +/*
6164 + * Local variables:
6165 + * tab-width: 8
6166 + * c-indent-level: 8
6167 + * c-basic-offset: 8
6168 + * c-set-style: "K&R"
6169 + * End:
6170 + */
6171 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/camif_fsm.c
6172 ===================================================================
6173 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
6174 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/camif_fsm.c 2008-12-11 22:46:48.000000000 +0100
6175 @@ -0,0 +1,432 @@
6176 +/*
6177 + Copyright (C) 2004 Samsung Electronics
6178 + SW.LEE <hitchcar@sec.samsung.com>
6179 +
6180 + This program is free software; you can redistribute it and/or modify
6181 + it under the terms of the GNU General Public License as published by
6182 + the Free Software Foundation; either version 2 of the License, or
6183 + (at your option) any later version.
6184 +*/
6185 +
6186 +#include <linux/version.h>
6187 +#include <linux/module.h>
6188 +#include <linux/delay.h>
6189 +#include <linux/errno.h>
6190 +#include <linux/fs.h>
6191 +#include <linux/kernel.h>
6192 +#include <linux/major.h>
6193 +#include <linux/slab.h>
6194 +#include <linux/poll.h>
6195 +#include <linux/signal.h>
6196 +#include <linux/ioport.h>
6197 +#include <linux/sched.h>
6198 +#include <linux/types.h>
6199 +#include <linux/interrupt.h>
6200 +#include <linux/kmod.h>
6201 +#include <linux/vmalloc.h>
6202 +#include <linux/init.h>
6203 +#include <linux/pagemap.h>
6204 +#include <asm/io.h>
6205 +#include <asm/irq.h>
6206 +#include <asm/semaphore.h>
6207 +#include <linux/miscdevice.h>
6208 +
6209 +#define CONFIG_VIDEO_V4L1_COMPAT
6210 +#include <linux/videodev.h>
6211 +#include "camif.h"
6212 +
6213 +//#define SW_DEBUG
6214 +static void camif_start_p_with_c(camif_cfg_t *cfg);
6215 +
6216 +#include "camif.h"
6217 +const char *fsm_version =
6218 + "$Id: camif_fsm.c,v 1.3 2004/04/27 10:26:28 swlee Exp $";
6219 +
6220 +
6221 +/*
6222 + * FSM function is the place where Synchronization in not necessary
6223 + * because IRS calls this functions.
6224 + */
6225 +
6226 +ssize_t camif_p_1fsm_start(camif_cfg_t *cfg)
6227 +{
6228 + //camif_reset(CAMIF_RESET,0);
6229 + cfg->exec = CAMIF_DMA_ON;
6230 + camif_capture_start(cfg);
6231 + camif_last_irq_en(cfg);
6232 + cfg->status = CAMIF_STARTED;
6233 + cfg->fsm = CAMIF_1nd_INT;
6234 + return 0;
6235 +}
6236 +
6237 +
6238 +ssize_t camif_p_2fsm_start(camif_cfg_t *cfg)
6239 +{
6240 + camif_reset(CAMIF_RESET,0);/* FIFO Count goes to zero */
6241 + cfg->exec = CAMIF_DMA_ON;
6242 + camif_capture_start(cfg);
6243 + cfg->status = CAMIF_STARTED;
6244 + cfg->fsm = CAMIF_1nd_INT;
6245 + return 0;
6246 +}
6247 +
6248 +
6249 +ssize_t camif_4fsm_start(camif_cfg_t *cfg)
6250 +{
6251 + camif_reset(CAMIF_RESET,0); /* FIFO Count goes to zero */
6252 + cfg->exec = CAMIF_DMA_ON;
6253 + camif_capture_start(cfg);
6254 + cfg->status = CAMIF_STARTED;
6255 + cfg->fsm = CAMIF_1nd_INT;
6256 + cfg->perf.frames = 0;
6257 + return 0;
6258 +}
6259 +
6260 +
6261 +/* Policy:
6262 + cfg->perf.frames set in camif_fsm.c
6263 + cfg->status set in video-driver.c
6264 + */
6265 +
6266 +/*
6267 + * Don't insert camif_reset(CAM_RESET, 0 ) into this func
6268 + */
6269 +ssize_t camif_p_stop(camif_cfg_t *cfg)
6270 +{
6271 + cfg->exec = CAMIF_DMA_OFF;
6272 +// cfg->status = CAMIF_STOPPED;
6273 + camif_capture_stop(cfg);
6274 + cfg->perf.frames = 0; /* Dupplicated ? */
6275 + return 0;
6276 +}
6277 +
6278 +/* When C working, P asks C to play togehter */
6279 +/* Only P must call this function */
6280 +void camif_start_c_with_p (camif_cfg_t *cfg, camif_cfg_t *other)
6281 +{
6282 +// cfg->gc->other = get_camif(CODEC_MINOR);
6283 + cfg->gc->other = other;
6284 + camif_start_p_with_c(cfg);
6285 +}
6286 +
6287 +static void camif_start_p_with_c(camif_cfg_t *cfg)
6288 +{
6289 + camif_cfg_t *other = (camif_cfg_t *)cfg->gc->other;
6290 + /* Preview Stop */
6291 + cfg->exec = CAMIF_DMA_OFF;
6292 + camif_capture_stop(cfg);
6293 + /* Start P and C */
6294 + camif_reset(CAMIF_RESET, 0);
6295 + cfg->exec =CAMIF_BOTH_DMA_ON;
6296 + camif_capture_start(cfg);
6297 + cfg->fsm = CAMIF_1nd_INT; /* For Preview */
6298 + if(!other) panic("Unexpected Error \n");
6299 + other->fsm = CAMIF_1nd_INT; /* For Preview */
6300 +}
6301 +
6302 +static void camif_auto_restart(camif_cfg_t *cfg)
6303 +{
6304 +// if (cfg->dma_type & CAMIF_CODEC) return;
6305 + if (cfg->auto_restart)
6306 + camif_start_p_with_c(cfg);
6307 +}
6308 +
6309 +
6310 +/* Supposed that PREVIEW already running
6311 + * request PREVIEW to start with Codec
6312 + */
6313 +static int camif_check_global(camif_cfg_t *cfg)
6314 +{
6315 + int ret = 0;
6316 +
6317 + if (down_interruptible(&cfg->gc->lock))
6318 + return -ERESTARTSYS;
6319 + if ( cfg->gc->status & CWANT2START ) {
6320 + cfg->gc->status &= ~CWANT2START;
6321 + cfg->auto_restart = 1;
6322 + ret = 1;
6323 + }
6324 + else {
6325 + ret = 0; /* There is no codec */
6326 + cfg->auto_restart = 0; /* Duplicated ..Dummy */
6327 + }
6328 +
6329 + up(&cfg->gc->lock);
6330 +
6331 + return ret;
6332 +}
6333 +
6334 +/*
6335 + * 1nd INT : Start Interrupt
6336 + * Xnd INT : enable Last IRQ : pingpong get the valid data
6337 + * Ynd INT : Stop Codec or Preview : pingpong get the valid data
6338 + * Znd INT : Last IRQ : valid data
6339 + */
6340 +#define CHECK_FREQ 5
6341 +int camif_enter_p_4fsm(camif_cfg_t *cfg)
6342 +{
6343 + int ret = 0;
6344 +
6345 + cfg->perf.frames++;
6346 + if (cfg->fsm == CAMIF_NORMAL_INT)
6347 + if (cfg->perf.frames % CHECK_FREQ == 0)
6348 + ret = camif_check_global(cfg);
6349 + if (ret > 0) cfg->fsm = CAMIF_Xnd_INT; /* Codec wait for Preview */
6350 +
6351 + switch (cfg->fsm) {
6352 + case CAMIF_1nd_INT: /* Start IRQ */
6353 + cfg->fsm = CAMIF_NORMAL_INT;
6354 + ret = INSTANT_SKIP;
6355 + DPRINTK(KERN_INFO "1nd INT \n");
6356 + break;
6357 + case CAMIF_NORMAL_INT:
6358 + cfg->status = CAMIF_INT_HAPPEN;
6359 + cfg->fsm = CAMIF_NORMAL_INT;
6360 + ret = INSTANT_GO;
6361 + DPRINTK(KERN_INFO "NORMAL INT \n");
6362 + break;
6363 + case CAMIF_Xnd_INT:
6364 + camif_last_irq_en(cfg);/* IRQ for Enabling LAST IRQ */
6365 + cfg->status = CAMIF_INT_HAPPEN;
6366 + cfg->fsm = CAMIF_Ynd_INT;
6367 + ret = INSTANT_GO;
6368 + DPRINTK(KERN_INFO "Xnd INT \n");
6369 + break;
6370 + case CAMIF_Ynd_INT: /* Capture Stop */
6371 + cfg->exec = CAMIF_DMA_OFF;
6372 + cfg->status = CAMIF_INT_HAPPEN;
6373 + camif_capture_stop(cfg);
6374 + cfg->fsm = CAMIF_Znd_INT;
6375 + ret = INSTANT_GO;
6376 + DPRINTK(KERN_INFO "Ynd INT \n");
6377 + break;
6378 + case CAMIF_Znd_INT: /* LAST IRQ (Dummy IRQ */
6379 + cfg->fsm = CAMIF_DUMMY_INT;
6380 + cfg->status = CAMIF_INT_HAPPEN;
6381 + ret = INSTANT_GO;
6382 + camif_auto_restart(cfg); /* Automatically Restart Camera */
6383 + DPRINTK(KERN_INFO "Znd INT \n");
6384 + break;
6385 + case CAMIF_DUMMY_INT:
6386 + cfg->status = CAMIF_STOPPED; /* Dupplicate ? */
6387 + ret = INSTANT_SKIP;
6388 +// DPRINTK(KERN_INFO "Dummy INT \n");
6389 + break;
6390 + default:
6391 + printk(KERN_INFO "Unexpect INT %d \n",cfg->fsm);
6392 + ret = INSTANT_SKIP;
6393 + break;
6394 + }
6395 + return ret;
6396 +}
6397 +
6398 +
6399 +/*
6400 + * NO autorestart included in this function
6401 + */
6402 +int camif_enter_c_4fsm(camif_cfg_t *cfg)
6403 +{
6404 + int ret;
6405 +
6406 + cfg->perf.frames++;
6407 +#if 0
6408 + if ( (cfg->fsm==CAMIF_NORMAL_INT)
6409 + && (cfg->perf.frames>cfg->restart_limit-1)
6410 + )
6411 + cfg->fsm = CAMIF_Xnd_INT;
6412 +#endif
6413 + switch (cfg->fsm) {
6414 + case CAMIF_1nd_INT: /* Start IRQ */
6415 + cfg->fsm = CAMIF_NORMAL_INT;
6416 +// cfg->status = CAMIF_STARTED; /* need this to meet auto-restart */
6417 + ret = INSTANT_SKIP;
6418 + DPRINTK(KERN_INFO "1nd INT \n");
6419 + break;
6420 + case CAMIF_NORMAL_INT:
6421 + cfg->status = CAMIF_INT_HAPPEN;
6422 + cfg->fsm = CAMIF_NORMAL_INT;
6423 + ret = INSTANT_GO;
6424 + DPRINTK(KERN_INFO "NORMALd INT \n");
6425 + break;
6426 + case CAMIF_Xnd_INT:
6427 + camif_last_irq_en(cfg);/* IRQ for Enabling LAST IRQ */
6428 + cfg->status = CAMIF_INT_HAPPEN;
6429 + cfg->fsm = CAMIF_Ynd_INT;
6430 + ret = INSTANT_GO;
6431 + DPRINTK(KERN_INFO "Xnd INT \n");
6432 + break;
6433 + case CAMIF_Ynd_INT: /* Capture Stop */
6434 + cfg->exec = CAMIF_DMA_OFF;
6435 + cfg->status = CAMIF_INT_HAPPEN;
6436 + camif_capture_stop(cfg);
6437 + cfg->fsm = CAMIF_Znd_INT;
6438 + ret = INSTANT_GO;
6439 + DPRINTK(KERN_INFO "Ynd INT \n");
6440 + break;
6441 + case CAMIF_Znd_INT: /* LAST IRQ (Dummy IRQ */
6442 + cfg->fsm = CAMIF_DUMMY_INT;
6443 + cfg->status = CAMIF_INT_HAPPEN;
6444 + ret = INSTANT_GO;
6445 + DPRINTK(KERN_INFO "Znd INT \n");
6446 + break;
6447 + case CAMIF_DUMMY_INT:
6448 + cfg->status = CAMIF_STOPPED; /* Dupplicate ? */
6449 + ret = INSTANT_SKIP;
6450 + break;
6451 + default:
6452 + printk(KERN_INFO "Unexpect INT %d \n",cfg->fsm);
6453 + ret = INSTANT_SKIP;
6454 + break;
6455 + }
6456 + return ret;
6457 +}
6458 +
6459 +/* 4 Interrups State Machine is for two pingpong
6460 + * 1nd INT : Start Interrupt
6461 + * Xnd INT : enable Last IRQ : pingpong get the valid data
6462 + * Ynd INT : Stop Codec or Preview : pingpong get the valid data
6463 + * Znd INT : Last IRQ : valid data
6464 + *
6465 + * Note:
6466 + * Before calling this func, you must call camif_reset
6467 + */
6468 +
6469 +int camif_enter_2fsm(camif_cfg_t *cfg) /* Codec FSM */
6470 +{
6471 + int ret;
6472 +
6473 + cfg->perf.frames++;
6474 + switch (cfg->fsm) {
6475 + case CAMIF_1nd_INT: /* Start IRQ */
6476 + cfg->fsm = CAMIF_Xnd_INT;
6477 + ret = INSTANT_SKIP;
6478 +// printk(KERN_INFO "1nd INT \n");
6479 + break;
6480 + case CAMIF_Xnd_INT:
6481 + camif_last_irq_en(cfg);/* IRQ for Enabling LAST IRQ */
6482 + cfg->now_frame_num = 0;
6483 + cfg->status = CAMIF_INT_HAPPEN;
6484 + cfg->fsm = CAMIF_Ynd_INT;
6485 + ret = INSTANT_GO;
6486 +// printk(KERN_INFO "2nd INT \n");
6487 + break;
6488 + case CAMIF_Ynd_INT: /* Capture Stop */
6489 + cfg->exec = CAMIF_DMA_OFF;
6490 + cfg->now_frame_num = 1;
6491 + cfg->status = CAMIF_INT_HAPPEN;
6492 + camif_capture_stop(cfg);
6493 + cfg->fsm = CAMIF_Znd_INT;
6494 + ret = INSTANT_GO;
6495 +// printk(KERN_INFO "Ynd INT \n");
6496 + break;
6497 + case CAMIF_Znd_INT: /* LAST IRQ (Dummy IRQ */
6498 + cfg->now_frame_num = 0;
6499 +// cfg->fsm = CAMIF_DUMMY_INT;
6500 + cfg->status = CAMIF_INT_HAPPEN;
6501 + ret = INSTANT_GO;
6502 +// printk(KERN_INFO "Znd INT \n");
6503 + break;
6504 + case CAMIF_DUMMY_INT:
6505 + cfg->status = CAMIF_STOPPED; /* Dupplicate ? */
6506 + ret = INSTANT_SKIP;
6507 + printk(KERN_INFO "Dummy INT \n");
6508 + break;
6509 + default: /* CAMIF_PENDING_INT */
6510 + printk(KERN_INFO "Unexpect INT \n");
6511 + ret = INSTANT_SKIP;
6512 + break;
6513 + }
6514 + return ret;
6515 +}
6516 +
6517 +
6518 +/* 2 Interrups State Machine is for one pingpong
6519 + * 1nd INT : Stop Codec or Preview : pingpong get the valid data
6520 + * 2nd INT : Last IRQ : dummy data
6521 + */
6522 +int camif_enter_1fsm(camif_cfg_t *cfg) /* Codec FSM */
6523 +{
6524 + int ret;
6525 +
6526 + cfg->perf.frames++;
6527 + switch (cfg->fsm) {
6528 + case CAMIF_Ynd_INT: /* IRQ for Enabling LAST IRQ */
6529 + cfg->exec = CAMIF_DMA_OFF;
6530 + camif_capture_stop(cfg);
6531 + cfg->fsm = CAMIF_Znd_INT;
6532 + ret = INSTANT_SKIP;
6533 + // printk(KERN_INFO "Ynd INT \n");
6534 + break;
6535 + case CAMIF_Znd_INT: /* LAST IRQ (Dummy IRQ */
6536 + cfg->fsm = CAMIF_DUMMY_INT;
6537 + cfg->status = CAMIF_INT_HAPPEN;
6538 + ret = INSTANT_GO;
6539 + // printk(KERN_INFO "Znd INT \n");
6540 + break;
6541 + case CAMIF_DUMMY_INT:
6542 + cfg->status = CAMIF_STOPPED; /* Dupplicate ? */
6543 + ret = INSTANT_SKIP;
6544 + printk(KERN_INFO "Dummy INT \n");
6545 + break;
6546 + default:
6547 + printk(KERN_INFO "Unexpect INT \n");
6548 + ret = INSTANT_SKIP;
6549 + break;
6550 + }
6551 + return ret;
6552 +}
6553 +
6554 +
6555 +/*
6556 + * GLOBAL STATUS CONTROL FUNCTION
6557 + *
6558 + */
6559 +
6560 +
6561 +/* Supposed that PREVIEW already running
6562 + * request PREVIEW to start with Codec
6563 + */
6564 +int camif_callback_start(camif_cfg_t *cfg)
6565 +{
6566 + int doit = 1;
6567 + while (doit) {
6568 + if (down_interruptible(&cfg->gc->lock)) {
6569 + return -ERESTARTSYS;
6570 + }
6571 + cfg->gc->status = CWANT2START;
6572 + cfg->gc->other = cfg;
6573 + up(&cfg->gc->lock);
6574 + doit = 0;
6575 + }
6576 + return 0;
6577 +}
6578 +
6579 +/*
6580 + * Return status of Preview Machine
6581 + ret value :
6582 + 0: Preview is not working
6583 + X: Codec must follow PREVIEW start
6584 +*/
6585 +int camif_check_preview(camif_cfg_t *cfg)
6586 +{
6587 + int ret = 0;
6588 +
6589 + if (down_interruptible(&cfg->gc->lock)) {
6590 + ret = -ERESTARTSYS;
6591 + return ret;
6592 + }
6593 + if (cfg->gc->user == 1) ret = 0;
6594 + // else if (cfg->gc->status & PNOTWORKING) ret = 0;
6595 + else ret = 1;
6596 + up(&cfg->gc->lock);
6597 + return ret;
6598 +}
6599 +
6600 +
6601 +
6602 +
6603 +/*
6604 + * Local variables:
6605 + * c-basic-offset: 8
6606 + * End:
6607 + */
6608 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/camif.h
6609 ===================================================================
6610 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
6611 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/camif.h 2008-12-11 22:46:48.000000000 +0100
6612 @@ -0,0 +1,304 @@
6613 +/*
6614 + FIMC2.0 Camera Header File
6615 +
6616 + Copyright (C) 2003 Samsung Electronics (SW.LEE: hitchcar@samsung.com)
6617 +
6618 + Author : SW.LEE <hitchcar@samsung.com>
6619 +
6620 + This program is free software; you can redistribute it and/or modify
6621 + it under the terms of the GNU General Public License as published by
6622 + the Free Software Foundation; either version 2 of the License, or
6623 + (at your option) any later version.
6624 +*
6625 +*/
6626 +
6627 +
6628 +#ifndef __FIMC20_CAMIF_H_
6629 +#define __FIMC20_CAMIF_H_
6630 +
6631 +#ifdef __KERNEL__
6632 +
6633 +#include "bits.h"
6634 +#include "videodev.h"
6635 +#include <asm/types.h>
6636 +#include <linux/i2c.h>
6637 +
6638 +#endif /* __KERNEL__ */
6639 +
6640 +#ifndef O_NONCAP
6641 +#define O_NONCAP O_TRUNC
6642 +#endif
6643 +
6644 +/* Codec or Preview Status */
6645 +#define CAMIF_STARTED BIT1
6646 +#define CAMIF_STOPPED BIT2
6647 +#define CAMIF_INT_HAPPEN BIT3
6648 +
6649 +/* Codec or Preview : Interrupt FSM */
6650 +#define CAMIF_1nd_INT BIT7
6651 +#define CAMIF_Xnd_INT BIT8
6652 +#define CAMIF_Ynd_INT BIT9
6653 +#define CAMIF_Znd_INT BIT10
6654 +#define CAMIF_NORMAL_INT BIT11
6655 +#define CAMIF_DUMMY_INT BIT12
6656 +#define CAMIF_PENDING_INT 0
6657 +
6658 +
6659 +/* CAMIF RESET Definition */
6660 +#define CAMIF_RESET BIT0
6661 +#define CAMIF_EX_RESET_AL BIT1 /* Active Low */
6662 +#define CAMIF_EX_RESET_AH BIT2 /* Active High */
6663 +
6664 +
6665 +enum camif_itu_fmt {
6666 + CAMIF_ITU601 = BIT31,
6667 + CAMIF_ITU656 = 0
6668 +};
6669 +
6670 +/* It is possbie to use two device simultaneously */
6671 +enum camif_dma_type {
6672 + CAMIF_PREVIEW = BIT0,
6673 + CAMIF_CODEC = BIT1,
6674 +};
6675 +
6676 +enum camif_order422 {
6677 + CAMIF_YCBYCR = 0,
6678 + CAMIF_YCRYCB = BIT14,
6679 + CAMIF_CBYCRY = BIT15,
6680 + CAMIF_CRYCBY = BIT14 | BIT15
6681 +};
6682 +
6683 +enum flip_mode {
6684 + CAMIF_FLIP = 0,
6685 + CAMIF_FLIP_X = BIT14,
6686 + CAMIF_FLIP_Y = BIT15,
6687 + CAMIF_FLIP_MIRROR = BIT14 |BIT15,
6688 +};
6689 +
6690 +enum camif_codec_fmt {
6691 + /* Codec part */
6692 + CAMIF_IN_YCBCR420 = BIT0, /* Currently IN_YCBCR format fixed */
6693 + CAMIF_IN_YCBCR422 = BIT1,
6694 + CAMIF_OUT_YCBCR420 = BIT4,
6695 + CAMIF_OUT_YCBCR422 = BIT5,
6696 + /* Preview Part */
6697 + CAMIF_RGB16 = BIT2,
6698 + CAMIF_RGB24 = BIT3,
6699 +};
6700 +
6701 +enum camif_capturing {
6702 + CAMIF_BOTH_DMA_ON = BIT4,
6703 + CAMIF_DMA_ON = BIT3,
6704 + CAMIF_BOTH_DMA_OFF = BIT1,
6705 + CAMIF_DMA_OFF = BIT0,
6706 + /*------------------------*/
6707 + CAMIF_DMA_OFF_L_IRQ= BIT5,
6708 +};
6709 +
6710 +typedef struct camif_performance
6711 +{
6712 + int frames;
6713 + int framesdropped;
6714 + __u64 bytesin;
6715 + __u64 bytesout;
6716 + __u32 reserved[4];
6717 +} camif_perf_t;
6718 +
6719 +
6720 +typedef struct {
6721 + dma_addr_t phys_y;
6722 + dma_addr_t phys_cb;
6723 + dma_addr_t phys_cr;
6724 + u8 *virt_y;
6725 + u8 *virt_cb;
6726 + u8 *virt_cr;
6727 + dma_addr_t phys_rgb;
6728 + u8 *virt_rgb;
6729 +}img_buf_t;
6730 +
6731 +
6732 +/* this structure convers the CIWDOFFST, prescaler, mainscaler */
6733 +typedef struct {
6734 + u32 modified_src_x; /* After windows applyed to source_x */
6735 + u32 modified_src_y;
6736 + u32 hfactor;
6737 + u32 vfactor;
6738 + u32 shfactor; /* SHfactor = 10 - ( hfactor + vfactor ) */
6739 + u32 prehratio;
6740 + u32 prevratio;
6741 + u32 predst_x;
6742 + u32 predst_y;
6743 + u32 scaleup_h;
6744 + u32 scaleup_v;
6745 + u32 mainhratio;
6746 + u32 mainvratio;
6747 + u32 scalerbypass; /* only codec */
6748 +} scaler_t;
6749 +
6750 +
6751 +enum v4l2_status {
6752 + CAMIF_V4L2_INIT = BIT0,
6753 + CAMIF_v4L2_DIRTY = BIT1,
6754 +};
6755 +
6756 +
6757 +/* Global Status Definition */
6758 +#define PWANT2START BIT0
6759 +#define CWANT2START BIT1
6760 +#define BOTH_STARTED (PWANT2START|CWANT2START)
6761 +#define PNOTWORKING BIT4
6762 +#define C_WORKING BIT5
6763 +
6764 +typedef struct {
6765 + struct semaphore lock;
6766 + enum camif_itu_fmt itu_fmt;
6767 + enum camif_order422 order422;
6768 + u32 win_hor_ofst;
6769 + u32 win_ver_ofst;
6770 + u32 camclk; /* External Image Sensor Camera Clock */
6771 + u32 source_x;
6772 + u32 source_y;
6773 + u32 polarity_pclk;
6774 + u32 polarity_vsync;
6775 + u32 polarity_href;
6776 + struct i2c_client *sensor;
6777 + u32 user; /* MAX 2 (codec, preview) */
6778 + u32 old_priority; /* BUS PRIORITY register */
6779 + u32 status;
6780 + u32 init_sensor;/* initializing sensor */
6781 + void *other; /* Codec camif_cfg_t */
6782 + u32 reset_type; /* External Sensor Reset Type */
6783 + u32 reset_udelay;
6784 +} camif_gc_t; /* gobal control register */
6785 +
6786 +
6787 +/* when App want to change v4l2 parameter,
6788 + * we instantly store it into v4l2_t v2
6789 + * and then reflect it to hardware
6790 + */
6791 +typedef struct v4l2 {
6792 + struct v4l2_fmtdesc *fmtdesc;
6793 + struct v4l2_pix_format fmt; /* current pixel format */
6794 + struct v4l2_input input;
6795 + struct video_picture picture;
6796 + enum v4l2_status status;
6797 + int used_fmt ; /* used format index */
6798 +} v4l2_t;
6799 +
6800 +
6801 +typedef struct camif_c_t {
6802 + struct video_device *v;
6803 + /* V4L2 param only for v4l2 driver */
6804 + v4l2_t v2;
6805 + camif_gc_t *gc; /* Common between Codec and Preview */
6806 + /* logical parameter */
6807 + wait_queue_head_t waitq;
6808 + u32 status; /* Start/Stop */
6809 + u32 fsm; /* Start/Stop */
6810 + u32 open_count; /* duplicated */
6811 + int irq;
6812 + char shortname[16];
6813 + u32 target_x;
6814 + u32 target_y;
6815 + scaler_t sc;
6816 + enum flip_mode flip;
6817 + enum camif_dma_type dma_type;
6818 + /* 4 pingpong Frame memory */
6819 + u8 *pp_virt_buf;
6820 + dma_addr_t pp_phys_buf;
6821 + u32 pp_totalsize;
6822 + u32 pp_num; /* used pingpong memory number */
6823 + img_buf_t img_buf[4];
6824 + enum camif_codec_fmt fmt;
6825 + enum camif_capturing exec;
6826 + camif_perf_t perf;
6827 + u32 now_frame_num;
6828 + u32 auto_restart; /* Only For Preview */
6829 +} camif_cfg_t;
6830 +
6831 +#ifdef SW_DEBUG
6832 +#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__ , ## args)
6833 +#else
6834 +#define DPRINTK(fmt, args...)
6835 +#endif
6836 +
6837 +
6838 +#ifdef SW_DEBUG
6839 +#define assert(expr) \
6840 + if(!(expr)) { \
6841 + printk( "Assertion failed! %s,%s,%s,line=%d\n", \
6842 + #expr,__FILE__,__FUNCTION__,__LINE__); \
6843 + }
6844 +#else
6845 +#define assert(expr)
6846 +#endif
6847 +
6848 +
6849 +
6850 +extern int camif_capture_start(camif_cfg_t *);
6851 +extern int camif_capture_stop(camif_cfg_t *);
6852 +extern int camif_g_frame_num(camif_cfg_t *);
6853 +extern u8 * camif_g_frame(camif_cfg_t *);
6854 +extern int camif_win_offset(camif_gc_t *);
6855 +extern void camif_hw_open(camif_gc_t *);
6856 +extern void camif_hw_close(camif_cfg_t *);
6857 +extern int camif_dynamic_open(camif_cfg_t *);
6858 +extern int camif_dynamic_close(camif_cfg_t *);
6859 +extern void camif_reset(int,int);
6860 +extern void camif_setup_sensor(void);
6861 +extern int camif_g_fifo_status(camif_cfg_t *);
6862 +extern void camif_last_irq_en(camif_cfg_t *);
6863 +extern void camif_change_flip(camif_cfg_t *);
6864 +
6865 +
6866 +/* Todo
6867 + * API Interface function to both Character and V4L2 Drivers
6868 + */
6869 +extern int camif_do_write(struct file *,const char *, size_t, loff_t *);
6870 +extern int camif_do_ioctl(struct inode *, struct file *,unsigned int, void *);
6871 +
6872 +
6873 +/*
6874 + * API for Decoder (S5x532, OV7620..)
6875 + */
6876 +void camif_register_decoder(struct i2c_client *);
6877 +void camif_unregister_decoder(struct i2c_client*);
6878 +
6879 +
6880 +
6881 +/* API for FSM */
6882 +#define INSTANT_SKIP 0
6883 +#define INSTANT_GO 1
6884 +
6885 +extern ssize_t camif_p_1fsm_start(camif_cfg_t *);
6886 +extern ssize_t camif_p_2fsm_start(camif_cfg_t *);
6887 +extern ssize_t camif_4fsm_start(camif_cfg_t *);
6888 +extern ssize_t camif_p_stop(camif_cfg_t *);
6889 +extern int camif_enter_p_4fsm(camif_cfg_t *);
6890 +extern int camif_enter_c_4fsm(camif_cfg_t *);
6891 +extern int camif_enter_2fsm(camif_cfg_t *);
6892 +extern int camif_enter_1fsm(camif_cfg_t *);
6893 +extern int camif_check_preview(camif_cfg_t *);
6894 +extern int camif_callback_start(camif_cfg_t *);
6895 +extern int camif_clock_init(camif_gc_t *);
6896 +
6897 +/*
6898 + * V4L2 Part
6899 + */
6900 +#define VID_HARDWARE_SAMSUNG_FIMC20 236
6901 +
6902 +
6903 +
6904 +
6905 +
6906 +#endif
6907 +
6908 +
6909 +/*
6910 + * Local variables:
6911 + * tab-width: 8
6912 + * c-indent-level: 8
6913 + * c-basic-offset: 8
6914 + * c-set-style: "K&R"
6915 + * End:
6916 + */
6917 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/cam_reg.h
6918 ===================================================================
6919 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
6920 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/cam_reg.h 2008-12-11 22:46:48.000000000 +0100
6921 @@ -0,0 +1,234 @@
6922 + /*----------------------------------------------------------
6923 + * (C) 2004 Samsung Electronics
6924 + * SW.LEE < hitchcar@samsung.com>
6925 + *
6926 + ----------------------------------------------------------- */
6927 +
6928 +#ifndef __FIMC20_CAMERA_H__
6929 +#define __FIMC20_CAMERA_H__
6930 +
6931 +extern u32 * camregs;
6932 +
6933 +#ifdef CONFIG_ARCH_S3C24A0
6934 +#define CAM_BASE_ADD 0x48000000
6935 +#else /* S3C2440A */
6936 +#define CAM_BASE_ADD 0x4F000000
6937 +#endif
6938 +
6939 +#if ! defined(FExtr)
6940 +#define UData(Data) ((unsigned long) (Data))
6941 +#define FExtr(Data, Field) \
6942 + ((UData (Data) >> FShft (Field)) & FAlnMsk (Field))
6943 +#define FInsrt(Value, Field) \
6944 + (UData (Value) << FShft (Field))
6945 +#define FSize(Field) ((Field) >> 16)
6946 +#define FShft(Field) ((Field) & 0x0000FFFF)
6947 +#define FMsk(Field) (((UData (1) << FSize (Field)) - 1) << FShft (Field))
6948 +#define FAlnMsk(Field) ((UData (1) << FSize (Field)) - 1)
6949 +#define F1stBit(Field) (UData (1) << FShft (Field))
6950 +#define Fld(Size, Shft) (((Size) << 16) + (Shft))
6951 +#endif
6952 +
6953 +/*
6954 + * CAMERA IP
6955 + * P-port is used as RGB Capturing device which including scale and crop
6956 + * those who want to see(preview ) the image on display needs RGB image.
6957 + *
6958 + * C-port is used as YCbCr(4:2:0, 4:2:2) Capturing device which including the scale and crop
6959 + * the prefix of C-port have the meaning of "Codec" ex. mpeg4, h263.. which requries the
6960 + YCBCB format not RGB
6961 + */
6962 +
6963 +#define S3C2440_CAM_REG_CISRCFMT (0x00) // RW Input Source Format
6964 +#define S3C2440_CAM_REG_CIWDOFST (0x04) // Window offset register
6965 +#define S3C2440_CAM_REG_CIGCTRL (0x08) // Global control register
6966 +#define S3C2440_CAM_REG_CICOYSA0 (0x18) // Y 1 st frame start ads
6967 +#define S3C2440_CAM_REG_CICOYSA1 (0x1C) // Y 2 nd frame start ads
6968 +#define S3C2440_CAM_REG_CICOYSA2 (0x20) // Y 3 rd frame start ads
6969 +#define S3C2440_CAM_REG_CICOYSA3 (0x24) // Y 4 th frame start ads
6970 +#define S3C2440_CAM_REG_CICOCBSA0 (0x28) // Cb 1 st frame start ads
6971 +#define S3C2440_CAM_REG_CICOCBSA1 (0x2C) // Cb 2 nd frame start ads
6972 +#define S3C2440_CAM_REG_CICOCBSA2 (0x30) // Cb 3 rd frame start ads
6973 +#define S3C2440_CAM_REG_CICOCBSA3 (0x34) // Cb 4 th frame start ads
6974 +#define S3C2440_CAM_REG_CICOCRSA0 (0x38) // Cr 1 st frame start ads
6975 +#define S3C2440_CAM_REG_CICOCRSA1 (0x3C) // Cr 2 nd frame start ads
6976 +#define S3C2440_CAM_REG_CICOCRSA2 (0x40) // Cr 3 rd frame start ads
6977 +#define S3C2440_CAM_REG_CICOCRSA3 (0x44) // Cr 4 th frame start ads
6978 +#define S3C2440_CAM_REG_CICOTRGFMT (0x48) // Target img format of codec
6979 +#define S3C2440_CAM_REG_CICOCTRL (0x4C) // Codec DMA control related
6980 +#define S3C2440_CAM_REG_CICOSCPRERATIO (0x50) // Codec pre-scaler ratio
6981 +#define S3C2440_CAM_REG_CICOSCPREDST (0x54) // Codec pre-scaler dest
6982 +#define S3C2440_CAM_REG_CICOSCCTRL (0x58) // Codec main-scaler control
6983 +#define S3C2440_CAM_REG_CICOTAREA (0x5C) // Codec pre-scaler dest
6984 +#define S3C2440_CAM_REG_CICOSTATUS (0x64) // Codec path status
6985 +#define S3C2440_CAM_REG_CIPRCLRSA0 (0x6C) // RGB 1 st frame start ads
6986 +#define S3C2440_CAM_REG_CIPRCLRSA1 (0x70) // RGB 2 nd frame start ads
6987 +#define S3C2440_CAM_REG_CIPRCLRSA2 (0x74) // RGB 3 rd frame start ads
6988 +#define S3C2440_CAM_REG_CIPRCLRSA3 (0x78) // RGB 4 th frame start ads
6989 +#define S3C2440_CAM_REG_CIPRTRGFMT (0x7C) // Target img fmt of preview
6990 +#define S3C2440_CAM_REG_CIPRCTRL (0x80) // Preview DMA ctl related
6991 +#define S3C2440_CAM_REG_CIPRSCPRERATIO (0x84) // Preview pre-scaler ratio
6992 +#define S3C2440_CAM_REG_CIPRSCPREDST (0x88) // Preview pre-scaler dest
6993 +#define S3C2440_CAM_REG_CIPRSCCTRL (0x8C) // Preview main-scaler ctl
6994 +#define S3C2440_CAM_REG_CIPRTAREA (0x90) // Preview pre-scaler dest
6995 +#define S3C2440_CAM_REG_CIPRSTATUS (0x98) // Preview path status
6996 +#define S3C2440_CAM_REG_CIIMGCPT (0xA0) // Image capture enable cmd
6997 +
6998 +#define S3C2440_CAM_REG_CICOYSA(__x) (0x18 + (__x)*4 )
6999 +#define S3C2440_CAM_REG_CICOCBSA(__x) (0x28 + (__x)*4 )
7000 +#define S3C2440_CAM_REG_CICOCRSA(__x) (0x38 + (__x)*4 )
7001 +#define S3C2440_CAM_REG_CIPRCLRSA(__x) (0x6C + (__x)*4 )
7002 +
7003 +/* CISRCFMT BitField */
7004 +#define SRCFMT_ITU601 BIT31
7005 +#define SRCFMT_ITU656 0
7006 +#define SRCFMT_UVOFFSET_128 BIT30
7007 +#define fCAM_SIZE_H Fld(13, 16)
7008 +#define fCAM_SIZE_V Fld(13, 0)
7009 +#define SOURCE_HSIZE(x) FInsrt((x), fCAM_SIZE_H)
7010 +#define SOURCE_VSIZE(x) FInsrt((x), fCAM_SIZE_V)
7011 +
7012 +
7013 +/* Window Option Register */
7014 +#define WINOFEN BIT31
7015 +#define CO_FIFO_Y BIT30
7016 +#define CO_FIFO_CB BIT15
7017 +#define CO_FIFO_CR BIT14
7018 +#define PR_FIFO_CB BIT13
7019 +#define PR_FIFO_CR BIT12
7020 +#define fWINHOR Fld(11, 16)
7021 +#define fWINVER Fld(11, 0)
7022 +#define WINHOROFST(x) FInsrt((x), fWINHOR)
7023 +#define WINVEROFST(x) FInsrt((x), fWINVER)
7024 +
7025 +/* Global Control Register */
7026 +#define GC_SWRST BIT31
7027 +#define GC_CAMRST BIT30
7028 +#define GC_INVPOLPCLK BIT26
7029 +#define GC_INVPOLVSYNC BIT25
7030 +#define GC_INVPOLHREF BIT24
7031 +
7032 +/*--------------------------------------------------
7033 + REGISTER BIT FIELD DEFINITION TO
7034 + YCBCR and RGB
7035 +----------------------------------------------------*/
7036 +/* Codec Target Format Register */
7037 +#define IN_YCBCR420 0
7038 +#define IN_YCBCR422 BIT31
7039 +#define OUT_YCBCR420 0
7040 +#define OUT_YCBCR422 BIT30
7041 +
7042 +#if 0
7043 +#define FLIP_NORMAL 0
7044 +#define FLIP_X (BIT14)
7045 +#define FLIP_Y (BIT15)
7046 +#define FLIP_MIRROR (BIT14|BIT15)
7047 +#endif
7048 +
7049 +/** BEGIN ************************************/
7050 +/* Cotents: Common in both P and C port */
7051 +#define fTARGET_HSIZE Fld(13,16)
7052 +#define TARGET_HSIZE(x) FInsrt((x), fTARGET_HSIZE)
7053 +#define fTARGET_VSIZE Fld(13,0)
7054 +#define TARGET_VSIZE(x) FInsrt((x), fTARGET_VSIZE)
7055 +#define FLIP_X_MIRROR BIT14
7056 +#define FLIP_Y_MIRROR BIT15
7057 +#define FLIP_180_MIRROR (BIT14 | BIT15)
7058 +/** END *************************************/
7059 +
7060 +/* Codec DMA Control Register */
7061 +#define fYBURST_M Fld(5,19)
7062 +#define fYBURST_R Fld(5,14)
7063 +#define fCBURST_M Fld(5,9)
7064 +#define fCBURST_R Fld(5,4)
7065 +#define YBURST_M(x) FInsrt((x), fYBURST_M)
7066 +#define CBURST_M(x) FInsrt((x), fCBURST_M)
7067 +#define YBURST_R(x) FInsrt((x), fYBURST_R)
7068 +#define CBURST_R(x) FInsrt((x), fCBURST_R)
7069 +#define LAST_IRQ_EN BIT2 /* Common in both P and C port */
7070 +/*
7071 + * Check the done signal of capturing image for JPEG
7072 + * !!! AutoClear Bit
7073 + */
7074 +
7075 +
7076 +/* (Codec, Preview ) Pre-Scaler Control Register 1 */
7077 +#define fSHIFT Fld(4,28)
7078 +#define PRE_SHIFT(x) FInsrt((x), fSHIFT)
7079 +#define fRATIO_H Fld(7,16)
7080 +#define PRE_HRATIO(x) FInsrt((x), fRATIO_H)
7081 +#define fRATIO_V Fld(7,0)
7082 +#define PRE_VRATIO(x) FInsrt((x), fRATIO_V)
7083 +
7084 +/* (Codec, Preview ) Pre-Scaler Control Register 2*/
7085 +#define fDST_WIDTH Fld(12,16)
7086 +#define fDST_HEIGHT Fld(12,0)
7087 +#define PRE_DST_WIDTH(x) FInsrt((x), fDST_WIDTH)
7088 +#define PRE_DST_HEIGHT(x) FInsrt((x), fDST_HEIGHT)
7089 +
7090 +
7091 +/* (Codec, Preview) Main-scaler control Register */
7092 +#define S_METHOD BIT31 /* Sampling method only for P-port */
7093 +#define SCALERSTART BIT15
7094 +/* Codec scaler bypass for upper 2048x2048
7095 + where ImgCptEn_CoSC and ImgCptEn_PrSC should be 0
7096 +*/
7097 +
7098 +#define SCALERBYPASS BIT31
7099 +#define RGB_FMT24 BIT30
7100 +#define RGB_FMT16 0
7101 +
7102 +/*
7103 +#define SCALE_UP_H BIT29
7104 +#define SCALE_UP_V BIT28
7105 +*/
7106 +
7107 +#define fMAIN_HRATIO Fld(9, 16)
7108 +#define MAIN_HRATIO(x) FInsrt((x), fMAIN_HRATIO)
7109 +
7110 +#define SCALER_START BIT15
7111 +
7112 +#define fMAIN_VRATIO Fld(9, 0)
7113 +#define MAIN_VRATIO(x) FInsrt((x), fMAIN_VRATIO)
7114 +
7115 +/* (Codec, Preview ) DMA Target AREA Register */
7116 +#define fCICOTAREA Fld(26,0)
7117 +#define TARGET_DMA_AREA(x) FInsrt((x), fCICOTAREA)
7118 +
7119 +/* Preview DMA Control Register */
7120 +#define fRGBURST_M Fld(5,19)
7121 +#define fRGBURST_R Fld(5,14)
7122 +#define RGBURST_M(x) FInsrt((x), fRGBURST_M)
7123 +#define RGBURST_R(x) FInsrt((x), fRGBURST_R)
7124 +
7125 +
7126 +/* (Codec, Preview) Status Register */
7127 +#define CO_OVERFLOW_Y BIT31
7128 +#define CO_OVERFLOW_CB BIT30
7129 +#define CO_OVERFLOW_CR BIT29
7130 +#define PR_OVERFLOW_CB BIT31
7131 +#define PR_OVERFLOW_CR BIT30
7132 +
7133 +#define VSYNC BIT28
7134 +
7135 +#define fFRAME_CNT Fld(2,26)
7136 +#define FRAME_CNT(x) FExtr((x),fFRAME_CNT)
7137 +
7138 +#define WIN_OFF_EN BIT25
7139 +#define fFLIP_MODE Fld(2,23)
7140 +#define FLIP_MODE(x) EExtr((x), fFLIP_MODE)
7141 +#define CAP_STATUS_CAMIF BIT22
7142 +#define CAP_STATUS_CODEC BIT21
7143 +#define CAP_STATUS_PREVIEW BIT21
7144 +#define VSYNC_A BIT20
7145 +#define VSYNC_B BIT19
7146 +
7147 +/* Image Capture Enable Regiser */
7148 +#define CAMIF_CAP_ON BIT31
7149 +#define CAMIF_CAP_CODEC_ON BIT30
7150 +#define CAMIF_CAP_PREVIEW_ON BIT29
7151 +
7152 +
7153 +
7154 +
7155 +#endif /* S3C2440_CAMER_H */
7156 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/imgsensor.c
7157 ===================================================================
7158 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
7159 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/imgsensor.c 2008-12-11 22:46:48.000000000 +0100
7160 @@ -0,0 +1,250 @@
7161 +/*
7162 + * Copyright (C) 2004 Samsung Electronics
7163 + * SW.LEE <hitchcar@samsung.com>
7164 + *
7165 + * Copyright (C) 2000 Russell King : pcf8583.c
7166 + *
7167 + * This program is free software; you can redistribute it and/or modify
7168 + * it under the terms of the GNU General Public License version 2 as
7169 + * published by the Free Software Foundation.
7170 + *
7171 + * Driver for FIMC20 Camera Decoder
7172 + */
7173 +
7174 +
7175 +#include <linux/module.h>
7176 +#include <linux/kernel.h>
7177 +#include <linux/init.h>
7178 +#include <linux/i2c.h>
7179 +#include <linux/slab.h>
7180 +#include <linux/string.h>
7181 +#include <linux/init.h>
7182 +#include <linux/delay.h>
7183 +
7184 +
7185 +#ifdef CONFIG_ARCH_S3C24A0A
7186 +#else
7187 +//#include <asm/arch/S3C2440.h>
7188 +#endif
7189 +
7190 +#define SW_DEBUG
7191 +#define CONFIG_VIDEO_V4L1_COMPAT
7192 +#include <linux/videodev.h>
7193 +#include "camif.h"
7194 +#include "sensor.h"
7195 +
7196 +#ifndef SAMSUNG_SXGA_CAM
7197 +#include "s5x532_rev36.h"
7198 +#else
7199 +#include "sxga.h"
7200 +#endif
7201 +
7202 +static struct i2c_driver s5x532_driver;
7203 +static camif_gc_t data = {
7204 + itu_fmt: CAMIF_ITU601,
7205 + order422: CAMIF_YCBYCR,
7206 + camclk: 24000000,
7207 +#ifndef SAMSUNG_SXGA_CAM
7208 + source_x: 640,
7209 + source_y: 480,
7210 + win_hor_ofst: 112,
7211 + win_ver_ofst: 20,
7212 +#else
7213 + source_x: 1280,
7214 + source_y: 1024,
7215 + win_hor_ofst: 0,
7216 + win_ver_ofst: 0,
7217 +#endif
7218 + polarity_pclk:1,
7219 + polarity_href:0,
7220 +#ifdef CONFIG_ARCH_S3C24A0A
7221 + reset_type:CAMIF_EX_RESET_AL, /* Active Low */
7222 +#else
7223 + reset_type:CAMIF_EX_RESET_AH, /* Ref board has inverted signal */
7224 +#endif
7225 + reset_udelay:2000,
7226 +};
7227 +
7228 +#define CAM_ID 0x5a
7229 +
7230 +static unsigned short ignore = I2C_CLIENT_END;
7231 +static unsigned short normal_addr[] = { (CAM_ID>>1), I2C_CLIENT_END };
7232 +static struct i2c_client_address_data addr_data = {
7233 + normal_i2c: normal_addr,
7234 + probe: &ignore,
7235 + ignore: &ignore,
7236 +};
7237 +
7238 +s5x532_t s5x532_regs_mirror[S5X532_REGS];
7239 +
7240 +unsigned char
7241 +s5x532_read(struct i2c_client *client, unsigned char subaddr)
7242 +{
7243 + int ret;
7244 + unsigned char buf[1];
7245 + struct i2c_msg msg ={ client->addr, 0, 1, buf};
7246 + buf[0] = subaddr;
7247 +
7248 + ret = i2c_transfer(client->adapter,&msg, 1) == 1 ? 0 : -EIO;
7249 + if (ret == -EIO) {
7250 + printk(" I2C write Error \n");
7251 + return -EIO;
7252 + }
7253 +
7254 + msg.flags = I2C_M_RD;
7255 + ret = i2c_transfer(client->adapter, &msg, 1) == 1 ? 0 : -EIO;
7256 +
7257 + return buf[0];
7258 +}
7259 +
7260 +
7261 +static int
7262 +s5x532_write(struct i2c_client *client,
7263 + unsigned char subaddr, unsigned char val)
7264 +{
7265 + unsigned char buf[2];
7266 + struct i2c_msg msg = { client->addr, 0, 2, buf};
7267 +
7268 + buf[0]= subaddr;
7269 + buf[1]= val;
7270 +
7271 + return i2c_transfer(client->adapter, &msg, 1) == 1 ? 0 : -EIO;
7272 +}
7273 +
7274 +void inline s5x532_init(struct i2c_client *sam_client)
7275 +{
7276 + int i;
7277 +
7278 + printk(KERN_ERR "s5x532_init \n");
7279 + for (i = 0; i < S5X532_INIT_REGS; i++) {
7280 + s5x532_write(sam_client,
7281 + s5x532_reg[i].subaddr, s5x532_reg[i].value );
7282 + }
7283 +
7284 +#ifdef YOU_WANT_TO_CHECK_IMG_SENSOR
7285 + for (i = 0; i < S5X532_INIT_REGS;i++) {
7286 + if ( s5x532_reg[i].subaddr == PAGE_ADDRESS ) {
7287 + s5x532_write(sam_client,
7288 + s5x532_reg[i].subaddr, s5x532_reg[i].value);
7289 +
7290 + printk(KERN_ERR "Page: Subaddr %02x = 0x%02x\n",
7291 + s5x532_reg[i].subaddr, s5x532_regs_mirror[i].value);
7292 +
7293 +
7294 + } else
7295 + {
7296 + s5x532_regs_mirror[i].subaddr = s5x532_reg[i].subaddr;
7297 + s5x532_regs_mirror[i].value =
7298 + s5x532_read(sam_client,s5x532_reg[i].subaddr);
7299 + printk(KERN_ERR "Subaddr %02x = 0x%02x\n",
7300 + s5x532_reg[i].subaddr, s5x532_regs_mirror[i].value);
7301 + }
7302 + }
7303 +#endif
7304 +
7305 +}
7306 +
7307 +static int
7308 +s5x532_attach(struct i2c_adapter *adap, int addr, int kind)
7309 +{
7310 + struct i2c_client *c;
7311 +
7312 + c = kmalloc(sizeof(*c), GFP_KERNEL);
7313 + if (!c) return -ENOMEM;
7314 +
7315 + strcpy(c->name, "S5X532");
7316 +// c->id = s5x532_driver.id;
7317 + c->flags = 0 /* I2C_CLIENT_ALLOW_USE */;
7318 + c->addr = addr;
7319 + c->adapter = adap;
7320 + c->driver = &s5x532_driver;
7321 + data.sensor = c;
7322 + i2c_set_clientdata(c, &data);
7323 +
7324 + camif_register_decoder(c);
7325 + return i2c_attach_client(c);
7326 +}
7327 +
7328 +static int s5x532_probe(struct i2c_adapter *adap)
7329 +{
7330 + return i2c_probe(adap, &addr_data, s5x532_attach);
7331 +}
7332 +
7333 +static int s5x532_detach(struct i2c_client *client)
7334 +{
7335 + i2c_detach_client(client);
7336 + camif_unregister_decoder(client);
7337 + return 0;
7338 +}
7339 +
7340 +static int
7341 +s5x532_command(struct i2c_client *client, unsigned int cmd, void *arg)
7342 +{
7343 + switch (cmd) {
7344 + case SENSOR_INIT:
7345 + s5x532_init(client);
7346 + printk(KERN_INFO "CAMERA: S5X532 Sensor initialized\n");
7347 + break;
7348 + case USER_ADD:
7349 + /* MOD_INC_USE_COUNT; uh.. 2.6 deals with this, old-timer */
7350 + break;
7351 + case USER_EXIT:
7352 + /* MOD_DEC_USE_COUNT; */
7353 + break;
7354 +/* Todo
7355 + case SENSOR_BRIGHTNESS:
7356 + change_sensor();
7357 + break;
7358 +*/
7359 + default:
7360 + panic("Unexpect Sensor Command \n");
7361 + break;
7362 + }
7363 + return 0;
7364 +}
7365 +
7366 +static struct i2c_driver s5x532_driver = {
7367 + driver: { name: "S5X532" },
7368 + id: 0, /* optional in i2c-id.h I2C_ALGO_S3C, */
7369 + attach_adapter: s5x532_probe,
7370 + detach_client: s5x532_detach,
7371 + command: s5x532_command
7372 +};
7373 +
7374 +static void iic_gpio_port(void)
7375 +{
7376 +/* FIXME: no gpio config for i2c !!!
7377 +#ifdef CONFIG_ARCH_S3C24A0A
7378 +#else
7379 + GPECON &= ~(0xf <<28);
7380 + GPECON |= 0xa <<28;
7381 +#endif
7382 +*/
7383 +}
7384 +
7385 +static __init int camif_sensor_init(void)
7386 +{
7387 + iic_gpio_port();
7388 + return i2c_add_driver(&s5x532_driver);
7389 +}
7390 +
7391 +
7392 +static __init void camif_sensor_exit(void)
7393 +{
7394 + i2c_del_driver(&s5x532_driver);
7395 +}
7396 +
7397 +module_init(camif_sensor_init)
7398 +module_exit(camif_sensor_exit)
7399 +
7400 +MODULE_AUTHOR("SW.LEE <hitchcar@sec.samsung.com>");
7401 +MODULE_DESCRIPTION("I2C Client Driver For Fimc2.0 MISC Driver");
7402 +MODULE_LICENSE("GPL");
7403 +
7404 +
7405 +
7406 +/*
7407 + * Local variables:
7408 + * c-basic-offset: 8
7409 + * End:
7410 + */
7411 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/Kconfig
7412 ===================================================================
7413 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
7414 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/Kconfig 2008-12-11 22:46:48.000000000 +0100
7415 @@ -0,0 +1,7 @@
7416 +
7417 +config S3C2440_CAMERA
7418 + bool "S3C24xx Camera interface"
7419 + depends on ARCH_S3C2410
7420 + help
7421 + Camera driver for S3C2440 camera unit
7422 +
7423 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/Makefile
7424 ===================================================================
7425 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
7426 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/Makefile 2008-12-11 22:46:48.000000000 +0100
7427 @@ -0,0 +1,8 @@
7428 +obj-$(CONFIG_S3C2440_CAMERA) += \
7429 + videodev.o \
7430 + imgsensor.o \
7431 + video-driver.o \
7432 + camif.o \
7433 + camif_fsm.o \
7434 + qt-driver.o
7435 +
7436 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/miscdevice.h
7437 ===================================================================
7438 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
7439 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/miscdevice.h 2008-12-11 22:46:48.000000000 +0100
7440 @@ -0,0 +1,18 @@
7441 +
7442 + /*----------------------------------------------------------
7443 + * (C) 2004 Samsung Electronics
7444 + * SW.LEE < hitchcar@samsung.com>
7445 + *
7446 + ----------------------------------------------------------- */
7447 +
7448 +#ifndef _LINUX_S3C_MISCDEVICE_H
7449 +#define _LINUX_S3C_MISCDEVICE_H
7450 +
7451 +#define CODEC_MINOR 212
7452 +#define PREVIEW_MINOR 213
7453 +
7454 +
7455 +
7456 +
7457 +
7458 +#endif
7459 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/qt-driver.c
7460 ===================================================================
7461 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
7462 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/qt-driver.c 2008-12-11 22:46:48.000000000 +0100
7463 @@ -0,0 +1,172 @@
7464 +/*
7465 + * SW.LEE <hitchcar@samsung.com>
7466 + *
7467 + * This file is subject to the terms and conditions of the GNU General Public
7468 + * License 2. See the file COPYING in the main directory of this archive
7469 + * for more details.
7470 + */
7471 +
7472 +#include <linux/version.h>
7473 +#include <linux/module.h>
7474 +#include <linux/delay.h>
7475 +#include <linux/errno.h>
7476 +#include <linux/fs.h>
7477 +#include <linux/kernel.h>
7478 +#include <linux/major.h>
7479 +#include <linux/slab.h>
7480 +#include <linux/poll.h>
7481 +#include <linux/signal.h>
7482 +#include <linux/ioport.h>
7483 +#include <linux/sched.h>
7484 +#include <linux/types.h>
7485 +#include <linux/interrupt.h>
7486 +#include <linux/kmod.h>
7487 +#include <linux/vmalloc.h>
7488 +#include <linux/init.h>
7489 +#include <asm/io.h>
7490 +#include <asm/page.h>
7491 +#include <asm/irq.h>
7492 +#include <asm/semaphore.h>
7493 +#include <linux/miscdevice.h>
7494 +
7495 +//#define SW_DEBUG
7496 +
7497 +#define CONFIG_VIDEO_V4L1_COMPAT
7498 +#include <linux/videodev.h>
7499 +#include "camif.h"
7500 +#include "miscdevice.h"
7501 +#include "cam_reg.h"
7502 +#include "sensor.h"
7503 +#include "userapp.h"
7504 +
7505 +extern camif_cfg_t * get_camif(int nr);
7506 +
7507 +
7508 +/************************* Sharp Zarus API **************************
7509 +* refering to Camera Driver API for SL-5000D/SL-5600 revision 1.00
7510 +* April 11, 2002.
7511 + SW.LEE <hitchcar@sec.samsung.com>
7512 + I want to use Sharp Camera Application.
7513 +*
7514 +*/
7515 +
7516 +#define READ_MODE_STATUS 0x1
7517 +#define READ_MODE_IMAGE 0x0
7518 +#define CAPTURE_SPEED
7519 +#define H_FLIP
7520 +#define V_FLIP
7521 +typedef enum sharp_readmode
7522 +{
7523 + IMAGE = 0, STATUS = 1,
7524 + FASTER = 0, BETTER = 2,
7525 + XNOFLIP = 0, XFLIP = 4,
7526 + YNOFLIP = 0, YFLIP = 8,
7527 + AUTOMATICFLIP = -1
7528 +} ReadMode_t;
7529 +
7530 +
7531 +static struct sharp_param_t {
7532 + ReadMode_t readMode;
7533 + char CameraStatus[4];
7534 +} sharp_param = { STATUS, {'s','m','c','A'}};
7535 +
7536 +
7537 +camif_param_t qt_parm = { 640,480,240,320,16,0};
7538 +
7539 +static void setReadMode(const char *b,size_t count)
7540 +{
7541 + int i = *(b+2) - 48 ;
7542 + if ( 4 == count ) {
7543 + i = (*(b+3) - 48) + i * 10;
7544 + }
7545 +
7546 + // DPRINTK(" setReadMode %s conversion value %d \n",b , i);
7547 + if ( i & STATUS ) {
7548 + // DPRINTK(" STATUS MODE \n");
7549 + sharp_param.readMode = i;
7550 + }
7551 + else {
7552 + // DPRINTK(" IMAGE MODE \n");
7553 + sharp_param.readMode = i;
7554 + }
7555 +}
7556 +
7557 +
7558 +
7559 +
7560 +extern ssize_t camif_p_read(struct file *, char *, size_t , loff_t *);
7561 +
7562 +ssize_t z_read(struct file *f, char *buf, size_t count, loff_t *pos)
7563 +{
7564 + size_t end;
7565 +
7566 + if (sharp_param.readMode & STATUS ) {
7567 + buf[0] = sharp_param.CameraStatus[0];
7568 + buf[1] = sharp_param.CameraStatus[1];
7569 + buf[2] = sharp_param.CameraStatus[2];
7570 + buf[3] = sharp_param.CameraStatus[3];
7571 + end = 4;
7572 + return end;
7573 + }
7574 + else { /* Image ReadMode */
7575 + /*
7576 + if (( sharp_param.readMode & (BETTER|X FLIP|YFLIP)))
7577 + DPRINTK(" Not Supporting BETTER|XFLIP|YFLIP\n");
7578 + */
7579 + return camif_p_read(f,buf,count,pos);
7580 + }
7581 +}
7582 +
7583 +static void z_config(camif_cfg_t *cfg,int x, int y)
7584 +{
7585 + cfg->target_x = x;
7586 + cfg->target_y = y;
7587 + cfg->fmt = CAMIF_RGB16;
7588 + if (camif_dynamic_open(cfg)) {
7589 + panic(" Eror Happens \n");
7590 + }
7591 +}
7592 +
7593 +
7594 +ssize_t z_write(struct file *f, const char *b, size_t c, loff_t *pos)
7595 +{
7596 + int array[5];
7597 + int zoom = 1;
7598 + camif_cfg_t *cfg;
7599 +
7600 + cfg = get_camif(MINOR(f->f_dentry->d_inode->i_rdev));
7601 +// DPRINTK(" param %s count %d \n",b, c );
7602 +
7603 + switch(*b) {
7604 + case 'M':
7605 + setReadMode(b, c);
7606 + break;
7607 + case 'B': /* Clear the latch flag of shutter button */
7608 + DPRINTK(" clear latch flag of camera's shutter button\n");
7609 + sharp_param.CameraStatus[0]='s';
7610 + break;
7611 + case 'Y': /* I don't know how to set Shutter pressed */
7612 + DPRINTK(" set latch flag n");
7613 + sharp_param.CameraStatus[0]='S';
7614 + break;
7615 + case 'S': /* Camera Image Resolution */
7616 + case 'R': /* Donot support Rotation */
7617 + DPRINTK(" param %s count %d \n",b, c );
7618 + get_options((char *)(b+2), 5, array);
7619 + if ( array[3] == 512 ) zoom = 2;
7620 + z_config(cfg, array[1] * zoom , array[2] * zoom );
7621 + camif_4fsm_start(cfg);
7622 + break;
7623 + case 'C':
7624 + DPRINTK(" param %s count %d \n",b, c );
7625 + DPRINTK(" Start the camera to capture \n");
7626 + sharp_param.CameraStatus[2]='C';
7627 + camif_4fsm_start(cfg);
7628 + break;
7629 + default:
7630 + printk("Unexpected param %s count %d \n",b, c );
7631 + }
7632 +
7633 + return c;
7634 +}
7635 +
7636 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/qt.h
7637 ===================================================================
7638 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
7639 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/qt.h 2008-12-11 22:46:48.000000000 +0100
7640 @@ -0,0 +1,18 @@
7641 +/*
7642 + * SW.LEE <hitchcar@samsung.com>
7643 + *
7644 + * This file is subject to the terms and conditions of the GNU General Public
7645 + * License 2. See the file COPYING in the main directory of this archive
7646 + * for more details.
7647 + */
7648 +
7649 +#ifndef __Z_API_H_
7650 +#define __Z_API_H_
7651 +
7652 +extern ssize_t z_read(struct file *f, char *buf, size_t count, loff_t *pos);
7653 +extern ssize_t z_write(struct file *f, const char *b, size_t c, loff_t *pos);
7654 +
7655 +
7656 +
7657 +#endif
7658 +
7659 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/s5x532.h
7660 ===================================================================
7661 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
7662 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/s5x532.h 2008-12-11 22:46:48.000000000 +0100
7663 @@ -0,0 +1,143 @@
7664 +/*
7665 + * 2004 (C) Samsung Electronics
7666 + * SW.LEE <hitchcar@sec.samsung.com>
7667 + * This file is subject to the terms and conditions of the GNU General Public
7668 + * License 2. See the file COPYING in the main directory of this archive
7669 + * for more details.
7670 + */
7671 +
7672 +
7673 +#ifndef _SMDK2440_S5X532_H_
7674 +#define _SMDK2440_S5X532_H_
7675 +
7676 +
7677 +#define CHIP_DELAY 0xFF
7678 +
7679 +typedef struct samsung_t{
7680 + unsigned char subaddr;
7681 + unsigned char value;
7682 + unsigned char page;
7683 +} s5x532_t;
7684 +
7685 +s5x532_t s5x532_reg[] = {
7686 + // page 5
7687 + {0xec,0x05},
7688 + {0x08,0x55,0x5},
7689 + {0x0a,0x75,0x5},
7690 + {0x0c,0x90,0x5},
7691 + {0x0e,0x18,0x5},
7692 + {0x12,0x09,0x5},
7693 + {0x14,0x9d,0x5},
7694 + {0x16,0x90,0x5},
7695 + {0x1a,0x18,0x5},
7696 + {0x1c,0x0c,0x5},
7697 + {0x1e,0x09,0x5},
7698 + {0x20,0x06,0x5},
7699 + {0x22,0x20,0x5},
7700 + {0x2a,0x00,0x5},
7701 + {0x2d,0x04,0x5},
7702 + {0x12,0x24,0x5},
7703 + // page 3
7704 + {0xec,0x03,0x3},
7705 + {0x0c,0x09,0x3},
7706 + {0x6c,0x09,0x3},
7707 + {0x2b,0x10,0x3}, // momo clock inversion
7708 + // page 2
7709 + {0xec,0x02,0x2},
7710 + {0x03,0x09,0x2},
7711 + {0x05,0x08,0x2},
7712 + {0x06,0x01,0x2},
7713 + {0x07,0xf8,0x2},
7714 + {0x15,0x25,0x2},
7715 + {0x30,0x29,0x2},
7716 + {0x36,0x12,0x2},
7717 + {0x38,0x04,0x2},
7718 + {0x1b,0x77,0x2}, // 24MHz : 0x77, 12MHz : 0x22
7719 + {0x1c,0x77,0x2}, // 24MHz : 0x77, 12MHz : 0x22
7720 + // page 1
7721 + {0xec,0x01,0x1},
7722 + {0x00,0x03,0x1}, //
7723 + {0x0a,0x08,0x1}, // 0x0-QQVGA, 0x06-CIF, 0x02-QCIF, 0x08-VGA, 0x04-QVGA, 0x0a-SXGA
7724 + {0x0c,0x00,0x1}, // Pattern selectio. 0-CIS, 1-Color bar, 2-Ramp, 3-Blue screen
7725 + {0x10,0x27,0x1},
7726 + // 0x21-ITU-R656(CrYCbY), 0x25-ITU-R601(CrYCbY), 0x26-ITU-R601(YCbYCr)
7727 + {0x50,0x21,0x1}, // Hblank
7728 + {0x51,0x00,0x1}, // Hblank
7729 + {0x52,0xA1,0x1}, // Hblank
7730 + {0x53,0x02,0x1}, // Hblank
7731 + {0x54,0x01,0x1}, // Vblank
7732 + {0x55,0x00,0x1}, // Vblank
7733 + {0x56,0xE1,0x1}, // Vblank
7734 + {0x57,0x01,0x1}, // Vblank
7735 + {0x58,0x21,0x1}, // Hsync
7736 + {0x59,0x00,0x1}, // Hsync
7737 + {0x5a,0xA1,0x1}, // Hsync
7738 + {0x5b,0x02,0x1}, // Hsync
7739 + {0x5c,0x03,0x1}, // Vref
7740 + {0x5d,0x00,0x1}, // Vref
7741 + {0x5e,0x05,0x1}, // Vref
7742 + {0x5f,0x00,0x1}, // Vref
7743 + {0x70,0x0E,0x1},
7744 + {0x71,0xD6,0x1},
7745 + {0x72,0x30,0x1},
7746 + {0x73,0xDB,0x1},
7747 + {0x74,0x0E,0x1},
7748 + {0x75,0xD6,0x1},
7749 + {0x76,0x18,0x1},
7750 + {0x77,0xF5,0x1},
7751 + {0x78,0x0E,0x1},
7752 + {0x79,0xD6,0x1},
7753 + {0x7a,0x28,0x1},
7754 + {0x7b,0xE6,0x1},
7755 + {0x50,0x00,0x1},
7756 + {0x5c,0x00,0x1},
7757 +
7758 + // page 0
7759 + {0xec,0x00,0x0},
7760 + {0x79,0x01,0x0},
7761 + {0x58,0x90,0x0},
7762 + {0x59,0xA0,0x0},
7763 + {0x5a,0x50,0x0},
7764 + {0x5b,0x70,0x0},
7765 + {0x5c,0xD0,0x0},
7766 + {0x5d,0xC0,0x0},
7767 + {0x5e,0x28,0x0},
7768 + {0x5f,0x08,0x0},
7769 + {0x50,0x90,0x0},
7770 + {0x51,0xA0,0x0},
7771 + {0x52,0x50,0x0},
7772 + {0x53,0x70,0x0},
7773 + {0x54,0xD0,0x0},
7774 + {0x55,0xC0,0x0},
7775 + {0x56,0x28,0x0},
7776 + {0x57,0x00,0x0},
7777 + {0x48,0x90,0x0},
7778 + {0x49,0xA0,0x0},
7779 + {0x4a,0x50,0x0},
7780 + {0x4b,0x70,0x0},
7781 + {0x4c,0xD0,0x0},
7782 + {0x4d,0xC0,0x0},
7783 + {0x4e,0x28,0x0},
7784 + {0x4f,0x08,0x0},
7785 + {0x72,0x82,0x0}, // main clock = 24MHz:0xd2, 16M:0x82, 12M:0x54
7786 + {0x75,0x05,0x0} // absolute vertical mirror. junon
7787 +
7788 +};
7789 +
7790 +
7791 +#define S5X532_INIT_REGS (sizeof(s5x532_reg)/sizeof(s5x532_reg[0]))
7792 +#define S5X532_RISC_REGS 0xEB
7793 +#define S5X532_ISP_REGS 0xFB /* S5C7323X */
7794 +#define S5X532_CIS_REGS 0x2F /* S5K437LA03 */
7795 +
7796 +
7797 +#define PAGE_ADDRESS 0xEC
7798 +
7799 +//#define S5X532_REGS (S5X532_RISC_REGS+S5X532_ISP_REGS+S5X532_CIS_REGS)
7800 +#define S5X532_REGS (0x1000)
7801 +
7802 +
7803 +
7804 +#endif
7805 +
7806 +
7807 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/s5x532_rev36.h
7808 ===================================================================
7809 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
7810 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/s5x532_rev36.h 2008-12-11 22:46:48.000000000 +0100
7811 @@ -0,0 +1,208 @@
7812 +/*
7813 + * 2004 (C) Samsung Electronics
7814 + * SW.LEE <hitchcar@sec.samsung.com>
7815 + * This file is subject to the terms and conditions of the GNU General Public
7816 + * License 2. See the file COPYING in the main directory of this archive
7817 + * for more details.
7818 + */
7819 +
7820 +
7821 +#ifndef _SMDK2440_S5X532_H_
7822 +#define _SMDK2440_S5X532_H_
7823 +
7824 +
7825 +#define CHIP_DELAY 0xFF
7826 +
7827 +typedef struct samsung_t{
7828 + unsigned char subaddr;
7829 + unsigned char value;
7830 + unsigned char page;
7831 +} s5x532_t;
7832 +
7833 +s5x532_t s5x532_reg[] = {
7834 +
7835 + //=============== page0 ===============//
7836 + {0xec,0x00,0x00},
7837 + {0x02,0x00,0x00},
7838 + {0x14,0x60,0x00},
7839 + {0x15,0x60,0x00},
7840 + {0x16,0x60,0x00},
7841 + {0x1b,0x20,0x00},
7842 + {0x1c,0x20,0x00},
7843 + {0x1d,0x20,0x00},
7844 + {0x1e,0x20,0x00},
7845 + {0x72,0xdc,0x00},
7846 + {0x73,0x11,0x00},
7847 + {0x76,0x82,0x00},
7848 + {0x77,0x90,0x00},
7849 + {0x78,0x6c,0x00},
7850 + {0x0a,0x02,0x00},
7851 + {0x34,0x0d,0x00},
7852 + {0x35,0x0a,0x00},
7853 + {0x36,0x05,0x00},
7854 + {0x37,0x05,0x00},
7855 + {0x38,0x06,0x00},
7856 + {0x39,0x08,0x00},
7857 + {0x3A,0x0d,0x00},
7858 + {0x3B,0x0d,0x00},
7859 + {0x3C,0x18,0x00},
7860 + {0x3D,0xE0,0x00},
7861 + {0x3E,0x20,0x00},
7862 + {0x66,0x02,0x00},
7863 + {0x6c,0x40,0x00},
7864 + {0x7c,0x01,0x00},
7865 + {0x0D,0x24,0x00},
7866 + {0x40,0x1B,0x00},
7867 + {0x41,0x4F,0x00},
7868 + {0x42,0x24,0x00},
7869 + {0x43,0x3E,0x00},
7870 + {0x44,0x32,0x00},
7871 + {0x45,0x30,0x00},
7872 + {0x48,0xa0,0x00},
7873 + {0x49,0xd0,0x00},
7874 + {0x4A,0x28,0x00},
7875 + {0x4B,0x7d,0x00},
7876 + {0x4C,0xd0,0x00},
7877 + {0x4D,0xe0,0x00},
7878 + {0x4E,0x1a,0x00},
7879 + {0x4F,0xa0,0x00},
7880 + {0x50,0xc0,0x00},
7881 + {0x51,0xc0,0x00},
7882 + {0x52,0x42,0x00},
7883 + {0x53,0x7e,0x00},
7884 + {0x54,0xc0,0x00},
7885 + {0x55,0xf0,0x00},
7886 + {0x56,0x1e,0x00},
7887 + {0x57,0xe0,0x00},
7888 + {0x58,0xc0,0x00},
7889 + {0x59,0xa0,0x00},
7890 + {0x5A,0x4a,0x00},
7891 + {0x5B,0x7e,0x00},
7892 + {0x5C,0xc0,0x00},
7893 + {0x5D,0xf0,0x00},
7894 + {0x5E,0x2a,0x00},
7895 + {0x5F,0x10,0x00},
7896 + {0x79,0x00,0x00},
7897 + {0x7a,0x00,0x00},
7898 + {0xe0,0x0f,0x00},
7899 + {0xe3,0x14,0x00},
7900 + {0xe5,0x48,0x00},
7901 + {0xe7,0x58,0x00},
7902 +
7903 + //=============== page1 ===============//
7904 + {0xec,0x01,0x01},
7905 + {0x10,0x05,0x01},
7906 + {0x20,0xde,0x01},
7907 + {0x0b,0x06,0x01},
7908 + {0x30,0x00,0x01},
7909 + {0x31,0x00,0x01},
7910 + {0x32,0x00,0x01},
7911 + {0x24,0x28,0x01},
7912 + {0x25,0x3F,0x01},
7913 + {0x26,0x65,0x01},
7914 + {0x27,0xA1,0x01},
7915 + {0x28,0xFF,0x01},
7916 + {0x29,0x96,0x01},
7917 + {0x2A,0x85,0x01},
7918 + {0x2B,0xFF,0x01},
7919 + {0x2C,0x00,0x01},
7920 + {0x2D,0x1B,0x01},
7921 + {0xB0,0x28,0x01},
7922 + {0xB1,0x3F,0x01},
7923 + {0xB2,0x65,0x01},
7924 + {0xB3,0xA1,0x01},
7925 + {0xB4,0xFF,0x01},
7926 + {0xB5,0x96,0x01},
7927 + {0xB6,0x85,0x01},
7928 + {0xB7,0xFF,0x01},
7929 + {0xB8,0x00,0x01},
7930 + {0xB9,0x1B,0x01},
7931 + {0x15,0x15,0x01},
7932 + {0x18,0x85,0x01},
7933 + {0x1f,0x05,0x01},
7934 + {0x87,0x40,0x01},
7935 + {0x37,0x60,0x01},
7936 + {0x38,0xd5,0x01},
7937 + {0x48,0xa0,0x01},
7938 + {0x61,0x54,0x01},
7939 + {0x62,0x54,0x01},
7940 + {0x63,0x14,0x01},
7941 + {0x64,0x14,0x01},
7942 + {0x6d,0x12,0x01},
7943 + {0x78,0x09,0x01},
7944 + {0x79,0xD7,0x01},
7945 + {0x7A,0x14,0x01},
7946 + {0x7B,0xEE,0x01},
7947 +
7948 + //=============== page2 ===============//
7949 + {0xec,0x02,0x02},
7950 + {0x2c,0x76,0x02},
7951 + {0x25,0x25,0x02},
7952 + {0x27,0x27,0x02},
7953 + {0x30,0x29,0x02},
7954 + {0x36,0x08,0x02},
7955 + {0x38,0x04,0x02},
7956 +
7957 + //=============== page3 ===============//
7958 + {0xec,0x03,0x03},
7959 + {0x08,0x00,0x03},
7960 + {0x09,0x33,0x03},
7961 +
7962 + //=============== page4 ===============//
7963 + {0xec,0x04,0x04},
7964 + {0x00,0x21,0x04},
7965 + {0x01,0x00,0x04},
7966 + {0x02,0x9d,0x04},
7967 + {0x03,0x02,0x04},
7968 + {0x04,0x04,0x04},
7969 + {0x05,0x00,0x04},
7970 + {0x06,0x1f,0x04},
7971 + {0x07,0x02,0x04},
7972 + {0x08,0x21,0x04},
7973 + {0x09,0x00,0x04},
7974 + {0x0a,0x9d,0x04},
7975 + {0x0b,0x02,0x04},
7976 + {0x0c,0x04,0x04},
7977 + {0x0d,0x00,0x04},
7978 + {0x0e,0x20,0x04},
7979 + {0x0f,0x02,0x04},
7980 + {0x1b,0x3c,0x04},
7981 + {0x1c,0x3c,0x04},
7982 +
7983 + //=============== page5 ===============//
7984 + {0xec,0x05,0x05},
7985 + {0x1f,0x00,0x05},
7986 + {0x08,0x59,0x05},
7987 + {0x0a,0x71,0x05},
7988 + {0x1e,0x23,0x05},
7989 + {0x0e,0x3c,0x05},
7990 +
7991 + //=============== page7 ===============//
7992 + {0xec,0x07,0x07},
7993 + {0x11,0xfe,0x07},
7994 +
7995 + // added by junon
7996 + {0xec,0x01,0x07},
7997 + {0x10,0x26,0x07},
7998 + // 0x21-ITU-R656(CbYCrY), 0x25-ITU-R601(CbYCrY), 0x26-ITU-R601(YCrYCb)
7999 +
8000 +
8001 +};
8002 +
8003 +
8004 +#define S5X532_INIT_REGS (sizeof(s5x532_reg)/sizeof(s5x532_reg[0]))
8005 +#define S5X532_RISC_REGS 0xEB
8006 +#define S5X532_ISP_REGS 0xFB /* S5C7323X */
8007 +#define S5X532_CIS_REGS 0x2F /* S5K437LA03 */
8008 +
8009 +
8010 +#define PAGE_ADDRESS 0xEC
8011 +
8012 +//#define S5X532_REGS (S5X532_RISC_REGS+S5X532_ISP_REGS+S5X532_CIS_REGS)
8013 +#define S5X532_REGS (0x1000)
8014 +
8015 +
8016 +
8017 +#endif
8018 +
8019 +
8020 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/sensor.h
8021 ===================================================================
8022 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
8023 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/sensor.h 2008-12-11 22:46:48.000000000 +0100
8024 @@ -0,0 +1,20 @@
8025 +/*
8026 + *
8027 + * Copyright (C) 2004 Samsung Electronics
8028 + * SW.LEE <hitchcar@sec.samsung.com>
8029 + *
8030 + * This program is free software; you can redistribute it and/or modify
8031 + * it under the terms of the GNU General Public License version 2 as
8032 + * published by the Free Software Foundation.
8033 + */
8034 +
8035 +#ifndef __SENSOR_CMD_H_
8036 +#define __SENSOR_CMD_H_
8037 +
8038 +#include "bits.h"
8039 +
8040 +#define SENSOR_INIT BIT0
8041 +#define USER_ADD BIT1
8042 +#define USER_EXIT BIT2
8043 +
8044 +#endif
8045 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/sxga.h
8046 ===================================================================
8047 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
8048 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/sxga.h 2008-12-11 22:46:48.000000000 +0100
8049 @@ -0,0 +1,504 @@
8050 +/*
8051 + * 2004 (C) Samsung Electronics
8052 + * SW.LEE <hitchcar@sec.samsung.com>
8053 + * This file is subject to the terms and conditions of the GNU General Public
8054 + * License 2. See the file COPYING in the main directory of this archive
8055 + * for more details.
8056 + */
8057 +
8058 +
8059 +#ifndef _SAMSUNG_SXGA_H_
8060 +#define _SAMSUNG_SXGA_H_
8061 +
8062 +
8063 +#define CHIP_DELAY 0xFF
8064 +
8065 +typedef struct samsung_t{
8066 + unsigned char subaddr;
8067 + unsigned char value;
8068 + unsigned char page;
8069 +} s5x532_t;
8070 +
8071 +s5x532_t s5x532_reg[] = {
8072 + // page 0
8073 + {0xec,0x00,0x0},
8074 + {0x0c,0x38,0x0},
8075 + {0x0d,0x24,0x0},
8076 + {0x13,0x10,0x0},
8077 + {0x14,0x10,0x0},
8078 + {0x15,0x10,0x0},
8079 + {0x16,0x10,0x0},
8080 + {0x17,0x20,0x0},
8081 + {0x18,0x30,0x0},
8082 + {0x19,0x30,0x0},
8083 + {0x1a,0x10,0x0},
8084 + {0x1b,0x10,0x0},
8085 +
8086 + {0x2d,0x40,0x0},
8087 + {0x3e,0x10,0x0},
8088 + {0x34,0x0a,0x0},
8089 + {0x39,0x04,0x0},
8090 + {0x3a,0x02,0x0},
8091 + {0x31,0x05,0x0},
8092 +
8093 + {0x40,0x1d,0x0},
8094 + {0x41,0x50,0x0},
8095 + {0x42,0x24,0x0},
8096 + {0x43,0x3f,0x0},
8097 + {0x44,0x30,0x0},
8098 + {0x45,0x31,0x0},
8099 +
8100 + {0x48,0xa0,0x0},
8101 + {0x49,0xc0,0x0},
8102 + {0x4a,0x58,0x0},
8103 + {0x4b,0x50,0x0},
8104 + {0x4c,0xb0,0x0},
8105 + {0x4d,0xc0,0x0},
8106 + {0x4e,0x30,0x0},
8107 + {0x4f,0x20,0x0},
8108 +
8109 + {0x50,0xa0,0x0},
8110 + {0x51,0xc0,0x0},
8111 + {0x52,0x50,0x0},
8112 + {0x53,0x60,0x0},
8113 + {0x54,0xb0,0x0},
8114 + {0x55,0xc0,0x0},
8115 + {0x56,0x20,0x0},
8116 + {0x57,0x08,0x0},
8117 +// {0x72,0x50,0x0}, // Clock 16
8118 + {0x72,0x78,0x0}, // Clock 24Mhz
8119 +// {0x72,0xf0,0x0}, // Clock 48Mhz
8120 + // page 1
8121 + {0xec,0x01,0x1},
8122 + {0x10,0x17,0x1}, // ITU-R601
8123 + /*
8124 + [3:2] : out_sel
8125 + 00 : 656
8126 + 01 : 601
8127 + 10 : RGB
8128 + 11 : CIS
8129 + [1] : YC_SEL
8130 + [0] : CBCR_SEL
8131 + */
8132 +
8133 + {0x0b,0x06,0x1}, // 6
8134 + {0x20,0xa8,0x1}, //b0); // Highlight C Supp 040215
8135 + {0x22,0x26,0x1}, //2f); 040225
8136 +
8137 + {0x24,0x08,0x1}, //00); //1F); 040226
8138 + {0x25,0x10,0x1}, //10); //34);
8139 + {0x26,0x40,0x1}, //56);
8140 + {0x27,0x80,0x1}, //8D);
8141 + {0x28,0x2c,0x1}, //E7);
8142 + {0x29,0xd6,0x1}, //7C);
8143 + {0x2A,0x0c,0x1}, //70);
8144 + {0x2B,0xFF,0x1}, //FF);
8145 + {0x2C,0x00,0x1}, //00);
8146 + {0x2D,0x5f,0x1}, //1B);
8147 + //
8148 + {0xB0,0x08,0x1}, //00); //1F); 040226
8149 + {0xB1,0x10,0x1}, //10); //34);50
8150 + {0xB2,0x40,0x1}, //36);
8151 + {0xB3,0x80,0x1}, //6D);
8152 + {0xB4,0x2c,0x1}, //b7);
8153 + {0xB5,0xd6,0x1}, //7C);
8154 + {0xB6,0x0c,0x1}, //70);
8155 + {0xB7,0xFF,0x1}, //FF);
8156 + {0xB8,0x00,0x1}, //00);
8157 + {0xB9,0x5f,0x1}, //1B);
8158 +
8159 +
8160 + {0xc2,0x01,0x1}, // shading On
8161 + {0xc3,0x80,0x1},
8162 + {0xc4,0x02,0x1},
8163 + {0xc5,0x00,0x1},
8164 + {0xc6,0x01,0x1},
8165 + {0xc7,0x00,0x1},
8166 + {0xc8,0x05,0x1},
8167 + {0xc9,0x00,0x1},
8168 + {0xca,0x04,0x1},
8169 +
8170 + // shading 5
8171 + {0xd0,0xb5,0x1},
8172 + {0xd1,0x9c,0x1},
8173 + {0xd2,0x8d,0x1},
8174 + {0xd3,0x84,0x1},
8175 + {0xd4,0x84,0x1},
8176 + {0xd5,0x91,0x1},
8177 + {0xd6,0xa0,0x1},
8178 + {0xd7,0xb5,0x1},
8179 +
8180 + {0xd8,0xc0,0x1},
8181 + {0xd9,0xa6,0x1},
8182 + {0xda,0x93,0x1},
8183 + {0xdb,0x85,0x1},
8184 + {0xdc,0x85,0x1},
8185 + {0xdd,0x90,0x1},
8186 + {0xde,0xa0,0x1},
8187 + {0xdf,0xb8,0x1},
8188 +
8189 + // Page 2
8190 + {0xec,0x02,0x02},
8191 +
8192 + {0x2d,0x02,0x02},
8193 + {0x20,0x13,0x02},
8194 + {0x21,0x13,0x2},
8195 + {0x22,0x13,0x2},
8196 + {0x23,0x13,0x2},
8197 + {0x2e,0x85,0x2},
8198 + {0x2f,0x34,0x2},
8199 + {0x30,0x00,0x2},
8200 + {0x28,0x94,0x2},
8201 +
8202 +
8203 + // page 3
8204 + {0xec,0x03,0x03},
8205 + {0x10,0x00,0x3},
8206 + {0x20,0x00,0x3},
8207 + {0x21,0x20,0x3},
8208 + {0x22,0x00,0x3},
8209 + {0x23,0x00,0x3},
8210 + {0x40,0x20,0x3},
8211 + {0x41,0x20,0x3},
8212 + {0x42,0x20,0x3},
8213 + {0x43,0x20,0x3},
8214 + {0x60,0x00,0x3},
8215 + {0x61,0x00,0x3},
8216 + {0x62,0x00,0x3},
8217 + {0x63,0x00,0x3},
8218 + {0x64,0x04,0x3},
8219 + {0x65,0x1C,0x3},
8220 + {0x66,0x05,0x3},
8221 + {0x67,0x1C,0x3},
8222 + {0x68,0x00,0x3},
8223 + {0x69,0x2D,0x3},
8224 + {0x6a,0x00,0x3},
8225 + {0x6b,0x72,0x3},
8226 + {0x6c,0x00,0x3},
8227 + {0x6d,0x00,0x3},
8228 + {0x6e,0x16,0x3}, // 2.38
8229 + {0x6f,0x16,0x3}, // 2.38
8230 + {0x70,0x00,0x3},
8231 + {0x71,0x00,0x3},
8232 + {0x72,0x45,0x3},
8233 + {0x73,0x00,0x3},
8234 + {0x74,0x1C,0x3},
8235 + {0x75,0x05,0x3},
8236 +
8237 + {0x80,0x00,0x3}, //for 0.02 _ 44
8238 + {0x81,0x00,0x3},
8239 + {0x82,0x00,0x3},
8240 + {0x83,0x00,0x3},
8241 + {0x84,0x04,0x3},
8242 + {0x85,0x1c,0x3},
8243 + {0x86,0x05,0x3},
8244 + {0x87,0x1c,0x3},
8245 + {0x88,0x00,0x3},
8246 + {0x89,0x2d,0x3},
8247 + {0x8a,0x00,0x3},
8248 + {0x8b,0xcc,0x3},
8249 + {0x8c,0x00,0x3},
8250 + {0x8d,0x00,0x3},
8251 + {0x8e,0x08,0x3},
8252 + {0x8f,0x08,0x3},
8253 + {0x90,0x01,0x3},
8254 + {0x91,0x00,0x3},
8255 + {0x92,0x91,0x3},
8256 + {0x93,0x00,0x3},
8257 + {0x94,0x88,0x3},
8258 + {0x95,0x02,0x3},
8259 +
8260 +
8261 +
8262 + // page 4
8263 + {0xec,0x04,0x04},
8264 + {0x3f,0x09,0x04}, // VGA : old board :0x08 , new board ; 0X09
8265 + {0x18,0x00,0x04}, // sxga
8266 + {0x1c,0x41,0x04},
8267 + {0x20,0x41,0x04}, // vga center 040215
8268 + {0x22,0xc1,0x04},// a1);
8269 + {0x23,0x02,0x04},
8270 + {0x28,0x41,0x04},
8271 + {0x2a,0xc1,0x04},// a1);
8272 + {0x2b,0x02,0x04},
8273 +
8274 + {0x3c,0x0b,0x04}, //f); // vga
8275 + {0x58,0x11,0x04},
8276 + {0x5c,0x14,0x04},
8277 + {0x60,0x21,0x04},
8278 + {0x61,0x00,0x04},
8279 + {0x62,0xB1,0x04},
8280 + {0x63,0x02,0x04},
8281 + {0x64,0x01,0x04},
8282 + {0x65,0x00,0x04},
8283 + {0x66,0x01,0x04},
8284 + {0x67,0x02,0x04},
8285 + {0x68,0x21,0x04},
8286 + {0x69,0x00,0x04},
8287 + {0x6a,0xB1,0x04},
8288 + {0x6b,0x02,0x04},
8289 + {0x6c,0x01,0x04},
8290 + {0x6d,0x00,0x04},
8291 + {0x6e,0x01,0x04},
8292 + {0x6f,0x02,0x04},
8293 + {0x70,0x2D,0x04},
8294 + {0x71,0x00,0x04},
8295 + {0x72,0xd3,0x04}, // 14
8296 + {0x73,0x05,0x04}, // 15
8297 + {0x74,0x1C,0x04},
8298 + {0x75,0x05,0x04},
8299 + {0x76,0x1b,0x04}, // HendL
8300 + {0x77,0x0b,0x04}, // HendH
8301 + {0x78,0x01,0x04}, // 5.00
8302 + {0x79,0x80,0x04}, // 5.2a
8303 + {0x7a,0x33,0x04},
8304 + {0x7b,0x00,0x04},
8305 + {0x7c,0x38,0x04}, // 5.0e
8306 + {0x7d,0x03,0x04},
8307 + {0x7e,0x00,0x04},
8308 + {0x7f,0x0A,0x04},
8309 +
8310 + {0x80,0x2e,0x04},
8311 + {0x81,0x00,0x04},
8312 + {0x82,0xae,0x04},
8313 + {0x83,0x02,0x04},
8314 + {0x84,0x00,0x04},
8315 + {0x85,0x00,0x04},
8316 + {0x86,0x01,0x04},
8317 + {0x87,0x02,0x04},
8318 + {0x88,0x2e,0x04},
8319 + {0x89,0x00,0x04},
8320 + {0x8a,0xae,0x04},
8321 + {0x8b,0x02,0x04},
8322 + {0x8c,0x1c,0x04},
8323 + {0x8d,0x00,0x04},
8324 + {0x8e,0x04,0x04},
8325 + {0x8f,0x02,0x04},
8326 + {0x90,0x2d,0x04},
8327 + {0x91,0x00,0x04},
8328 + {0x92,0xa5,0x04},
8329 + {0x93,0x00,0x04},
8330 + {0x94,0x88,0x04},
8331 + {0x95,0x02,0x04},
8332 + {0x96,0xb3,0x04},
8333 + {0x97,0x06,0x04},
8334 + {0x98,0x01,0x04},
8335 + {0x99,0x00,0x04},
8336 + {0x9a,0x33,0x04},
8337 + {0x9b,0x30,0x04},
8338 + {0x9c,0x50,0x04},
8339 + {0x9d,0x30,0x04},
8340 + {0x9e,0x01,0x04},
8341 + {0x9f,0x08,0x04},
8342 +
8343 + // page 5
8344 + {0xec,0x05,0x05},
8345 + {0x5a,0x22,0x05},
8346 +
8347 + // page 6
8348 + {0xec,0x06,0x06},
8349 + {0x14,0x1e,0x06},
8350 + {0x15,0xb4,0x04},
8351 + {0x16,0x25,0x04},
8352 + {0x17,0x74,0x04},
8353 +
8354 + {0x10,0x48,0x04},
8355 + {0x11,0xa0,0x04},
8356 + {0x12,0x40,0x04}, // 040216 AE1 window ÁÙÀÓ
8357 + {0x13,0x70,0x04},
8358 +
8359 + {0x1a,0x29,0x04}, // 040217 AWB window ÁÙÀÓ
8360 + {0x30,0x40,0x04},
8361 + {0x31,0xa2,0x04},
8362 + {0x32,0x50,0x04},
8363 + {0x33,0xbc,0x04},
8364 + {0x34,0x10,0x04},
8365 + {0x35,0xd2,0x04},
8366 + {0x36,0x18,0x04},
8367 + {0x37,0xf5,0x04},
8368 + {0x38,0x10,0x04},
8369 + {0x39,0xd3,0x04},
8370 + {0x3a,0x1a,0x04},
8371 + {0x3b,0xf0,0x04},
8372 +
8373 + // page 7
8374 + {0xec,0x07,0x07},
8375 + {0x08,0xff,0x7},
8376 + {0x38,0x01,0x7}, //07); 040315
8377 + {0x39,0x01,0x7}, //02); //4); 040223 040315
8378 + {0x11,0xfe,0x7}, //fe); // green -2 040303
8379 + {0x2a,0x20,0x7},
8380 + {0x2b,0x20,0x7},
8381 + {0x2c,0x10,0x7},
8382 + {0x2d,0x00,0x7},
8383 + {0x2e,0xf0,0x7},
8384 + {0x2f,0xd0,0x7},
8385 + {0x3a,0xf0,0x7},
8386 + {0x23,0x07,0x7}, // for ESD
8387 +
8388 + // page 0
8389 + {0xec,0x00,0x00},
8390 + {0x8a,0x04,0x00},
8391 +
8392 + // page 1
8393 + {0xec,0x01,0x01},
8394 + {0xe5,0xb0,0x01},
8395 + {0xe5,0xb0,0x01},
8396 + {0xc2,0x01,0x01},
8397 +
8398 + {0x61,0x7b,0x01},
8399 + {0x62,0x7b,0x01},
8400 + {0x63,0x1b,0x01},
8401 + {0x64,0x1b,0x01},
8402 +
8403 + // page 0
8404 + {0xec,0x00,0x00},
8405 + {0x7e,0x04,0x00},
8406 +
8407 + // page 4
8408 + {0xec,0x04,0x04},
8409 + {0x04,0x02,0x04},
8410 + {0x06,0x02,0x04},
8411 +
8412 + // page 1
8413 + {0xec,0x01,0x01},
8414 + {0x10,0x05,0x01},
8415 + {0x54,0x02,0x01},
8416 + {0x56,0x02,0x01},
8417 +
8418 + // page 3
8419 + {0xec,0x03,0x03},
8420 + {0x0e,0x08,0x03},
8421 + {0x0f,0x08,0x03},
8422 +
8423 + // page 4
8424 + {0xec,0x04,0x04},
8425 + {0x00,0x30,0x04},
8426 + {0x0a,0x30,0x04},
8427 +
8428 + // page 5
8429 + {0xec,0x05,0x05},
8430 + {0x08,0x33,0x05},
8431 +
8432 + // page 0
8433 + {0xec,0x00,0x00},
8434 + {0x02,0x00,0x00},
8435 +
8436 + // page 4
8437 +//scale out
8438 + {0xec,0x04,0x04},
8439 + {0x02,0x20,0x04},
8440 + {0x1c,0x4f,0x04},
8441 +
8442 + // page 1
8443 + {0xec,0x01,0x01},
8444 + {0x52,0x20,0x01},
8445 +
8446 + // page 5
8447 + {0xec,0x05,0x05},
8448 + {0x0e,0x4f,0x05},
8449 +
8450 +//ae speed
8451 + // page 0
8452 + {0xec,0x00,0x00},
8453 + {0x92,0x80,0x00},
8454 + {0x93,0x02,0x00},
8455 + {0x94,0x04,0x00},
8456 + {0x95,0x04,0x00},
8457 + {0x96,0x04,0x00},
8458 + {0x97,0x04,0x00},
8459 + {0x9b,0x47,0x00},
8460 +
8461 + {0xec,0x00,0x00},
8462 + {0x40,0x17,0x00},
8463 + {0x41,0x4c,0x00},
8464 + {0x42,0x1d,0x00},
8465 + {0x43,0x3e,0x00},
8466 + {0x44,0x2a,0x00},
8467 + {0x45,0x2d,0x00},
8468 +
8469 + {0xec,0x01,0x01},
8470 + {0x20,0xd0,0x01}, //high light color reference
8471 +
8472 + {0xec,0x00,0x00},
8473 + {0x7e,0x00,0x00},
8474 + {0x73,0x11,0x00}, // 41
8475 + {0x78,0x78,0x00},
8476 +
8477 + {0xec,0x07,0x07},
8478 + {0x1b,0x3e,0x07},
8479 +
8480 + {0xec,0x00,0x00},
8481 + {0x48,0xA0,0x00}, //s48C0
8482 + {0x49,0xB0,0x00}, //s49B0
8483 + {0x4a,0x30,0x00}, //s4a20
8484 + {0x4b,0x70,0x00}, //s4b70
8485 + {0x4c,0xD0,0x00}, //s4cA0
8486 + {0x4d,0xB0,0x00}, //s4dB0
8487 + {0x4e,0x30,0x00}, //s4e30
8488 + {0x4f,0xF0,0x00}, //s4fF0
8489 + {0x50,0xA0,0x00}, //s50D0
8490 + {0x51,0xB0,0x00}, //s51B0
8491 + {0x52,0x25,0x00}, //s5210
8492 + {0x53,0x70,0x00}, //s5370
8493 + {0x54,0xD0,0x00}, //s5490
8494 + {0x55,0xD0,0x00}, //s55B0
8495 + {0x56,0x3A,0x00}, //s5640
8496 + {0x57,0xD0,0x00}, //s57D0
8497 + {0x58,0xA0,0x00}, //s58D0
8498 + {0x59,0xA0,0x00}, //s59B0
8499 + {0x5a,0x32,0x00}, //s5a0A
8500 + {0x5b,0x7A,0x00}, //s5b7A
8501 + {0x5c,0xB0,0x00}, //s5c90
8502 + {0x5d,0xC0,0x00}, //s5dC0
8503 + {0x5e,0x3E,0x00}, //s5e4A
8504 + {0x5f,0xfa,0x00}, //s5fD0
8505 +
8506 + // gamma
8507 + {0xec,0x01,0x01},
8508 + {0x24,0x31,0x01},
8509 + {0x25,0x4C,0x01},
8510 + {0x26,0x75,0x01},
8511 + {0x27,0xB5,0x01},
8512 + {0x28,0x17,0x01},
8513 + {0x29,0xAE,0x01},
8514 + {0x2A,0x97,0x01},
8515 + {0x2B,0xFF,0x01},
8516 + {0x2C,0x00,0x01},
8517 + {0x2D,0x5B,0x01},
8518 +
8519 + {0xB0,0x31,0x01},
8520 + {0xB1,0x4C,0x01},
8521 + {0xB2,0x75,0x01},
8522 + {0xB3,0xB5,0x01},
8523 + {0xB4,0x17,0x01},
8524 + {0xB5,0xAE,0x01},
8525 + {0xB6,0x97,0x01},
8526 + {0xB7,0xFF,0x01},
8527 + {0xB8,0x00,0x01},
8528 + {0xB9,0x5B,0x01},
8529 +
8530 + {0xec,0x00,0x00},
8531 + {0x77,0xb0,0x00},
8532 + {0x39,0x06,0x00},
8533 + {0x3a,0x08,0x00},
8534 +
8535 +};
8536 +
8537 +
8538 +#define S5X532_INIT_REGS (sizeof(s5x532_reg)/sizeof(s5x532_reg[0]))
8539 +#define S5X532_RISC_REGS 0xEB
8540 +#define S5X532_ISP_REGS 0xFB /* S5C7323X */
8541 +#define S5X532_CIS_REGS 0x2F /* S5K437LA03 */
8542 +
8543 +
8544 +#define PAGE_ADDRESS 0xEC
8545 +
8546 +//#define S5X532_REGS (S5X532_RISC_REGS+S5X532_ISP_REGS+S5X532_CIS_REGS)
8547 +#define S5X532_REGS (0x1000)
8548 +
8549 +
8550 +
8551 +#endif
8552 +
8553 +
8554 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/userapp.h
8555 ===================================================================
8556 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
8557 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/userapp.h 2008-12-11 22:46:48.000000000 +0100
8558 @@ -0,0 +1,44 @@
8559 +/*
8560 + Character Driver API Interface
8561 +
8562 + Copyright (C) 2003 Samsung Electronics (SW.LEE: hitchcar@samsung.com)
8563 +
8564 + This program is free software; you can redistribute it and/or modify
8565 + it under the terms of the GNU General Public License as published by
8566 + the Free Software Foundation; either version 2 of the License, or
8567 + (at your option) any later version.
8568 +
8569 +*/
8570 +
8571 +#ifndef __FIMC20_CAMIF_USR_APP_H_
8572 +#define __FIMC20_CAMIF_USR_APP_H_
8573 +
8574 +
8575 +/*
8576 + * IOCTL Command for Character Driver
8577 + */
8578 +
8579 +#define CMD_CAMERA_INIT 0x23
8580 +/* Test Application Usage */
8581 +typedef struct {
8582 + int src_x;
8583 + int src_y;
8584 + int dst_x;
8585 + int dst_y;
8586 + int bpp;
8587 + int flip;
8588 +} camif_param_t;
8589 +
8590 +
8591 +
8592 +#endif
8593 +
8594 +
8595 +/*
8596 + * Local variables:
8597 + * tab-width: 8
8598 + * c-indent-level: 8
8599 + * c-basic-offset: 8
8600 + * c-set-style: "K&R"
8601 + * End:
8602 + */
8603 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/v4l2_api.c
8604 ===================================================================
8605 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
8606 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/v4l2_api.c 2008-12-11 22:46:48.000000000 +0100
8607 @@ -0,0 +1,311 @@
8608 +/*
8609 + * . 2004-01-03: SW.LEE <hitchcar@sec.samsung.com>
8610 + *
8611 + * This file is subject to the terms and conditions of the GNU General Public
8612 + * License 2. See the file COPYING in the main directory of this archive
8613 + * for more details.
8614 + */
8615 +
8616 +#include <linux/config.h>
8617 +#include <linux/module.h>
8618 +#include <linux/kernel.h>
8619 +#include <linux/init.h>
8620 +#include <linux/sched.h>
8621 +#include <linux/irq.h>
8622 +#include <linux/tqueue.h>
8623 +#include <linux/locks.h>
8624 +#include <linux/completion.h>
8625 +#include <linux/delay.h>
8626 +#include <linux/slab.h>
8627 +#include <linux/vmalloc.h>
8628 +#include <linux/miscdevice.h>
8629 +#include <linux/wait.h>
8630 +
8631 +#include <asm/io.h>
8632 +#include <asm/semaphore.h>
8633 +#include <asm/hardware.h>
8634 +#include <asm/uaccess.h>
8635 +
8636 +#include <asm/arch/cpu_s3c2440.h>
8637 +#include <asm/arch/S3C2440.h>
8638 +
8639 +#include "camif.h"
8640 +#include "videodev.h"
8641 +
8642 +/*
8643 + Codec_formats/Preview_format[0] must be same to initial value of
8644 + preview_init_param/codec_init_param
8645 +*/
8646 +
8647 +const struct v4l2_fmtdesc codec_formats[] = {
8648 + {
8649 + .index = 0,
8650 + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
8651 +// .flags = FORMAT_FLAGS_PLANAR,
8652 + .description = "4:2:2, planar, Y-Cb-Cr",
8653 + .pixelformat = V4L2_PIX_FMT_YUV422P,
8654 +
8655 + },{
8656 + .index = 1,
8657 + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
8658 +// .flags = FORMAT_FLAGS_PLANAR,
8659 + .name = "4:2:0, planar, Y-Cb-Cr",
8660 + .fourcc = V4L2_PIX_FMT_YUV420,
8661 + }
8662 +};
8663 +
8664 +
8665 +/* Todo
8666 + FIMC V4L2_PIX_FMT_RGB565 is not same to that of V4L2spec
8667 + and so we need image convert to FIMC V4l2_PIX_FMT_RGB565.
8668 +*/
8669 +const struct v4l2_fmtdesc preview_formats[] = {
8670 + {
8671 + .index = 1,
8672 + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
8673 + .description = "16 bpp RGB, le",
8674 + .fourcc = V4L2_PIX_FMT_RGB565,
8675 +// .flags = FORMAT_FLAGS_PACKED,
8676 + },
8677 + {
8678 + .index = 0,
8679 + .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
8680 +// .flags = FORMAT_FLAGS_PACKED,
8681 + .description = "32 bpp RGB, le",
8682 + .fourcc = V4L2_PIX_FMT_BGR32,
8683 + }
8684 +}
8685 +
8686 +#define NUM_F ARRARY_SIZE(preview_formats)
8687 +
8688 +
8689 +/*
8690 + * This function and v4l2 structure made for V4L2 API functions
8691 + * App <--> v4l2 <--> logical param <--> hardware
8692 + */
8693 +static int camif_get_v4l2(camif_cfg_t *cfg)
8694 +{
8695 + return 0;
8696 +}
8697 +
8698 +
8699 +/*
8700 +** Gives the depth of a video4linux2 fourcc aka pixel format in bits.
8701 +*/
8702 +static int pixfmt2depth(int pixfmt,int *fmtptr)
8703 +{
8704 + int fmt, depth;
8705 +
8706 + switch (pixfmt) {
8707 + case V4L2_PIX_FMT_RGB565:
8708 + case V4L2_PIX_FMT_RGB565X:
8709 + fmt = CAMIF_RGB_16;
8710 + depth = 16;
8711 + break;
8712 + case V4L2_PIX_FMT_BGR24: /* Not tested */
8713 + case V4L2_PIX_FMT_RGB24:
8714 + fmt = CAMIF_RGB_24;
8715 + depth = 24;
8716 + break;
8717 + case V4L2_PIX_FMT_BGR32:
8718 + case V4L2_PIX_FMT_RGB32:
8719 + fmt = CAMIF_RGB_24;
8720 + depth 32;
8721 + break;
8722 + case V4L2_PIX_FMT_GREY: /* Not tested */
8723 + fmt = CAMIF_OUT_YCBCR420;
8724 + depth = 8;
8725 + break;
8726 + case V4L2_PIX_FMT_YUYV:
8727 + case V4L2_PIX_FMT_UYVY:
8728 + case V4L2_PIX_FMT_YUV422P:
8729 + fmt = CAMIF_OUT_YCBCR422;
8730 + depth = 16;
8731 + break;
8732 + case V4L2_PIX_FMT_YUV420:
8733 + fmt = CAMIF_OUT_YCBCR420;
8734 + depth = 12;
8735 + break;
8736 + }
8737 + if (fmtptr) *fmtptr = fmt;
8738 + return depth;
8739 +}
8740 +
8741 +
8742 +
8743 +static int camif_s_v4l2(camif_cfg_t *cfg)
8744 +{
8745 + int num = cfg->v2.used_fmt;
8746 +
8747 + if ( !(cfg->v2.status&CAMIF_V4L2_INIT)) {
8748 + int depth;
8749 + int fourcc = v2.fmtdesc[num].pixelformat;
8750 +
8751 + /* To define v4l2_fmtsdesc */
8752 + if (cfg->dma_type == CAMIF_CODEC)
8753 + cfg->v2->fmtdesc = codec_formats;
8754 + else
8755 + cfg->v2->fmtdesc = preview_formats;
8756 +
8757 + /* To define v4l2_format used currently */
8758 + cfg->v2.fmt.width = cfg->target_x;
8759 + cfg->v2.fmt.height = cfg->target_y;
8760 + cfg->v2.fmt.field = V4L2_FIELD_NONE;
8761 + cfg->v2.fmt.pixelformat = fourcc;
8762 + depth = pixfmt2depth(fourcc,NULL);
8763 + cfg->v2.fmt.bytesperline= cfg->v2.fmt.width*depth >> 3;
8764 + cfg->v2.fmt.sizeimage =
8765 + cfg->v2.fmt.height * cfg->v2.fmt.bytesperline;
8766 +
8767 + /* To define v4l2_input */
8768 + cfg->v2.input.index = 0;
8769 + if (cfg->dma_type == CAMIF_CODEC)
8770 + snprintf(cfg->v2.input.name, 31, "CAMIF CODEC");
8771 + else
8772 + snprintf(cfg->v2.input.name, 31, "CAMIF PREVIEW");
8773 + cfg->v2.input.type = V4L2_INPUT_TYPE_CAMERA;
8774 +
8775 + /* Write the Status of v4l2 machine */
8776 + cfg->v2.status |= CAMIF_V4L2_INIT;
8777 + }
8778 + return 0;
8779 +}
8780 +
8781 +
8782 +static int camif_g_fmt(camif_cfg_t *cfg, struct v4l2_format *f)
8783 +{
8784 + int size = sizeof(struct v4l2_pix_format);
8785 +
8786 + switch (f->type) {
8787 + case V4L2_BUF_TYPE_VIDEO_CAPTURE:
8788 + memset(&f->fmt.pix,0,size);
8789 + memcpy(&f->fmt.pix,&cfg->v2.fmt,size);
8790 + return 0;
8791 + default:
8792 + return -EINVAL;
8793 + }
8794 +}
8795 +
8796 +
8797 +/* Copy v4l2 parameter into other element of camif_cfg_t */
8798 +static int camif_s_try(camif_cfg_t *cfg, int f)
8799 +{
8800 + int fmt;
8801 + cfg->target_x = cfg->v2.fmt.width;
8802 + cfg->target_y = cfg->v2.fmt.height;
8803 + pixfmt2depth(cfg->v2.fmt.pixelformat,&fmt);
8804 + cfg->fmt = fmt;
8805 + camif_dynamic_conf(cfg);
8806 +}
8807 +
8808 +
8809 +static int camif_s_fmt(camif_cfg_t *cfg, struct v4l2_format *f)
8810 +{
8811 + int retval;
8812 +
8813 + switch (f->type) {
8814 + case V4L2_BUF_TYPE_VIDEO_CAPTURE:
8815 + {
8816 + /* update our state informations */
8817 +// down(&fh->cap.lock);
8818 + cfg->v2.fmt = f->pix;
8819 + cfg->v2.status |= CAMIF_v4L2_DIRTY;
8820 + camif_dynamic_conf(cfg);
8821 + cfg->v2.status &= ~CAMIF_v4L2_DIRTY; /* dummy ? */
8822 +// up(&fh->cap.lock);
8823 +
8824 + return 0;
8825 + }
8826 + default:
8827 + return -EINVAL;
8828 + }
8829 +
8830 +}
8831 +
8832 +/* Refer ioctl of videodeX.c and bttv-driver.c */
8833 +int camif_do_ioctl
8834 +(struct inode *inode, struct file *file,unsigned int cmd, void * arg)
8835 +{
8836 + camif_cfg_t *cfg = file->private_data;
8837 + int ret = 0;
8838 +
8839 + switch (cmd) {
8840 + case VIDIOC_QUERYCAP:
8841 + {
8842 + struct v4l2_capability *cap = arg;
8843 +
8844 + strcpy(cap->driver,"Fimc Camera");
8845 + strlcpy(cap->card,cfg->v->name,sizeof(cap->card));
8846 + sprintf(cap->bus_info,"FIMC 2.0 AHB Bus");
8847 + cap->version = 0;
8848 + cap->capabilities =
8849 + V4L2_CAP_VIDEO_CAPTURE |V4L2_CAP_READWRITE;
8850 + return 0;
8851 + }
8852 + case VIDIOC_G_FMT:
8853 + {
8854 + struct v4l2_format *f = arg;
8855 + return camif_g_fmt(cfg,f);
8856 + }
8857 + case VIDIOC_S_FMT:
8858 + {
8859 + struct v4l2_format *f = arg;
8860 + return camif_s_fmt(cfg,f);
8861 + }
8862 +
8863 + case VIDIOC_ENUM_FMT:
8864 + {
8865 + struct v4l2_fmtdesc *f = arg;
8866 + enum v4l2_buf_type type = f->type;
8867 + int index = f->index;
8868 +
8869 + if (index >= NUM_F)
8870 + return -EINVAL;
8871 + switch (f->type) {
8872 + case V4L2_BUF_TYPE_VIDEO_CAPTURE:
8873 + break;
8874 + case V4L2_BUF_TYPE_VIDEO_OVERLAY:
8875 + case V4L2_BUF_TYPE_VBI_CAPTURE:
8876 + default:
8877 + return -EINVAL;
8878 + }
8879 + memset(f,0,sizeof(*f));
8880 + memcpy(f,cfg->v2.fmtdesc+index,sizeof(*f));
8881 + return 0;
8882 + }
8883 + case VIDIOC_G_INPUT:
8884 + {
8885 + u32 *i = arg;
8886 + *i = cfg->v2.input;
8887 + return 0;
8888 + }
8889 + case VIDIOC_S_INPUT:
8890 + {
8891 + int index = *((int *)arg);
8892 + if (index != 0)
8893 + return -EINVAL;
8894 + cfg->v2.input.index = index;
8895 + return 0;
8896 + }
8897 +
8898 + default:
8899 + return -ENOIOCTLCMD; /* errno.h */
8900 + } /* End of Switch */
8901 +
8902 +
8903 +}
8904 +
8905 +
8906 +
8907 +
8908 +
8909 +
8910 +
8911 +/*
8912 + * Local variables:
8913 + * tab-width: 8
8914 + * c-indent-level: 8
8915 + * c-basic-offset: 8
8916 + * c-set-style: "K&R"
8917 + * End:
8918 + */
8919 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/videodev2.h
8920 ===================================================================
8921 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
8922 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/videodev2.h 2008-12-11 22:46:49.000000000 +0100
8923 @@ -0,0 +1,938 @@
8924 +#ifndef __LINUX_VIDEODEV2_H
8925 +#define __LINUX_VIDEODEV2_H
8926 +/*
8927 + * Video for Linux Two
8928 + *
8929 + * Header file for v4l or V4L2 drivers and applications, for
8930 + * Linux kernels 2.2.x or 2.4.x.
8931 + *
8932 + * See http://bytesex.org/v4l/ for API specs and other
8933 + * v4l2 documentation.
8934 + *
8935 + * Author: Bill Dirks <bdirks@pacbell.net>
8936 + * Justin Schoeman
8937 + * et al.
8938 + */
8939 +#ifdef __KERNEL__
8940 +#include <linux/time.h> /* need struct timeval */
8941 +#endif
8942 +
8943 +/*
8944 + * M I S C E L L A N E O U S
8945 + */
8946 +
8947 +/* Four-character-code (FOURCC) */
8948 +#define v4l2_fourcc(a,b,c,d)\
8949 + (((__u32)(a)<<0)|((__u32)(b)<<8)|((__u32)(c)<<16)|((__u32)(d)<<24))
8950 +
8951 +/*
8952 + * E N U M S
8953 + */
8954 +enum v4l2_field {
8955 + V4L2_FIELD_ANY = 0, /* driver can choose from none,
8956 + top, bottom, interlaced
8957 + depending on whatever it thinks
8958 + is approximate ... */
8959 + V4L2_FIELD_NONE = 1, /* this device has no fields ... */
8960 + V4L2_FIELD_TOP = 2, /* top field only */
8961 + V4L2_FIELD_BOTTOM = 3, /* bottom field only */
8962 + V4L2_FIELD_INTERLACED = 4, /* both fields interlaced */
8963 + V4L2_FIELD_SEQ_TB = 5, /* both fields sequential into one
8964 + buffer, top-bottom order */
8965 + V4L2_FIELD_SEQ_BT = 6, /* same as above + bottom-top order */
8966 + V4L2_FIELD_ALTERNATE = 7, /* both fields alternating into
8967 + separate buffers */
8968 +};
8969 +#define V4L2_FIELD_HAS_TOP(field) \
8970 + ((field) == V4L2_FIELD_TOP ||\
8971 + (field) == V4L2_FIELD_INTERLACED ||\
8972 + (field) == V4L2_FIELD_SEQ_TB ||\
8973 + (field) == V4L2_FIELD_SEQ_BT)
8974 +#define V4L2_FIELD_HAS_BOTTOM(field) \
8975 + ((field) == V4L2_FIELD_BOTTOM ||\
8976 + (field) == V4L2_FIELD_INTERLACED ||\
8977 + (field) == V4L2_FIELD_SEQ_TB ||\
8978 + (field) == V4L2_FIELD_SEQ_BT)
8979 +#define V4L2_FIELD_HAS_BOTH(field) \
8980 + ((field) == V4L2_FIELD_INTERLACED ||\
8981 + (field) == V4L2_FIELD_SEQ_TB ||\
8982 + (field) == V4L2_FIELD_SEQ_BT)
8983 +
8984 +enum v4l2_buf_type {
8985 + V4L2_BUF_TYPE_VIDEO_CAPTURE = 1,
8986 + V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
8987 + V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
8988 + V4L2_BUF_TYPE_VBI_CAPTURE = 4,
8989 + V4L2_BUF_TYPE_VBI_OUTPUT = 5,
8990 + V4L2_BUF_TYPE_PRIVATE = 0x80,
8991 +};
8992 +
8993 +enum v4l2_ctrl_type {
8994 + V4L2_CTRL_TYPE_INTEGER = 1,
8995 + V4L2_CTRL_TYPE_BOOLEAN = 2,
8996 + V4L2_CTRL_TYPE_MENU = 3,
8997 + V4L2_CTRL_TYPE_BUTTON = 4,
8998 +};
8999 +
9000 +enum v4l2_tuner_type {
9001 + V4L2_TUNER_RADIO = 1,
9002 + V4L2_TUNER_ANALOG_TV = 2,
9003 +};
9004 +
9005 +enum v4l2_memory {
9006 + V4L2_MEMORY_MMAP = 1,
9007 + V4L2_MEMORY_USERPTR = 2,
9008 + V4L2_MEMORY_OVERLAY = 3,
9009 +};
9010 +
9011 +/* see also http://vektor.theorem.ca/graphics/ycbcr/ */
9012 +enum v4l2_colorspace {
9013 + /* ITU-R 601 -- broadcast NTSC/PAL */
9014 + V4L2_COLORSPACE_SMPTE170M = 1,
9015 +
9016 + /* 1125-Line (US) HDTV */
9017 + V4L2_COLORSPACE_SMPTE240M = 2,
9018 +
9019 + /* HD and modern captures. */
9020 + V4L2_COLORSPACE_REC709 = 3,
9021 +
9022 + /* broken BT878 extents (601, luma range 16-253 instead of 16-235) */
9023 + V4L2_COLORSPACE_BT878 = 4,
9024 +
9025 + /* These should be useful. Assume 601 extents. */
9026 + V4L2_COLORSPACE_470_SYSTEM_M = 5,
9027 + V4L2_COLORSPACE_470_SYSTEM_BG = 6,
9028 +
9029 + /* I know there will be cameras that send this. So, this is
9030 + * unspecified chromaticities and full 0-255 on each of the
9031 + * Y'CbCr components
9032 + */
9033 + V4L2_COLORSPACE_JPEG = 7,
9034 +
9035 + /* For RGB colourspaces, this is probably a good start. */
9036 + V4L2_COLORSPACE_SRGB = 8,
9037 +};
9038 +
9039 +enum v4l2_priority {
9040 + V4L2_PRIORITY_UNSET = 0, /* not initialized */
9041 + V4L2_PRIORITY_BACKGROUND = 1,
9042 + V4L2_PRIORITY_INTERACTIVE = 2,
9043 + V4L2_PRIORITY_RECORD = 3,
9044 + V4L2_PRIORITY_DEFAULT = V4L2_PRIORITY_INTERACTIVE,
9045 +};
9046 +
9047 +struct v4l2_rect {
9048 + __s32 left;
9049 + __s32 top;
9050 + __s32 width;
9051 + __s32 height;
9052 +};
9053 +
9054 +struct v4l2_fract {
9055 + __u32 numerator;
9056 + __u32 denominator;
9057 +};
9058 +
9059 +/*
9060 + * D R I V E R C A P A B I L I T I E S
9061 + */
9062 +struct v4l2_capability
9063 +{
9064 + __u8 driver[16]; /* i.e. "bttv" */
9065 + __u8 card[32]; /* i.e. "Hauppauge WinTV" */
9066 + __u8 bus_info[32]; /* "PCI:" + pci_name(pci_dev) */
9067 + __u32 version; /* should use KERNEL_VERSION() */
9068 + __u32 capabilities; /* Device capabilities */
9069 + __u32 reserved[4];
9070 +};
9071 +
9072 +/* Values for 'capabilities' field */
9073 +#define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */
9074 +#define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video output device */
9075 +#define V4L2_CAP_VIDEO_OVERLAY 0x00000004 /* Can do video overlay */
9076 +#define V4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a VBI capture device */
9077 +#define V4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a VBI output device */
9078 +#define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */
9079 +
9080 +#define V4L2_CAP_TUNER 0x00010000 /* has a tuner */
9081 +#define V4L2_CAP_AUDIO 0x00020000 /* has audio support */
9082 +#define V4L2_CAP_RADIO 0x00040000 /* is a radio device */
9083 +
9084 +#define V4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */
9085 +#define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */
9086 +#define V4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */
9087 +
9088 +/*
9089 + * V I D E O I M A G E F O R M A T
9090 + */
9091 +
9092 +struct v4l2_pix_format
9093 +{
9094 + __u32 width;
9095 + __u32 height;
9096 + __u32 pixelformat;
9097 + enum v4l2_field field;
9098 + __u32 bytesperline; /* for padding, zero if unused */
9099 + __u32 sizeimage;
9100 + enum v4l2_colorspace colorspace;
9101 + __u32 priv; /* private data, depends on pixelformat */
9102 +};
9103 +
9104 +/* Pixel format FOURCC depth Description */
9105 +#define V4L2_PIX_FMT_RGB332 v4l2_fourcc('R','G','B','1') /* 8 RGB-3-3-2 */
9106 +#define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R','G','B','O') /* 16 RGB-5-5-5 */
9107 +#define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R','G','B','P') /* 16 RGB-5-6-5 */
9108 +#define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R','G','B','Q') /* 16 RGB-5-5-5 BE */
9109 +#define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R','G','B','R') /* 16 RGB-5-6-5 BE */
9110 +#define V4L2_PIX_FMT_BGR24 v4l2_fourcc('B','G','R','3') /* 24 BGR-8-8-8 */
9111 +#define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R','G','B','3') /* 24 RGB-8-8-8 */
9112 +#define V4L2_PIX_FMT_BGR32 v4l2_fourcc('B','G','R','4') /* 32 BGR-8-8-8-8 */
9113 +#define V4L2_PIX_FMT_RGB32 v4l2_fourcc('R','G','B','4') /* 32 RGB-8-8-8-8 */
9114 +#define V4L2_PIX_FMT_GREY v4l2_fourcc('G','R','E','Y') /* 8 Greyscale */
9115 +#define V4L2_PIX_FMT_YVU410 v4l2_fourcc('Y','V','U','9') /* 9 YVU 4:1:0 */
9116 +#define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y','V','1','2') /* 12 YVU 4:2:0 */
9117 +#define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y','U','Y','V') /* 16 YUV 4:2:2 */
9118 +#define V4L2_PIX_FMT_UYVY v4l2_fourcc('U','Y','V','Y') /* 16 YUV 4:2:2 */
9119 +#define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4','2','2','P') /* 16 YVU422 planar */
9120 +#define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4','1','1','P') /* 16 YVU411 planar */
9121 +#define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y','4','1','P') /* 12 YUV 4:1:1 */
9122 +
9123 +/* two planes -- one Y, one Cr + Cb interleaved */
9124 +#define V4L2_PIX_FMT_NV12 v4l2_fourcc('N','V','1','2') /* 12 Y/CbCr 4:2:0 */
9125 +#define V4L2_PIX_FMT_NV21 v4l2_fourcc('N','V','2','1') /* 12 Y/CrCb 4:2:0 */
9126 +
9127 +/* The following formats are not defined in the V4L2 specification */
9128 +#define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y','U','V','9') /* 9 YUV 4:1:0 */
9129 +#define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') /* 12 YUV 4:2:0 */
9130 +#define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') /* 16 YUV 4:2:2 */
9131 +#define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */
9132 +
9133 +/* compressed formats */
9134 +#define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M','J','P','G') /* Motion-JPEG */
9135 +#define V4L2_PIX_FMT_JPEG v4l2_fourcc('J','P','E','G') /* JFIF JPEG */
9136 +#define V4L2_PIX_FMT_DV v4l2_fourcc('d','v','s','d') /* 1394 */
9137 +#define V4L2_PIX_FMT_MPEG v4l2_fourcc('M','P','E','G') /* MPEG */
9138 +
9139 +/* Vendor-specific formats */
9140 +#define V4L2_PIX_FMT_WNVA v4l2_fourcc('W','N','V','A') /* Winnov hw compress */
9141 +
9142 +/*
9143 + * F O R M A T E N U M E R A T I O N
9144 + */
9145 +struct v4l2_fmtdesc
9146 +{
9147 + __u32 index; /* Format number */
9148 + enum v4l2_buf_type type; /* buffer type */
9149 + __u32 flags;
9150 + __u8 description[32]; /* Description string */
9151 + __u32 pixelformat; /* Format fourcc */
9152 + __u32 reserved[4];
9153 +};
9154 +
9155 +#define V4L2_FMT_FLAG_COMPRESSED 0x0001
9156 +
9157 +
9158 +/*
9159 + * T I M E C O D E
9160 + */
9161 +struct v4l2_timecode
9162 +{
9163 + __u32 type;
9164 + __u32 flags;
9165 + __u8 frames;
9166 + __u8 seconds;
9167 + __u8 minutes;
9168 + __u8 hours;
9169 + __u8 userbits[4];
9170 +};
9171 +
9172 +/* Type */
9173 +#define V4L2_TC_TYPE_24FPS 1
9174 +#define V4L2_TC_TYPE_25FPS 2
9175 +#define V4L2_TC_TYPE_30FPS 3
9176 +#define V4L2_TC_TYPE_50FPS 4
9177 +#define V4L2_TC_TYPE_60FPS 5
9178 +
9179 +/* Flags */
9180 +#define V4L2_TC_FLAG_DROPFRAME 0x0001 /* "drop-frame" mode */
9181 +#define V4L2_TC_FLAG_COLORFRAME 0x0002
9182 +#define V4L2_TC_USERBITS_field 0x000C
9183 +#define V4L2_TC_USERBITS_USERDEFINED 0x0000
9184 +#define V4L2_TC_USERBITS_8BITCHARS 0x0008
9185 +/* The above is based on SMPTE timecodes */
9186 +
9187 +
9188 +/*
9189 + * C O M P R E S S I O N P A R A M E T E R S
9190 + */
9191 +#if 0
9192 +/* ### generic compression settings don't work, there is too much
9193 + * ### codec-specific stuff. Maybe reuse that for MPEG codec settings
9194 + * ### later ... */
9195 +struct v4l2_compression
9196 +{
9197 + __u32 quality;
9198 + __u32 keyframerate;
9199 + __u32 pframerate;
9200 + __u32 reserved[5];
9201 +
9202 +/* what we'll need for MPEG, extracted from some postings on
9203 + the v4l list (Gert Vervoort, PlasmaJohn).
9204 +
9205 +system stream:
9206 + - type: elementary stream(ES), packatised elementary stream(s) (PES)
9207 + program stream(PS), transport stream(TS)
9208 + - system bitrate
9209 + - PS packet size (DVD: 2048 bytes, VCD: 2324 bytes)
9210 + - TS video PID
9211 + - TS audio PID
9212 + - TS PCR PID
9213 + - TS system information tables (PAT, PMT, CAT, NIT and SIT)
9214 + - (MPEG-1 systems stream vs. MPEG-2 program stream (TS not supported
9215 + by MPEG-1 systems)
9216 +
9217 +audio:
9218 + - type: MPEG (+Layer I,II,III), AC-3, LPCM
9219 + - bitrate
9220 + - sampling frequency (DVD: 48 Khz, VCD: 44.1 KHz, 32 kHz)
9221 + - Trick Modes? (ff, rew)
9222 + - Copyright
9223 + - Inverse Telecine
9224 +
9225 +video:
9226 + - picturesize (SIF, 1/2 D1, 2/3 D1, D1) and PAL/NTSC norm can be set
9227 + through excisting V4L2 controls
9228 + - noise reduction, parameters encoder specific?
9229 + - MPEG video version: MPEG-1, MPEG-2
9230 + - GOP (Group Of Pictures) definition:
9231 + - N: number of frames per GOP
9232 + - M: distance between reference (I,P) frames
9233 + - open/closed GOP
9234 + - quantiser matrix: inter Q matrix (64 bytes) and intra Q matrix (64 bytes)
9235 + - quantiser scale: linear or logarithmic
9236 + - scanning: alternate or zigzag
9237 + - bitrate mode: CBR (constant bitrate) or VBR (variable bitrate).
9238 + - target video bitrate for CBR
9239 + - target video bitrate for VBR
9240 + - maximum video bitrate for VBR - min. quantiser value for VBR
9241 + - max. quantiser value for VBR
9242 + - adaptive quantisation value
9243 + - return the number of bytes per GOP or bitrate for bitrate monitoring
9244 +
9245 +*/
9246 +};
9247 +#endif
9248 +
9249 +struct v4l2_jpegcompression
9250 +{
9251 + int quality;
9252 +
9253 + int APPn; /* Number of APP segment to be written,
9254 + * must be 0..15 */
9255 + int APP_len; /* Length of data in JPEG APPn segment */
9256 + char APP_data[60]; /* Data in the JPEG APPn segment. */
9257 +
9258 + int COM_len; /* Length of data in JPEG COM segment */
9259 + char COM_data[60]; /* Data in JPEG COM segment */
9260 +
9261 + __u32 jpeg_markers; /* Which markers should go into the JPEG
9262 + * output. Unless you exactly know what
9263 + * you do, leave them untouched.
9264 + * Inluding less markers will make the
9265 + * resulting code smaller, but there will
9266 + * be fewer aplications which can read it.
9267 + * The presence of the APP and COM marker
9268 + * is influenced by APP_len and COM_len
9269 + * ONLY, not by this property! */
9270 +
9271 +#define V4L2_JPEG_MARKER_DHT (1<<3) /* Define Huffman Tables */
9272 +#define V4L2_JPEG_MARKER_DQT (1<<4) /* Define Quantization Tables */
9273 +#define V4L2_JPEG_MARKER_DRI (1<<5) /* Define Restart Interval */
9274 +#define V4L2_JPEG_MARKER_COM (1<<6) /* Comment segment */
9275 +#define V4L2_JPEG_MARKER_APP (1<<7) /* App segment, driver will
9276 + * allways use APP0 */
9277 +};
9278 +
9279 +
9280 +/*
9281 + * M E M O R Y - M A P P I N G B U F F E R S
9282 + */
9283 +struct v4l2_requestbuffers
9284 +{
9285 + __u32 count;
9286 + enum v4l2_buf_type type;
9287 + enum v4l2_memory memory;
9288 + __u32 reserved[2];
9289 +};
9290 +
9291 +struct v4l2_buffer
9292 +{
9293 + __u32 index;
9294 + enum v4l2_buf_type type;
9295 + __u32 bytesused;
9296 + __u32 flags;
9297 + enum v4l2_field field;
9298 + struct timeval timestamp;
9299 + struct v4l2_timecode timecode;
9300 + __u32 sequence;
9301 +
9302 + /* memory location */
9303 + enum v4l2_memory memory;
9304 + union {
9305 + __u32 offset;
9306 + unsigned long userptr;
9307 + } m;
9308 + __u32 length;
9309 +
9310 + __u32 reserved[2];
9311 +};
9312 +
9313 +/* Flags for 'flags' field */
9314 +#define V4L2_BUF_FLAG_MAPPED 0x0001 /* Buffer is mapped (flag) */
9315 +#define V4L2_BUF_FLAG_QUEUED 0x0002 /* Buffer is queued for processing */
9316 +#define V4L2_BUF_FLAG_DONE 0x0004 /* Buffer is ready */
9317 +#define V4L2_BUF_FLAG_KEYFRAME 0x0008 /* Image is a keyframe (I-frame) */
9318 +#define V4L2_BUF_FLAG_PFRAME 0x0010 /* Image is a P-frame */
9319 +#define V4L2_BUF_FLAG_BFRAME 0x0020 /* Image is a B-frame */
9320 +#define V4L2_BUF_FLAG_TIMECODE 0x0100 /* timecode field is valid */
9321 +
9322 +/*
9323 + * O V E R L A Y P R E V I E W
9324 + */
9325 +struct v4l2_framebuffer
9326 +{
9327 + __u32 capability;
9328 + __u32 flags;
9329 +/* FIXME: in theory we should pass something like PCI device + memory
9330 + * region + offset instead of some physical address */
9331 + void* base;
9332 + struct v4l2_pix_format fmt;
9333 +};
9334 +/* Flags for the 'capability' field. Read only */
9335 +#define V4L2_FBUF_CAP_EXTERNOVERLAY 0x0001
9336 +#define V4L2_FBUF_CAP_CHROMAKEY 0x0002
9337 +#define V4L2_FBUF_CAP_LIST_CLIPPING 0x0004
9338 +#define V4L2_FBUF_CAP_BITMAP_CLIPPING 0x0008
9339 +/* Flags for the 'flags' field. */
9340 +#define V4L2_FBUF_FLAG_PRIMARY 0x0001
9341 +#define V4L2_FBUF_FLAG_OVERLAY 0x0002
9342 +#define V4L2_FBUF_FLAG_CHROMAKEY 0x0004
9343 +
9344 +struct v4l2_clip
9345 +{
9346 + struct v4l2_rect c;
9347 + struct v4l2_clip *next;
9348 +};
9349 +
9350 +struct v4l2_window
9351 +{
9352 + struct v4l2_rect w;
9353 + enum v4l2_field field;
9354 + __u32 chromakey;
9355 + struct v4l2_clip *clips;
9356 + __u32 clipcount;
9357 + void *bitmap;
9358 +};
9359 +
9360 +
9361 +/*
9362 + * C A P T U R E P A R A M E T E R S
9363 + */
9364 +struct v4l2_captureparm
9365 +{
9366 + __u32 capability; /* Supported modes */
9367 + __u32 capturemode; /* Current mode */
9368 + struct v4l2_fract timeperframe; /* Time per frame in .1us units */
9369 + __u32 extendedmode; /* Driver-specific extensions */
9370 + __u32 readbuffers; /* # of buffers for read */
9371 + __u32 reserved[4];
9372 +};
9373 +/* Flags for 'capability' and 'capturemode' fields */
9374 +#define V4L2_MODE_HIGHQUALITY 0x0001 /* High quality imaging mode */
9375 +#define V4L2_CAP_TIMEPERFRAME 0x1000 /* timeperframe field is supported */
9376 +
9377 +struct v4l2_outputparm
9378 +{
9379 + __u32 capability; /* Supported modes */
9380 + __u32 outputmode; /* Current mode */
9381 + struct v4l2_fract timeperframe; /* Time per frame in seconds */
9382 + __u32 extendedmode; /* Driver-specific extensions */
9383 + __u32 writebuffers; /* # of buffers for write */
9384 + __u32 reserved[4];
9385 +};
9386 +
9387 +/*
9388 + * I N P U T I M A G E C R O P P I N G
9389 + */
9390 +
9391 +struct v4l2_cropcap {
9392 + enum v4l2_buf_type type;
9393 + struct v4l2_rect bounds;
9394 + struct v4l2_rect defrect;
9395 + struct v4l2_fract pixelaspect;
9396 +};
9397 +
9398 +struct v4l2_crop {
9399 + enum v4l2_buf_type type;
9400 + struct v4l2_rect c;
9401 +};
9402 +
9403 +/*
9404 + * A N A L O G V I D E O S T A N D A R D
9405 + */
9406 +
9407 +typedef __u64 v4l2_std_id;
9408 +
9409 +/* one bit for each */
9410 +#define V4L2_STD_PAL_B ((v4l2_std_id)0x00000001)
9411 +#define V4L2_STD_PAL_B1 ((v4l2_std_id)0x00000002)
9412 +#define V4L2_STD_PAL_G ((v4l2_std_id)0x00000004)
9413 +#define V4L2_STD_PAL_H ((v4l2_std_id)0x00000008)
9414 +#define V4L2_STD_PAL_I ((v4l2_std_id)0x00000010)
9415 +#define V4L2_STD_PAL_D ((v4l2_std_id)0x00000020)
9416 +#define V4L2_STD_PAL_D1 ((v4l2_std_id)0x00000040)
9417 +#define V4L2_STD_PAL_K ((v4l2_std_id)0x00000080)
9418 +
9419 +#define V4L2_STD_PAL_M ((v4l2_std_id)0x00000100)
9420 +#define V4L2_STD_PAL_N ((v4l2_std_id)0x00000200)
9421 +#define V4L2_STD_PAL_Nc ((v4l2_std_id)0x00000400)
9422 +#define V4L2_STD_PAL_60 ((v4l2_std_id)0x00000800)
9423 +
9424 +#define V4L2_STD_NTSC_M ((v4l2_std_id)0x00001000)
9425 +#define V4L2_STD_NTSC_M_JP ((v4l2_std_id)0x00002000)
9426 +
9427 +#define V4L2_STD_SECAM_B ((v4l2_std_id)0x00010000)
9428 +#define V4L2_STD_SECAM_D ((v4l2_std_id)0x00020000)
9429 +#define V4L2_STD_SECAM_G ((v4l2_std_id)0x00040000)
9430 +#define V4L2_STD_SECAM_H ((v4l2_std_id)0x00080000)
9431 +#define V4L2_STD_SECAM_K ((v4l2_std_id)0x00100000)
9432 +#define V4L2_STD_SECAM_K1 ((v4l2_std_id)0x00200000)
9433 +#define V4L2_STD_SECAM_L ((v4l2_std_id)0x00400000)
9434 +
9435 +/* ATSC/HDTV */
9436 +#define V4L2_STD_ATSC_8_VSB ((v4l2_std_id)0x01000000)
9437 +#define V4L2_STD_ATSC_16_VSB ((v4l2_std_id)0x02000000)
9438 +
9439 +/* some common needed stuff */
9440 +#define V4L2_STD_PAL_BG (V4L2_STD_PAL_B |\
9441 + V4L2_STD_PAL_B1 |\
9442 + V4L2_STD_PAL_G)
9443 +#define V4L2_STD_PAL_DK (V4L2_STD_PAL_D |\
9444 + V4L2_STD_PAL_D1 |\
9445 + V4L2_STD_PAL_K)
9446 +#define V4L2_STD_PAL (V4L2_STD_PAL_BG |\
9447 + V4L2_STD_PAL_DK |\
9448 + V4L2_STD_PAL_H |\
9449 + V4L2_STD_PAL_I)
9450 +#define V4L2_STD_NTSC (V4L2_STD_NTSC_M |\
9451 + V4L2_STD_NTSC_M_JP)
9452 +#define V4L2_STD_SECAM (V4L2_STD_SECAM_B |\
9453 + V4L2_STD_SECAM_D |\
9454 + V4L2_STD_SECAM_G |\
9455 + V4L2_STD_SECAM_H |\
9456 + V4L2_STD_SECAM_K |\
9457 + V4L2_STD_SECAM_K1 |\
9458 + V4L2_STD_SECAM_L)
9459 +
9460 +#define V4L2_STD_525_60 (V4L2_STD_PAL_M |\
9461 + V4L2_STD_PAL_60 |\
9462 + V4L2_STD_NTSC)
9463 +#define V4L2_STD_625_50 (V4L2_STD_PAL |\
9464 + V4L2_STD_PAL_N |\
9465 + V4L2_STD_PAL_Nc |\
9466 + V4L2_STD_SECAM)
9467 +
9468 +#define V4L2_STD_UNKNOWN 0
9469 +#define V4L2_STD_ALL (V4L2_STD_525_60 |\
9470 + V4L2_STD_625_50)
9471 +
9472 +struct v4l2_standard
9473 +{
9474 + __u32 index;
9475 + v4l2_std_id id;
9476 + __u8 name[24];
9477 + struct v4l2_fract frameperiod; /* Frames, not fields */
9478 + __u32 framelines;
9479 + __u32 reserved[4];
9480 +};
9481 +
9482 +
9483 +/*
9484 + * V I D E O I N P U T S
9485 + */
9486 +struct v4l2_input
9487 +{
9488 + __u32 index; /* Which input */
9489 + __u8 name[32]; /* Label */
9490 + __u32 type; /* Type of input */
9491 + __u32 audioset; /* Associated audios (bitfield) */
9492 + __u32 tuner; /* Associated tuner */
9493 + v4l2_std_id std;
9494 + __u32 status;
9495 + __u32 reserved[4];
9496 +};
9497 +/* Values for the 'type' field */
9498 +#define V4L2_INPUT_TYPE_TUNER 1
9499 +#define V4L2_INPUT_TYPE_CAMERA 2
9500 +
9501 +/* field 'status' - general */
9502 +#define V4L2_IN_ST_NO_POWER 0x00000001 /* Attached device is off */
9503 +#define V4L2_IN_ST_NO_SIGNAL 0x00000002
9504 +#define V4L2_IN_ST_NO_COLOR 0x00000004
9505 +
9506 +/* field 'status' - analog */
9507 +#define V4L2_IN_ST_NO_H_LOCK 0x00000100 /* No horizontal sync lock */
9508 +#define V4L2_IN_ST_COLOR_KILL 0x00000200 /* Color killer is active */
9509 +
9510 +/* field 'status' - digital */
9511 +#define V4L2_IN_ST_NO_SYNC 0x00010000 /* No synchronization lock */
9512 +#define V4L2_IN_ST_NO_EQU 0x00020000 /* No equalizer lock */
9513 +#define V4L2_IN_ST_NO_CARRIER 0x00040000 /* Carrier recovery failed */
9514 +
9515 +/* field 'status' - VCR and set-top box */
9516 +#define V4L2_IN_ST_MACROVISION 0x01000000 /* Macrovision detected */
9517 +#define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */
9518 +#define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */
9519 +
9520 +/*
9521 + * V I D E O O U T P U T S
9522 + */
9523 +struct v4l2_output
9524 +{
9525 + __u32 index; /* Which output */
9526 + __u8 name[32]; /* Label */
9527 + __u32 type; /* Type of output */
9528 + __u32 audioset; /* Associated audios (bitfield) */
9529 + __u32 modulator; /* Associated modulator */
9530 + v4l2_std_id std;
9531 + __u32 reserved[4];
9532 +};
9533 +/* Values for the 'type' field */
9534 +#define V4L2_OUTPUT_TYPE_MODULATOR 1
9535 +#define V4L2_OUTPUT_TYPE_ANALOG 2
9536 +#define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3
9537 +
9538 +/*
9539 + * C O N T R O L S
9540 + */
9541 +struct v4l2_control
9542 +{
9543 + __u32 id;
9544 + __s32 value;
9545 +};
9546 +
9547 +/* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */
9548 +struct v4l2_queryctrl
9549 +{
9550 + __u32 id;
9551 + enum v4l2_ctrl_type type;
9552 + __u8 name[32]; /* Whatever */
9553 + __s32 minimum; /* Note signedness */
9554 + __s32 maximum;
9555 + __s32 step;
9556 + __s32 default_value;
9557 + __u32 flags;
9558 + __u32 reserved[2];
9559 +};
9560 +
9561 +/* Used in the VIDIOC_QUERYMENU ioctl for querying menu items */
9562 +struct v4l2_querymenu
9563 +{
9564 + __u32 id;
9565 + __u32 index;
9566 + __u8 name[32]; /* Whatever */
9567 + __u32 reserved;
9568 +};
9569 +
9570 +/* Control flags */
9571 +#define V4L2_CTRL_FLAG_DISABLED 0x0001
9572 +#define V4L2_CTRL_FLAG_GRABBED 0x0002
9573 +
9574 +/* Control IDs defined by V4L2 */
9575 +#define V4L2_CID_BASE 0x00980900
9576 +/* IDs reserved for driver specific controls */
9577 +#define V4L2_CID_PRIVATE_BASE 0x08000000
9578 +
9579 +#define V4L2_CID_BRIGHTNESS (V4L2_CID_BASE+0)
9580 +#define V4L2_CID_CONTRAST (V4L2_CID_BASE+1)
9581 +#define V4L2_CID_SATURATION (V4L2_CID_BASE+2)
9582 +#define V4L2_CID_HUE (V4L2_CID_BASE+3)
9583 +#define V4L2_CID_AUDIO_VOLUME (V4L2_CID_BASE+5)
9584 +#define V4L2_CID_AUDIO_BALANCE (V4L2_CID_BASE+6)
9585 +#define V4L2_CID_AUDIO_BASS (V4L2_CID_BASE+7)
9586 +#define V4L2_CID_AUDIO_TREBLE (V4L2_CID_BASE+8)
9587 +#define V4L2_CID_AUDIO_MUTE (V4L2_CID_BASE+9)
9588 +#define V4L2_CID_AUDIO_LOUDNESS (V4L2_CID_BASE+10)
9589 +#define V4L2_CID_BLACK_LEVEL (V4L2_CID_BASE+11)
9590 +#define V4L2_CID_AUTO_WHITE_BALANCE (V4L2_CID_BASE+12)
9591 +#define V4L2_CID_DO_WHITE_BALANCE (V4L2_CID_BASE+13)
9592 +#define V4L2_CID_RED_BALANCE (V4L2_CID_BASE+14)
9593 +#define V4L2_CID_BLUE_BALANCE (V4L2_CID_BASE+15)
9594 +#define V4L2_CID_GAMMA (V4L2_CID_BASE+16)
9595 +#define V4L2_CID_WHITENESS (V4L2_CID_GAMMA) /* ? Not sure */
9596 +#define V4L2_CID_EXPOSURE (V4L2_CID_BASE+17)
9597 +#define V4L2_CID_AUTOGAIN (V4L2_CID_BASE+18)
9598 +#define V4L2_CID_GAIN (V4L2_CID_BASE+19)
9599 +#define V4L2_CID_HFLIP (V4L2_CID_BASE+20)
9600 +#define V4L2_CID_VFLIP (V4L2_CID_BASE+21)
9601 +#define V4L2_CID_HCENTER (V4L2_CID_BASE+22)
9602 +#define V4L2_CID_VCENTER (V4L2_CID_BASE+23)
9603 +#define V4L2_CID_LASTP1 (V4L2_CID_BASE+24) /* last CID + 1 */
9604 +
9605 +/*
9606 + * T U N I N G
9607 + */
9608 +struct v4l2_tuner
9609 +{
9610 + __u32 index;
9611 + __u8 name[32];
9612 + enum v4l2_tuner_type type;
9613 + __u32 capability;
9614 + __u32 rangelow;
9615 + __u32 rangehigh;
9616 + __u32 rxsubchans;
9617 + __u32 audmode;
9618 + __s32 signal;
9619 + __s32 afc;
9620 + __u32 reserved[4];
9621 +};
9622 +
9623 +struct v4l2_modulator
9624 +{
9625 + __u32 index;
9626 + __u8 name[32];
9627 + __u32 capability;
9628 + __u32 rangelow;
9629 + __u32 rangehigh;
9630 + __u32 txsubchans;
9631 + __u32 reserved[4];
9632 +};
9633 +
9634 +/* Flags for the 'capability' field */
9635 +#define V4L2_TUNER_CAP_LOW 0x0001
9636 +#define V4L2_TUNER_CAP_NORM 0x0002
9637 +#define V4L2_TUNER_CAP_STEREO 0x0010
9638 +#define V4L2_TUNER_CAP_LANG2 0x0020
9639 +#define V4L2_TUNER_CAP_SAP 0x0020
9640 +#define V4L2_TUNER_CAP_LANG1 0x0040
9641 +
9642 +/* Flags for the 'rxsubchans' field */
9643 +#define V4L2_TUNER_SUB_MONO 0x0001
9644 +#define V4L2_TUNER_SUB_STEREO 0x0002
9645 +#define V4L2_TUNER_SUB_LANG2 0x0004
9646 +#define V4L2_TUNER_SUB_SAP 0x0004
9647 +#define V4L2_TUNER_SUB_LANG1 0x0008
9648 +
9649 +/* Values for the 'audmode' field */
9650 +#define V4L2_TUNER_MODE_MONO 0x0000
9651 +#define V4L2_TUNER_MODE_STEREO 0x0001
9652 +#define V4L2_TUNER_MODE_LANG2 0x0002
9653 +#define V4L2_TUNER_MODE_SAP 0x0002
9654 +#define V4L2_TUNER_MODE_LANG1 0x0003
9655 +
9656 +struct v4l2_frequency
9657 +{
9658 + __u32 tuner;
9659 + enum v4l2_tuner_type type;
9660 + __u32 frequency;
9661 + __u32 reserved[8];
9662 +};
9663 +
9664 +/*
9665 + * A U D I O
9666 + */
9667 +struct v4l2_audio
9668 +{
9669 + __u32 index;
9670 + __u8 name[32];
9671 + __u32 capability;
9672 + __u32 mode;
9673 + __u32 reserved[2];
9674 +};
9675 +/* Flags for the 'capability' field */
9676 +#define V4L2_AUDCAP_STEREO 0x00001
9677 +#define V4L2_AUDCAP_AVL 0x00002
9678 +
9679 +/* Flags for the 'mode' field */
9680 +#define V4L2_AUDMODE_AVL 0x00001
9681 +
9682 +struct v4l2_audioout
9683 +{
9684 + __u32 index;
9685 + __u8 name[32];
9686 + __u32 capability;
9687 + __u32 mode;
9688 + __u32 reserved[2];
9689 +};
9690 +
9691 +/*
9692 + * D A T A S E R V I C E S ( V B I )
9693 + *
9694 + * Data services API by Michael Schimek
9695 + */
9696 +
9697 +struct v4l2_vbi_format
9698 +{
9699 + __u32 sampling_rate; /* in 1 Hz */
9700 + __u32 offset;
9701 + __u32 samples_per_line;
9702 + __u32 sample_format; /* V4L2_PIX_FMT_* */
9703 + __s32 start[2];
9704 + __u32 count[2];
9705 + __u32 flags; /* V4L2_VBI_* */
9706 + __u32 reserved[2]; /* must be zero */
9707 +};
9708 +
9709 +/* VBI flags */
9710 +#define V4L2_VBI_UNSYNC (1<< 0)
9711 +#define V4L2_VBI_INTERLACED (1<< 1)
9712 +
9713 +
9714 +/*
9715 + * A G G R E G A T E S T R U C T U R E S
9716 + */
9717 +
9718 +/* Stream data format
9719 + */
9720 +struct v4l2_format
9721 +{
9722 + enum v4l2_buf_type type;
9723 + union
9724 + {
9725 + struct v4l2_pix_format pix; // V4L2_BUF_TYPE_VIDEO_CAPTURE
9726 + struct v4l2_window win; // V4L2_BUF_TYPE_VIDEO_OVERLAY
9727 + struct v4l2_vbi_format vbi; // V4L2_BUF_TYPE_VBI_CAPTURE
9728 + __u8 raw_data[200]; // user-defined
9729 + } fmt;
9730 +};
9731 +
9732 +
9733 +/* Stream type-dependent parameters
9734 + */
9735 +struct v4l2_streamparm
9736 +{
9737 + enum v4l2_buf_type type;
9738 + union
9739 + {
9740 + struct v4l2_captureparm capture;
9741 + struct v4l2_outputparm output;
9742 + __u8 raw_data[200]; /* user-defined */
9743 + } parm;
9744 +};
9745 +
9746 +
9747 +
9748 +/*
9749 + * I O C T L C O D E S F O R V I D E O D E V I C E S
9750 + *
9751 + */
9752 +#define VIDIOC_QUERYCAP _IOR ('V', 0, struct v4l2_capability)
9753 +#define VIDIOC_RESERVED _IO ('V', 1)
9754 +#define VIDIOC_ENUM_FMT _IOWR ('V', 2, struct v4l2_fmtdesc)
9755 +#define VIDIOC_G_FMT _IOWR ('V', 4, struct v4l2_format)
9756 +#define VIDIOC_S_FMT _IOWR ('V', 5, struct v4l2_format)
9757 +#if 0
9758 +#define VIDIOC_G_COMP _IOR ('V', 6, struct v4l2_compression)
9759 +#define VIDIOC_S_COMP _IOW ('V', 7, struct v4l2_compression)
9760 +#endif
9761 +#define VIDIOC_REQBUFS _IOWR ('V', 8, struct v4l2_requestbuffers)
9762 +#define VIDIOC_QUERYBUF _IOWR ('V', 9, struct v4l2_buffer)
9763 +#define VIDIOC_G_FBUF _IOR ('V', 10, struct v4l2_framebuffer)
9764 +#define VIDIOC_S_FBUF _IOW ('V', 11, struct v4l2_framebuffer)
9765 +#define VIDIOC_OVERLAY _IOW ('V', 14, int)
9766 +#define VIDIOC_QBUF _IOWR ('V', 15, struct v4l2_buffer)
9767 +#define VIDIOC_DQBUF _IOWR ('V', 17, struct v4l2_buffer)
9768 +#define VIDIOC_STREAMON _IOW ('V', 18, int)
9769 +#define VIDIOC_STREAMOFF _IOW ('V', 19, int)
9770 +#define VIDIOC_G_PARM _IOWR ('V', 21, struct v4l2_streamparm)
9771 +#define VIDIOC_S_PARM _IOWR ('V', 22, struct v4l2_streamparm)
9772 +#define VIDIOC_G_STD _IOR ('V', 23, v4l2_std_id)
9773 +#define VIDIOC_S_STD _IOW ('V', 24, v4l2_std_id)
9774 +#define VIDIOC_ENUMSTD _IOWR ('V', 25, struct v4l2_standard)
9775 +#define VIDIOC_ENUMINPUT _IOWR ('V', 26, struct v4l2_input)
9776 +#define VIDIOC_G_CTRL _IOWR ('V', 27, struct v4l2_control)
9777 +#define VIDIOC_S_CTRL _IOWR ('V', 28, struct v4l2_control)
9778 +#define VIDIOC_G_TUNER _IOWR ('V', 29, struct v4l2_tuner)
9779 +#define VIDIOC_S_TUNER _IOW ('V', 30, struct v4l2_tuner)
9780 +#define VIDIOC_G_AUDIO _IOR ('V', 33, struct v4l2_audio)
9781 +#define VIDIOC_S_AUDIO _IOW ('V', 34, struct v4l2_audio)
9782 +#define VIDIOC_QUERYCTRL _IOWR ('V', 36, struct v4l2_queryctrl)
9783 +#define VIDIOC_QUERYMENU _IOWR ('V', 37, struct v4l2_querymenu)
9784 +#define VIDIOC_G_INPUT _IOR ('V', 38, int)
9785 +#define VIDIOC_S_INPUT _IOWR ('V', 39, int)
9786 +#define VIDIOC_G_OUTPUT _IOR ('V', 46, int)
9787 +#define VIDIOC_S_OUTPUT _IOWR ('V', 47, int)
9788 +#define VIDIOC_ENUMOUTPUT _IOWR ('V', 48, struct v4l2_output)
9789 +#define VIDIOC_G_AUDOUT _IOR ('V', 49, struct v4l2_audioout)
9790 +#define VIDIOC_S_AUDOUT _IOW ('V', 50, struct v4l2_audioout)
9791 +#define VIDIOC_G_MODULATOR _IOWR ('V', 54, struct v4l2_modulator)
9792 +#define VIDIOC_S_MODULATOR _IOW ('V', 55, struct v4l2_modulator)
9793 +#define VIDIOC_G_FREQUENCY _IOWR ('V', 56, struct v4l2_frequency)
9794 +#define VIDIOC_S_FREQUENCY _IOW ('V', 57, struct v4l2_frequency)
9795 +#define VIDIOC_CROPCAP _IOR ('V', 58, struct v4l2_cropcap)
9796 +#define VIDIOC_G_CROP _IOWR ('V', 59, struct v4l2_crop)
9797 +#define VIDIOC_S_CROP _IOW ('V', 60, struct v4l2_crop)
9798 +#define VIDIOC_G_JPEGCOMP _IOR ('V', 61, struct v4l2_jpegcompression)
9799 +#define VIDIOC_S_JPEGCOMP _IOW ('V', 62, struct v4l2_jpegcompression)
9800 +#define VIDIOC_QUERYSTD _IOR ('V', 63, v4l2_std_id)
9801 +#define VIDIOC_TRY_FMT _IOWR ('V', 64, struct v4l2_format)
9802 +#define VIDIOC_ENUMAUDIO _IOWR ('V', 65, struct v4l2_audio)
9803 +#define VIDIOC_ENUMAUDOUT _IOWR ('V', 66, struct v4l2_audioout)
9804 +#define VIDIOC_G_PRIORITY _IOR ('V', 67, enum v4l2_priority)
9805 +#define VIDIOC_S_PRIORITY _IOW ('V', 68, enum v4l2_priority)
9806 +
9807 +/* for compatibility, will go away some day */
9808 +#define VIDIOC_OVERLAY_OLD _IOWR ('V', 14, int)
9809 +#define VIDIOC_S_PARM_OLD _IOW ('V', 22, struct v4l2_streamparm)
9810 +#define VIDIOC_S_CTRL_OLD _IOW ('V', 28, struct v4l2_control)
9811 +#define VIDIOC_G_AUDIO_OLD _IOWR ('V', 33, struct v4l2_audio)
9812 +#define VIDIOC_G_AUDOUT_OLD _IOWR ('V', 49, struct v4l2_audioout)
9813 +
9814 +#define BASE_VIDIOC_PRIVATE 192 /* 192-255 are private */
9815 +
9816 +
9817 +#ifdef __KERNEL__
9818 +/*
9819 + *
9820 + * V 4 L 2 D R I V E R H E L P E R A P I
9821 + *
9822 + * Some commonly needed functions for drivers (v4l2-common.o module)
9823 + */
9824 +#include <linux/fs.h>
9825 +
9826 +/* Video standard functions */
9827 +extern unsigned int v4l2_video_std_fps(struct v4l2_standard *vs);
9828 +extern int v4l2_video_std_construct(struct v4l2_standard *vs,
9829 + int id, char *name);
9830 +
9831 +/* prority handling */
9832 +struct v4l2_prio_state {
9833 + atomic_t prios[4];
9834 +};
9835 +int v4l2_prio_init(struct v4l2_prio_state *global);
9836 +int v4l2_prio_change(struct v4l2_prio_state *global, enum v4l2_priority *local,
9837 + enum v4l2_priority new);
9838 +int v4l2_prio_open(struct v4l2_prio_state *global, enum v4l2_priority *local);
9839 +int v4l2_prio_close(struct v4l2_prio_state *global, enum v4l2_priority *local);
9840 +enum v4l2_priority v4l2_prio_max(struct v4l2_prio_state *global);
9841 +int v4l2_prio_check(struct v4l2_prio_state *global, enum v4l2_priority *local);
9842 +
9843 +/* names for fancy debug output */
9844 +extern char *v4l2_field_names[];
9845 +extern char *v4l2_type_names[];
9846 +extern char *v4l2_ioctl_names[];
9847 +
9848 +/* Compatibility layer interface -- v4l1-compat module */
9849 +typedef int (*v4l2_kioctl)(struct inode *inode, struct file *file,
9850 + unsigned int cmd, void *arg);
9851 +int v4l_compat_translate_ioctl(struct inode *inode, struct file *file,
9852 + int cmd, void *arg, v4l2_kioctl driver_ioctl);
9853 +
9854 +#endif /* __KERNEL__ */
9855 +#endif /* __LINUX_VIDEODEV2_H */
9856 +
9857 +/*
9858 + * Local variables:
9859 + * c-basic-offset: 8
9860 + * End:
9861 + */
9862 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/videodev.c
9863 ===================================================================
9864 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
9865 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/videodev.c 2008-12-11 22:46:49.000000000 +0100
9866 @@ -0,0 +1,332 @@
9867 +/*
9868 + * Video capture interface for Linux Character Device Driver.
9869 + * based on
9870 + * Alan Cox, <alan@redhat.com> video4linux
9871 + *
9872 + * Author: SW.LEE <hitchcar@samsung.com>
9873 + * 2004 (C) Samsung Electronics
9874 + * Modified for S3C2440/S3C24A0 Interface
9875 + *
9876 + * This file is released under the GPLv2
9877 + */
9878 +
9879 +
9880 +#include <linux/module.h>
9881 +#include <linux/types.h>
9882 +#include <linux/kernel.h>
9883 +#include <linux/sched.h>
9884 +#include <linux/smp_lock.h>
9885 +#include <linux/mm.h>
9886 +#include <linux/string.h>
9887 +#include <linux/errno.h>
9888 +#include <linux/init.h>
9889 +#include <linux/kmod.h>
9890 +#include <linux/slab.h>
9891 +/* #include <linux/devfs_fs_kernel.h> */
9892 +#include <linux/miscdevice.h>
9893 +#include <asm/uaccess.h>
9894 +#include <asm/system.h>
9895 +#include <asm/semaphore.h>
9896 +
9897 +
9898 +
9899 +#define CONFIG_VIDEO_V4L1_COMPAT
9900 +#include <linux/videodev.h>
9901 +#include "camif.h"
9902 +#include "miscdevice.h"
9903 +
9904 +
9905 +static DECLARE_MUTEX(videodev_lock);
9906 +
9907 +const char *fimc_version = "$Id: videodev.c,v 1.1.1.1 2004/04/27 03:52:50 swlee Exp $";
9908 +
9909 +#define VIDEO_NAME "video4linux"
9910 +
9911 +
9912 +#define VIDEO_NUM_DEVICES 2
9913 +static struct video_device *video_device[VIDEO_NUM_DEVICES];
9914 +
9915 +static inline struct video_device * get_vd(int nr)
9916 +{
9917 + if ( nr == CODEC_MINOR)
9918 + return video_device[0];
9919 + else {
9920 + assert ( nr & PREVIEW_MINOR);
9921 + return video_device[1];
9922 + }
9923 +}
9924 +
9925 +static inline void set_vd ( struct video_device * vd, int nr)
9926 +{
9927 + if ( nr == CODEC_MINOR)
9928 + video_device[0] = vd;
9929 + else {
9930 + assert ( nr & PREVIEW_MINOR);
9931 + video_device[1] = vd;
9932 + }
9933 +}
9934 +
9935 +static inline int video_release(struct inode *inode, struct file *f)
9936 +{
9937 + int minor = MINOR(inode->i_rdev);
9938 + struct video_device *vfd;
9939 +
9940 + vfd = get_vd(minor);
9941 +#if 1 /* needed until all drivers are fixed */
9942 + if (!vfd->release)
9943 + return 0;
9944 +#endif
9945 + vfd->release(vfd);
9946 + return 0;
9947 +}
9948 +
9949 +struct video_device* video_devdata(struct file *file)
9950 +{
9951 + return video_device[iminor(file->f_dentry->d_inode)];
9952 +}
9953 +
9954 +
9955 +/*
9956 + * Open a video device.
9957 + */
9958 +static int video_open(struct inode *inode, struct file *file)
9959 +{
9960 + int minor = MINOR(inode->i_rdev);
9961 + int err = 0;
9962 + struct video_device *vfl;
9963 + struct file_operations const *old_fops;
9964 +
9965 + down(&videodev_lock);
9966 +
9967 + vfl = get_vd(minor);
9968 +
9969 + old_fops = file->f_op;
9970 + file->f_op = fops_get(vfl->fops);
9971 + if(file->f_op->open)
9972 + err = file->f_op->open(inode,file);
9973 + if (err) {
9974 + fops_put(file->f_op);
9975 + file->f_op = fops_get(old_fops);
9976 + }
9977 + fops_put(old_fops);
9978 + up(&videodev_lock);
9979 + return err;
9980 +}
9981 +
9982 +/*
9983 + * open/release helper functions -- handle exclusive opens
9984 + */
9985 +extern int video_exclusive_open(struct inode *inode, struct file *file)
9986 +{
9987 + struct video_device *vfl = get_vd(MINOR(inode->i_rdev));
9988 + int retval = 0;
9989 +
9990 + mutex_lock(&vfl->lock);
9991 + if (vfl->users) {
9992 + retval = -EBUSY;
9993 + } else {
9994 + vfl->users++;
9995 + }
9996 + mutex_unlock(&vfl->lock);
9997 + return retval;
9998 +}
9999 +
10000 +extern int video_exclusive_release(struct inode *inode, struct file *file)
10001 +{
10002 + struct video_device *vfl = get_vd(MINOR(inode->i_rdev));
10003 + vfl->users--;
10004 + return 0;
10005 +}
10006 +
10007 +int
10008 +video_usercopy(struct inode *inode, struct file *file,
10009 + unsigned int cmd, unsigned long arg,
10010 + int (*func)(struct inode *inode, struct file *file,
10011 + unsigned int cmd, void *arg))
10012 +{
10013 + char sbuf[128];
10014 + void *mbuf = NULL;
10015 + void *parg = NULL;
10016 + int err = -EINVAL;
10017 +
10018 + // cmd = video_fix_command(cmd);
10019 +
10020 + /* Copy arguments into temp kernel buffer */
10021 + switch (_IOC_DIR(cmd)) {
10022 + case _IOC_NONE:
10023 + parg = (void *)arg;
10024 + break;
10025 + case _IOC_READ:
10026 + case _IOC_WRITE:
10027 + case (_IOC_WRITE | _IOC_READ):
10028 + if (_IOC_SIZE(cmd) <= sizeof(sbuf)) {
10029 + parg = sbuf;
10030 + } else {
10031 + /* too big to allocate from stack */
10032 + mbuf = kmalloc(_IOC_SIZE(cmd),GFP_KERNEL);
10033 + if (NULL == mbuf)
10034 + return -ENOMEM;
10035 + parg = mbuf;
10036 + }
10037 +
10038 + err = -EFAULT;
10039 + if (_IOC_DIR(cmd) & _IOC_WRITE)
10040 + if (copy_from_user(parg, (void *)arg, _IOC_SIZE(cmd)))
10041 + goto out;
10042 + break;
10043 + }
10044 +
10045 + /* call driver */
10046 + err = func(inode, file, cmd, parg);
10047 + if (err == -ENOIOCTLCMD)
10048 + err = -EINVAL;
10049 + if (err < 0)
10050 + goto out;
10051 +
10052 + /* Copy results into user buffer */
10053 + switch (_IOC_DIR(cmd))
10054 + {
10055 + case _IOC_READ:
10056 + case (_IOC_WRITE | _IOC_READ):
10057 + if (copy_to_user((void *)arg, parg, _IOC_SIZE(cmd)))
10058 + err = -EFAULT;
10059 + break;
10060 + }
10061 +
10062 +out:
10063 + if (mbuf)
10064 + kfree(mbuf);
10065 + return err;
10066 +}
10067 +
10068 +
10069 +static struct file_operations video_fops=
10070 +{
10071 + .owner = THIS_MODULE,
10072 + .llseek = no_llseek,
10073 + .open = video_open,
10074 + .release = video_release,
10075 +};
10076 +
10077 +static struct miscdevice codec_dev = {
10078 + minor: CODEC_MINOR,
10079 + name : "codec",
10080 + fops : &video_fops
10081 +};
10082 +
10083 +static struct miscdevice preview_dev = {
10084 + minor: PREVIEW_MINOR,
10085 + name : "preview",
10086 + fops : &video_fops
10087 +};
10088 +
10089 +
10090 +/**
10091 + * video_register_device - register video4linux devices
10092 + * @vfd: video device structure we want to register
10093 + * @type: type of device to register
10094 + * @nr: minor number
10095 + *
10096 + * Zero is returned on success.
10097 + * type : ignored.
10098 + * nr :
10099 + * 0 Codec index
10100 + * 1 Preview index
10101 + */
10102 +int video_register_device(struct video_device *vfd, int type, int nr)
10103 +{
10104 + int ret=0;
10105 +
10106 + /* pick a minor number */
10107 + down(&videodev_lock);
10108 + set_vd (vfd, nr);
10109 + vfd->minor=nr;
10110 + up(&videodev_lock);
10111 +
10112 + switch (vfd->minor) {
10113 + case CODEC_MINOR:
10114 + ret = misc_register(&codec_dev);
10115 + if (ret) {
10116 + printk(KERN_ERR
10117 + "can't misc_register : codec on minor=%d\n", CODEC_MINOR);
10118 + panic(" Give me misc codec \n");
10119 + }
10120 + break;
10121 + case PREVIEW_MINOR:
10122 + ret = misc_register(&preview_dev);
10123 + if (ret) {
10124 + printk(KERN_ERR
10125 + "can't misc_register (preview) on minor=%d\n", PREVIEW_MINOR);
10126 + panic(" Give me misc codec \n");
10127 + }
10128 + break;
10129 + }
10130 +
10131 +#if 0 /* needed until all drivers are fixed */
10132 + if (!vfd->release)
10133 + printk(KERN_WARNING "videodev: \"%s\" has no release callback. "
10134 + "Please fix your driver for proper sysfs support, see "
10135 + "http://lwn.net/Articles/36850/\n", vfd->name);
10136 +#endif
10137 + return 0;
10138 +}
10139 +
10140 +/**
10141 + * video_unregister_device - unregister a video4linux device
10142 + * @vfd: the device to unregister
10143 + *
10144 + * This unregisters the passed device and deassigns the minor
10145 + * number. Future open calls will be met with errors.
10146 + */
10147 +
10148 +void video_unregister_device(struct video_device *vfd)
10149 +{
10150 + down(&videodev_lock);
10151 +
10152 + if(get_vd(vfd->minor)!=vfd)
10153 + panic("videodev: bad unregister");
10154 +
10155 + if (vfd->minor== CODEC_MINOR)
10156 + misc_deregister(&codec_dev);
10157 + else
10158 + misc_deregister(&preview_dev);
10159 + set_vd (NULL, vfd->minor);
10160 + up(&videodev_lock);
10161 +}
10162 +
10163 +
10164 +/*
10165 + * Initialise video for linux
10166 + */
10167 +
10168 +static int __init videodev_init(void)
10169 +{
10170 +// printk(KERN_INFO "FIMC2.0 Built:"__DATE__" "__TIME__"\n%s\n",fimc_version);
10171 + return 0;
10172 +}
10173 +
10174 +static void __exit videodev_exit(void)
10175 +{
10176 +}
10177 +
10178 +module_init(videodev_init)
10179 +module_exit(videodev_exit)
10180 +
10181 +EXPORT_SYMBOL(video_register_device);
10182 +EXPORT_SYMBOL(fimc_version);
10183 +EXPORT_SYMBOL(video_unregister_device);
10184 +EXPORT_SYMBOL(video_usercopy);
10185 +EXPORT_SYMBOL(video_exclusive_open);
10186 +EXPORT_SYMBOL(video_exclusive_release);
10187 +
10188 +
10189 +MODULE_AUTHOR("SW.LEE <hitchcar@sec.samsung.com>");
10190 +MODULE_DESCRIPTION("VideoDev For FIMC2.0 MISC Drivers");
10191 +MODULE_LICENSE("GPL");
10192 +
10193 +
10194 +/*
10195 + * Local variables:
10196 + * c-basic-offset: 8
10197 + * End:
10198 + */
10199 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/videodev.h
10200 ===================================================================
10201 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
10202 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/videodev.h 2008-12-11 22:46:49.000000000 +0100
10203 @@ -0,0 +1,108 @@
10204 +//#ifndef __LINUX_S3C_VIDEODEV_H
10205 +//#define __LINUX_S3C_VIDEODEV_H
10206 +
10207 +#include <linux/types.h>
10208 +#include <linux/version.h>
10209 +#include <media/v4l2-dev.h>
10210 +
10211 +#if 0
10212 +struct video_device
10213 +{
10214 + /* device info */
10215 + // struct device *dev;
10216 + char name[32];
10217 + int type; /* v4l1 */
10218 + int type2; /* v4l2 */
10219 + int hardware;
10220 + int minor;
10221 +
10222 + /* device ops + callbacks */
10223 + struct file_operations *fops;
10224 + void (*release)(struct video_device *vfd);
10225 +
10226 +
10227 +#if 1 /* to be removed in 2.7.x */
10228 + /* obsolete -- fops->owner is used instead */
10229 + struct module *owner;
10230 + /* dev->driver_data will be used instead some day.
10231 + * Use the video_{get|set}_drvdata() helper functions,
10232 + * so the switch over will be transparent for you.
10233 + * Or use {pci|usb}_{get|set}_drvdata() directly. */
10234 + void *priv;
10235 +#endif
10236 +
10237 + /* for videodev.c intenal usage -- please don't touch */
10238 + int users; /* video_exclusive_{open|close} ... */
10239 + struct semaphore lock; /* ... helper function uses these */
10240 + char devfs_name[64]; /* devfs */
10241 + // struct class_device class_dev; /* sysfs */
10242 +};
10243 +
10244 +#define VIDEO_MAJOR 81
10245 +
10246 +#define VFL_TYPE_GRABBER 0
10247 +
10248 +
10249 +extern int video_register_device(struct video_device *, int type, int nr);
10250 +extern void video_unregister_device(struct video_device *);
10251 +extern struct video_device* video_devdata(struct file*);
10252 +
10253 +
10254 +
10255 +struct video_picture
10256 +{
10257 + __u16 brightness;
10258 + __u16 hue;
10259 + __u16 colour;
10260 + __u16 contrast;
10261 + __u16 whiteness; /* Black and white only */
10262 + __u16 depth; /* Capture depth */
10263 + __u16 palette; /* Palette in use */
10264 +#define VIDEO_PALETTE_GREY 1 /* Linear greyscale */
10265 +#define VIDEO_PALETTE_HI240 2 /* High 240 cube (BT848) */
10266 +#define VIDEO_PALETTE_RGB565 3 /* 565 16 bit RGB */
10267 +#define VIDEO_PALETTE_RGB24 4 /* 24bit RGB */
10268 +#define VIDEO_PALETTE_RGB32 5 /* 32bit RGB */
10269 +#define VIDEO_PALETTE_RGB555 6 /* 555 15bit RGB */
10270 +#define VIDEO_PALETTE_YUV422 7 /* YUV422 capture */
10271 +#define VIDEO_PALETTE_YUYV 8
10272 +#define VIDEO_PALETTE_UYVY 9 /* The great thing about standards is ... */
10273 +#define VIDEO_PALETTE_YUV420 10
10274 +#define VIDEO_PALETTE_YUV411 11 /* YUV411 capture */
10275 +#define VIDEO_PALETTE_RAW 12 /* RAW capture (BT848) */
10276 +#define VIDEO_PALETTE_YUV422P 13 /* YUV 4:2:2 Planar */
10277 +#define VIDEO_PALETTE_YUV411P 14 /* YUV 4:1:1 Planar */
10278 +#define VIDEO_PALETTE_YUV420P 15 /* YUV 4:2:0 Planar */
10279 +#define VIDEO_PALETTE_YUV410P 16 /* YUV 4:1:0 Planar */
10280 +#define VIDEO_PALETTE_PLANAR 13 /* start of planar entries */
10281 +#define VIDEO_PALETTE_COMPONENT 7 /* start of component entries */
10282 +};
10283 +
10284 +extern int video_exclusive_open(struct inode *inode, struct file *file);
10285 +extern int video_exclusive_release(struct inode *inode, struct file *file);
10286 +extern int video_usercopy(struct inode *inode, struct file *file,
10287 + unsigned int cmd, unsigned long arg,
10288 + int (*func)(struct inode *inode, struct file *file,
10289 + unsigned int cmd, void *arg));
10290 +
10291 +
10292 +
10293 +
10294 +#define VID_TYPE_CAPTURE 1 /* Can capture */
10295 +#define VID_TYPE_CLIPPING 32 /* Can clip */
10296 +#define VID_TYPE_FRAMERAM 64 /* Uses the frame buffer memory */
10297 +#define VID_TYPE_SCALES 128 /* Scalable */
10298 +#define VID_TYPE_SUBCAPTURE 512 /* Can capture subareas of the image */
10299 +
10300 +
10301 +
10302 +#endif
10303 +//#endif
10304 +
10305 +#define VID_HARDWARE_SAMSUNG_FIMC 255
10306 +
10307 +/*
10308 + * Local variables:
10309 + * c-basic-offset: 8
10310 + * End:
10311 + */
10312 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/camera/video-driver.c
10313 ===================================================================
10314 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
10315 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/camera/video-driver.c 2008-12-11 22:46:49.000000000 +0100
10316 @@ -0,0 +1,624 @@
10317 +/*
10318 + Copyright (C) 2004 Samsung Electronics
10319 + SW.LEE <hitchcar@sec.samsung.com>
10320 + This program is free software; you can redistribute it and/or modify
10321 + it under the terms of the GNU General Public License as published by
10322 + the Free Software Foundation; either version 2 of the License, or
10323 + (at your option) any later version.
10324 +*/
10325 +
10326 +#include <linux/version.h>
10327 +#include <linux/module.h>
10328 +#include <linux/delay.h>
10329 +#include <linux/errno.h>
10330 +#include <linux/fs.h>
10331 +#include <linux/kernel.h>
10332 +#include <linux/major.h>
10333 +#include <linux/slab.h>
10334 +#include <linux/poll.h>
10335 +#include <linux/signal.h>
10336 +#include <linux/ioport.h>
10337 +#include <linux/sched.h>
10338 +#include <linux/types.h>
10339 +#include <linux/interrupt.h>
10340 +#include <linux/kmod.h>
10341 +#include <linux/vmalloc.h>
10342 +#include <linux/init.h>
10343 +#include <asm/io.h>
10344 +#include <asm/page.h>
10345 +#include <asm/irq.h>
10346 +#include <asm/semaphore.h>
10347 +#include <linux/miscdevice.h>
10348 +#include <asm/arch/irqs.h>
10349 +
10350 +//#define SW_DEBUG
10351 +#define CONFIG_VIDEO_V4L1_COMPAT
10352 +#include <linux/videodev.h>
10353 +#include "camif.h"
10354 +#include "miscdevice.h"
10355 +#include "cam_reg.h"
10356 +#include "sensor.h"
10357 +#include "userapp.h"
10358 +
10359 +#ifdef Z_API
10360 +#include "qt.h"
10361 +#endif
10362 +
10363 +/* Codec and Preview */
10364 +#define CAMIF_NUM 2
10365 +static camif_cfg_t fimc[CAMIF_NUM];
10366 +u32 *camregs;
10367 +
10368 +static const char *driver_version =
10369 + "$Id: video-driver.c,v 1.9 2004/06/02 03:10:36 swlee Exp $";
10370 +extern const char *fimc_version;
10371 +extern const char *fsm_version;
10372 +
10373 +extern void camif_start_c_with_p (camif_cfg_t *cfg, camif_cfg_t *other);
10374 +
10375 +camif_cfg_t * get_camif(int nr)
10376 +{
10377 + camif_cfg_t *ret = NULL;
10378 + switch(nr) {
10379 + case CODEC_MINOR:
10380 + ret = &fimc[0];
10381 + break;
10382 + case PREVIEW_MINOR:
10383 + ret = &fimc[1];
10384 + break;
10385 + default:
10386 + panic("Unknow Minor Number \n");
10387 + }
10388 + return ret;
10389 +}
10390 +
10391 +
10392 +static int camif_codec_start(camif_cfg_t *cfg)
10393 +{
10394 + int ret = 0;
10395 + ret =camif_check_preview(cfg);
10396 + switch(ret) {
10397 + case 0: /* Play alone */
10398 + DPRINTK("Start Alone \n");
10399 + camif_4fsm_start(cfg);
10400 + cfg->gc->status |= C_WORKING;
10401 + break;
10402 + case -ERESTARTSYS: /* Busy , retry */
10403 + //DPRINTK("Error \n");
10404 + printk("Error \n");
10405 + break;
10406 + case 1:
10407 + DPRINTK("need callback \n");
10408 + ret = camif_callback_start(cfg);
10409 + if(ret < 0 ) {
10410 + printk(KERN_INFO "Busy RESTART \n");
10411 + return ret; /* Busy, retry */
10412 + }
10413 + break;
10414 + }
10415 + return ret;
10416 +}
10417 +
10418 +
10419 +ssize_t camif_write (struct file *f, const char *b, size_t c,loff_t *offset)
10420 +{
10421 + camif_cfg_t *cfg;
10422 +
10423 + c = 0; /* return value */
10424 + DPRINTK("\n");
10425 + cfg = get_camif(MINOR(f->f_dentry->d_inode->i_rdev));
10426 + switch (*b) {
10427 + case 'O':
10428 + if (cfg->dma_type & CAMIF_PREVIEW) {
10429 + if (cfg->gc->status & C_WORKING) {
10430 + camif_start_c_with_p(cfg,get_camif(CODEC_MINOR));
10431 + }
10432 + else {
10433 + camif_4fsm_start(cfg);
10434 + }
10435 + }
10436 + else{
10437 + c = camif_codec_start(cfg);
10438 + if(c < 0) c = 1; /* Error and neet to retry */
10439 + }
10440 +
10441 + break;
10442 + case 'X':
10443 + camif_p_stop(cfg);
10444 + break;
10445 + default:
10446 + panic("CAMERA:camif_write: Unexpected Param\n");
10447 + }
10448 + DPRINTK("end\n");
10449 +
10450 + return c;
10451 +}
10452 +
10453 +
10454 +ssize_t camif_p_read(struct file *file, char *buf, size_t count, loff_t *pos)
10455 +{
10456 + camif_cfg_t *cfg = NULL;
10457 + size_t end;
10458 +
10459 + cfg = get_camif(MINOR(file->f_dentry->d_inode->i_rdev));
10460 + cfg->status = CAMIF_STARTED;
10461 +
10462 + if (wait_event_interruptible(cfg->waitq,cfg->status == CAMIF_INT_HAPPEN))
10463 + return -ERESTARTSYS;
10464 +
10465 + cfg->status = CAMIF_STOPPED;
10466 + end = min_t(size_t, cfg->pp_totalsize /cfg->pp_num, count);
10467 + if (copy_to_user(buf, camif_g_frame(cfg), end))
10468 + return -EFAULT;
10469 +
10470 + return end;
10471 +}
10472 +
10473 +
10474 +static ssize_t
10475 +camif_c_read(struct file *file, char *buf, size_t count, loff_t *pos)
10476 +{
10477 + camif_cfg_t *cfg = NULL;
10478 + size_t end;
10479 +
10480 + /* cfg = file->private_data; */
10481 + cfg = get_camif(MINOR(file->f_dentry->d_inode->i_rdev));
10482 +#if 0
10483 + if(file->f_flags & O_NONBLOCK) {
10484 + printk(KERN_ERR"Don't Support NON_BLOCK \n");
10485 + }
10486 +#endif
10487 +
10488 + /* Change the below wait_event_interruptible func */
10489 + if (wait_event_interruptible(cfg->waitq,cfg->status == CAMIF_INT_HAPPEN))
10490 + return -ERESTARTSYS;
10491 + cfg->status = CAMIF_STOPPED;
10492 + end = min_t(size_t, cfg->pp_totalsize /cfg->pp_num, count);
10493 + if (copy_to_user(buf, camif_g_frame(cfg), end))
10494 + return -EFAULT;
10495 + return end;
10496 +}
10497 +
10498 +
10499 +static irqreturn_t camif_c_irq(int irq, void *dev_id)
10500 +{
10501 + camif_cfg_t *cfg = (camif_cfg_t *)dev_id;
10502 +
10503 + DPRINTK("\n");
10504 + camif_g_fifo_status(cfg);
10505 + camif_g_frame_num(cfg);
10506 + if(camif_enter_c_4fsm(cfg) != INSTANT_SKIP)
10507 + wake_up_interruptible(&cfg->waitq);
10508 +
10509 + return IRQ_HANDLED;
10510 +}
10511 +
10512 +static irqreturn_t camif_p_irq(int irq, void *dev_id)
10513 +{
10514 + camif_cfg_t *cfg = (camif_cfg_t *)dev_id;
10515 +
10516 + DPRINTK("\n");
10517 + camif_g_fifo_status(cfg);
10518 + camif_g_frame_num(cfg);
10519 + if(camif_enter_p_4fsm(cfg) != INSTANT_SKIP)
10520 + wake_up_interruptible(&cfg->waitq);
10521 +#if 0
10522 + if( (cfg->perf.frames % 5) == 0)
10523 + DPRINTK("5\n");
10524 +#endif
10525 +
10526 + return IRQ_HANDLED;
10527 +}
10528 +
10529 +static void camif_release_irq(camif_cfg_t *cfg)
10530 +{
10531 + disable_irq(cfg->irq);
10532 + free_irq(cfg->irq, cfg);
10533 +}
10534 +
10535 +static int camif_irq_request(camif_cfg_t *cfg)
10536 +{
10537 + int ret = 0;
10538 +
10539 + if (cfg->dma_type & CAMIF_CODEC) {
10540 + if ((ret = request_irq(cfg->irq, camif_c_irq,
10541 + 0, cfg->shortname, cfg))) {
10542 + printk("request_irq(CAM_C) failed.\n");
10543 + }
10544 + }
10545 + if (cfg->dma_type & CAMIF_PREVIEW) {
10546 + if ((ret = request_irq(cfg->irq, camif_p_irq,
10547 + 0, cfg->shortname, cfg))) {
10548 + printk("request_irq(CAM_P) failed.\n");
10549 + }
10550 + }
10551 + return 0;
10552 +}
10553 +
10554 +static void camif_init_sensor(camif_cfg_t *cfg)
10555 +{
10556 + camif_gc_t *gc = cfg->gc;
10557 + if (!gc->sensor)
10558 + panic("CAMERA:I2C Client(Img Sensor)Not registered\n");
10559 + if(!gc->init_sensor) {
10560 + camif_reset(gc->reset_type, gc->reset_udelay);
10561 + gc->sensor->driver->command(gc->sensor,SENSOR_INIT,NULL);
10562 + gc->init_sensor = 1; /*sensor init done */
10563 + }
10564 + gc->sensor->driver->command(gc->sensor, USER_ADD, NULL);
10565 +}
10566 +
10567 +static int camif_open(struct inode *inode, struct file *file)
10568 +{
10569 + int err;
10570 + camif_cfg_t * cfg = get_camif(MINOR(inode->i_rdev));
10571 +
10572 + if(cfg->dma_type & CAMIF_PREVIEW) {
10573 + if(down_interruptible(&cfg->gc->lock))
10574 + return -ERESTARTSYS;
10575 + if (cfg->dma_type & CAMIF_PREVIEW) {
10576 + cfg->gc->status &= ~PNOTWORKING;
10577 + }
10578 + up(&cfg->gc->lock);
10579 + }
10580 + err = video_exclusive_open(inode,file);
10581 + cfg->gc->user++;
10582 + cfg->status = CAMIF_STOPPED;
10583 + if (err < 0) return err;
10584 + if (file->f_flags & O_NONCAP ) {
10585 + printk("Don't Support Non-capturing open \n");
10586 + return 0;
10587 + }
10588 + file->private_data = cfg;
10589 + camif_irq_request(cfg);
10590 + camif_init_sensor(cfg);
10591 + return 0;
10592 +}
10593 +
10594 +#if 0
10595 +static void print_pregs(void)
10596 +{
10597 + printk(" CISRCFMT 0x%08X \n", CISRCFMT);
10598 + printk(" CIWDOFST 0x%08X \n", CIWDOFST);
10599 + printk(" CIGCTRL 0x%08X \n", CIGCTRL);
10600 + printk(" CIPRTRGFMT 0x%08X \n", CIPRTRGFMT);
10601 + printk(" CIPRCTRL 0x%08X \n", CIPRCTRL);
10602 + printk(" CIPRSCPRERATIO 0x%08X \n", CIPRSCPRERATIO);
10603 + printk(" CIPRSCPREDST 0x%08X \n", CIPRSCPREDST);
10604 + printk(" CIPRSCCTRL 0x%08X \n", CIPRSCCTRL);
10605 + printk(" CIPRTAREA 0x%08X \n", CIPRTAREA);
10606 + printk(" CIPRSTATUS 0x%08X \n", CIPRSTATUS);
10607 + printk(" CIIMGCPT 0x%08X \n", CIIMGCPT);
10608 +}
10609 +
10610 +static void print_cregs(void)
10611 +{
10612 + printk(" CISRCFMT 0x%08X \n", CISRCFMT);
10613 + printk(" CIWDOFST 0x%08X \n", CIWDOFST);
10614 + printk(" CIGCTRL 0x%08X \n", CIGCTRL);
10615 + printk(" CICOCTRL 0x%8X \n", CICOCTRL);
10616 + printk(" CICOSCPRERATIO 0x%08X \n", CICOSCPRERATIO);
10617 + printk(" CICOSCPREDST 0x%08X \n", CICOSCPREDST);
10618 + printk(" CICOSCCTRL 0x%08X \n", CICOSCCTRL);
10619 + printk(" CICOTAREA 0x%08X \n", CICOTAREA);
10620 + printk(" CICOSTATUS 0x%8X \n", CICOSTATUS);
10621 + printk(" CIIMGCPT 0x%08X \n", CIIMGCPT);
10622 +}
10623 +#endif
10624 +
10625 +
10626 +static int camif_release(struct inode *inode, struct file *file)
10627 +{
10628 + camif_cfg_t * cfg = get_camif(MINOR(inode->i_rdev));
10629 +
10630 + //DPRINTK(" cfg->status 0x%0X cfg->gc->status 0x%0X \n", cfg->status,cfg->gc->status );
10631 + if (cfg->dma_type & CAMIF_PREVIEW) {
10632 + if(down_interruptible(&cfg->gc->lock))
10633 + return -ERESTARTSYS;
10634 + cfg->gc->status &= ~PWANT2START;
10635 + cfg->gc->status |= PNOTWORKING;
10636 + up(&cfg->gc->lock);
10637 + }
10638 + else {
10639 + cfg->gc->status &= ~CWANT2START; /* No need semaphore */
10640 + }
10641 + camif_dynamic_close(cfg);
10642 + camif_release_irq(cfg);
10643 + video_exclusive_release(inode,file);
10644 + camif_p_stop(cfg);
10645 + cfg->gc->sensor->driver->command(cfg->gc->sensor, USER_EXIT, NULL);
10646 + cfg->gc->user--;
10647 + cfg->status = CAMIF_STOPPED;
10648 + return 0;
10649 +}
10650 +
10651 +static void fimc_config(camif_cfg_t *cfg,u32 x, u32 y, int bpp)
10652 +{
10653 + cfg->target_x = x;
10654 + cfg->target_y = y;
10655 +
10656 + switch (bpp) {
10657 + case 16:
10658 + cfg->fmt = CAMIF_RGB16;
10659 + break;
10660 + case 24:
10661 + cfg->fmt = CAMIF_RGB24;
10662 + break;
10663 + case 420:
10664 + cfg->fmt = CAMIF_IN_YCBCR422|CAMIF_OUT_YCBCR420;
10665 + break;
10666 + case 422:
10667 + cfg->fmt = CAMIF_IN_YCBCR422|CAMIF_OUT_YCBCR422;
10668 + break;
10669 + default:
10670 + panic("Wrong BPP \n");
10671 + }
10672 +}
10673 +
10674 +
10675 +static int
10676 +camif_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
10677 +{
10678 + int ret = 0;
10679 + camif_cfg_t *cfg = file->private_data;
10680 + camif_param_t par;
10681 +
10682 + switch (cmd) {
10683 + case CMD_CAMERA_INIT:
10684 + if (copy_from_user(&par,(camif_param_t *)arg,
10685 + sizeof(camif_param_t)))
10686 + return -EFAULT;
10687 + fimc_config(cfg,par.dst_x, par.dst_y, par.bpp);
10688 + if (camif_dynamic_open(cfg)) {
10689 + printk(" Eror Happens \n");
10690 + ret = -1;
10691 + }
10692 +
10693 + switch (par.flip) {
10694 + case 3 :
10695 + cfg->flip = CAMIF_FLIP_MIRROR;
10696 + break;
10697 + case 1 :
10698 + cfg->flip = CAMIF_FLIP_X;
10699 + break;
10700 + case 2 :
10701 + cfg->flip = CAMIF_FLIP_Y;
10702 + break;
10703 + case 0 :
10704 + default:
10705 + cfg->flip = CAMIF_FLIP;
10706 + }
10707 + break;
10708 + /* Todo
10709 + case CMD_SENSOR_BRIGHTNESS:
10710 + cfg->gc->sensor->driver->command(cfg->gc->sensor, SENSOR_BRIGHTNESS, NULL);
10711 + break;
10712 + */
10713 + default:
10714 + ret = -EINVAL;
10715 + break;
10716 + }
10717 +
10718 + return ret;
10719 +}
10720 +
10721 +
10722 +#if 0
10723 +static int camif_ioctl(struct inode *inode, struct file *file,
10724 + unsigned int cmd, unsigned long arg)
10725 +{
10726 +// camif_cfg_t *cfg = file->private_data;
10727 +
10728 +
10729 + switch (cmd) {
10730 +/* case Some_other_action */
10731 + default:
10732 + return video_usercopy(inode, file, cmd, arg, camif_do_ioctl);
10733 + }
10734 +}
10735 +#endif
10736 +
10737 +static struct file_operations camif_c_fops =
10738 +{
10739 + .owner = THIS_MODULE,
10740 + .open = camif_open,
10741 + .release = camif_release,
10742 + .ioctl = camif_ioctl,
10743 + .read = camif_c_read,
10744 + .write = camif_write,
10745 +};
10746 +
10747 +static struct file_operations camif_p_fops =
10748 +{
10749 + .owner = THIS_MODULE,
10750 + .open = camif_open,
10751 + .release = camif_release,
10752 + .ioctl = camif_ioctl,
10753 +#ifdef Z_API
10754 + .read = z_read,
10755 + .write = z_write,
10756 +#else
10757 + .read = camif_p_read,
10758 + .write = camif_write,
10759 +#endif
10760 +};
10761 +
10762 +static struct video_device codec_template =
10763 +{
10764 + .name = "CODEC_IF",
10765 + .type = VID_TYPE_CAPTURE|VID_TYPE_CLIPPING|VID_TYPE_SCALES,
10766 +/* .hardware = VID_HARDWARE_SAMSUNG_FIMC20, */
10767 + .fops = &camif_c_fops,
10768 +// .release = camif_release
10769 + .minor = -1,
10770 +};
10771 +
10772 +static struct video_device preview_template =
10773 +{
10774 + .name = "PREVIEW_IF",
10775 + .type = VID_TYPE_CAPTURE|VID_TYPE_CLIPPING|VID_TYPE_SCALES,
10776 +/* .hardware = VID_HARDWARE_SAMSUNG_FIMC20, */
10777 + .fops = &camif_p_fops,
10778 + .minor = -1,
10779 +};
10780 +
10781 +static int preview_init(camif_cfg_t *cfg)
10782 +{
10783 + char name[16]="CAM_PREVIEW";
10784 +
10785 + memset(cfg, 0, sizeof(camif_cfg_t));
10786 + cfg->target_x = 640;
10787 + cfg->target_y = 480;
10788 + cfg->pp_num = 4;
10789 + cfg->dma_type = CAMIF_PREVIEW;
10790 + cfg->fmt = CAMIF_RGB16;
10791 + cfg->flip = CAMIF_FLIP_Y;
10792 + cfg->v = &preview_template;
10793 + mutex_init(&cfg->v->lock);
10794 + cfg->irq = IRQ_S3C2440_CAM_P;
10795 +
10796 + strcpy(cfg->shortname,name);
10797 + init_waitqueue_head(&cfg->waitq);
10798 + cfg->status = CAMIF_STOPPED;
10799 + return cfg->status;
10800 +}
10801 +
10802 +static int codec_init(camif_cfg_t *cfg)
10803 +{
10804 + char name[16]="CAM_CODEC";
10805 +
10806 + memset(cfg, 0, sizeof(camif_cfg_t));
10807 + cfg->target_x = 176;
10808 + cfg->target_y = 144;
10809 + cfg->pp_num = 4;
10810 + cfg->dma_type = CAMIF_CODEC;
10811 + cfg->fmt = CAMIF_IN_YCBCR422|CAMIF_OUT_YCBCR420;
10812 + cfg->flip = CAMIF_FLIP_X;
10813 + cfg->v = &codec_template;
10814 + mutex_init(&cfg->v->lock);
10815 + cfg->irq = IRQ_S3C2440_CAM_C;
10816 + strcpy(cfg->shortname,name);
10817 + init_waitqueue_head(&cfg->waitq);
10818 + cfg->status = CAMIF_STOPPED;
10819 + return cfg->status;
10820 +}
10821 +
10822 +static void camif_init(void)
10823 +{
10824 + camif_setup_sensor();
10825 +}
10826 +
10827 +
10828 +
10829 +static void print_version(void)
10830 +{
10831 + printk(KERN_INFO"FIMC built:"__DATE__ " "__TIME__"\n%s\n%s\n%s\n",
10832 + fimc_version, driver_version,fsm_version);
10833 +}
10834 +
10835 +
10836 +static int camif_m_in(void)
10837 +{
10838 + int ret = -EINVAL;
10839 + camif_cfg_t * cfg;
10840 +
10841 + printk(KERN_INFO"Starting S3C2440 Camera Driver\n");
10842 +
10843 + camregs = ioremap(CAM_BASE_ADD, 0x100);
10844 + if (!camregs) {
10845 + printk(KERN_ERR"Unable to map camera regs\n");
10846 + ret = -ENOMEM;
10847 + goto bail1;
10848 + }
10849 +
10850 + camif_init();
10851 + cfg = get_camif(CODEC_MINOR);
10852 + codec_init(cfg);
10853 +
10854 + ret = video_register_device(cfg->v,0,CODEC_MINOR);
10855 + if (ret) {
10856 + printk(KERN_ERR"Couldn't register codec driver.\n");
10857 + goto bail2;
10858 + }
10859 + cfg = get_camif(PREVIEW_MINOR);
10860 + preview_init(cfg);
10861 + ret = video_register_device(cfg->v,0,PREVIEW_MINOR);
10862 + if (ret) {
10863 + printk(KERN_ERR"Couldn't register preview driver.\n");
10864 + goto bail3; /* hm seems it us unregistered the once */
10865 + }
10866 +
10867 + print_version();
10868 + return 0;
10869 +
10870 +bail3:
10871 + video_unregister_device(cfg->v);
10872 +bail2:
10873 + iounmap(camregs);
10874 + camregs = NULL;
10875 +bail1:
10876 + return ret;
10877 +}
10878 +
10879 +static void unconfig_device(camif_cfg_t *cfg)
10880 +{
10881 + video_unregister_device(cfg->v);
10882 + camif_hw_close(cfg);
10883 + iounmap(camregs);
10884 + //memset(cfg, 0, sizeof(camif_cfg_t));
10885 + camregs = NULL;
10886 +}
10887 +
10888 +static void camif_m_out(void) /* module out */
10889 +{
10890 + camif_cfg_t *cfg;
10891 +
10892 + cfg = get_camif(CODEC_MINOR);
10893 + unconfig_device(cfg);
10894 + cfg = get_camif(PREVIEW_MINOR);
10895 + unconfig_device(cfg);
10896 +
10897 + return;
10898 +}
10899 +
10900 +void camif_register_decoder(struct i2c_client *ptr)
10901 +{
10902 + camif_cfg_t *cfg;
10903 + void * data = i2c_get_clientdata(ptr);
10904 +
10905 + cfg =get_camif(CODEC_MINOR);
10906 + cfg->gc = (camif_gc_t *)(data);
10907 +
10908 + cfg =get_camif(PREVIEW_MINOR);
10909 + cfg->gc = (camif_gc_t *)(data);
10910 +
10911 + sema_init(&cfg->gc->lock, 1); /* global lock for both Codec and Preview */
10912 + cfg->gc->status |= PNOTWORKING; /* Default Value */
10913 + camif_hw_open(cfg->gc);
10914 +}
10915 +
10916 +void camif_unregister_decoder(struct i2c_client *ptr)
10917 +{
10918 + camif_gc_t *gc;
10919 + void * data = i2c_get_clientdata(ptr);
10920 +
10921 + gc = (camif_gc_t *)(data);
10922 + gc->init_sensor = 0; /* need to modify */
10923 +}
10924 +
10925 +module_init(camif_m_in);
10926 +module_exit(camif_m_out);
10927 +
10928 +EXPORT_SYMBOL(camif_register_decoder);
10929 +EXPORT_SYMBOL(camif_unregister_decoder);
10930 +
10931 +MODULE_AUTHOR("SW.LEE <hitchcar@sec.samsung.com>");
10932 +MODULE_DESCRIPTION("Video-Driver For Fimc2.0 MISC Drivers");
10933 +MODULE_LICENSE("GPL");
10934 +
10935 +
10936 +/*
10937 + * Local variables:
10938 + * c-basic-offset: 8
10939 + * End:
10940 + */
10941 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/fiq_c_isr.c
10942 ===================================================================
10943 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
10944 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/fiq_c_isr.c 2008-12-11 22:46:49.000000000 +0100
10945 @@ -0,0 +1,291 @@
10946 +/*
10947 + * Copyright 2007 Andy Green <andy@warmcat.com>
10948 + * S3C modfifications
10949 + * Copyright 2008 Andy Green <andy@openmoko.com>
10950 + */
10951 +
10952 +#include <linux/module.h>
10953 +#include <linux/kernel.h>
10954 +#include <asm/hardware.h>
10955 +#include <asm/fiq.h>
10956 +#include "fiq_c_isr.h"
10957 +#include <linux/sysfs.h>
10958 +#include <linux/device.h>
10959 +#include <linux/platform_device.h>
10960 +
10961 +#include <asm/io.h>
10962 +
10963 +#include <asm/plat-s3c24xx/cpu.h>
10964 +#include <asm/plat-s3c24xx/irq.h>
10965 +
10966 +#include <asm/arch/pwm.h>
10967 +#include <asm/plat-s3c/regs-timer.h>
10968 +
10969 +/*
10970 + * Major Caveats for using FIQ
10971 + * ---------------------------
10972 + *
10973 + * 1) it CANNOT touch any vmalloc()'d memory, only memory
10974 + * that was kmalloc()'d. Static allocations in the monolithic kernel
10975 + * are kmalloc()'d so they are okay. You can touch memory-mapped IO, but
10976 + * the pointer for it has to have been stored in kmalloc'd memory. The
10977 + * reason for this is simple: every now and then Linux turns off interrupts
10978 + * and reorders the paging tables. If a FIQ happens during this time, the
10979 + * virtual memory space can be partly or entirely disordered or missing.
10980 + *
10981 + * 2) Because vmalloc() is used when a module is inserted, THIS FIQ
10982 + * ISR HAS TO BE IN THE MONOLITHIC KERNEL, not a module. But the way
10983 + * it is set up, you can all to enable and disable it from your module
10984 + * and intercommunicate with it through struct fiq_ipc
10985 + * fiq_ipc which you can define in
10986 + * asm/archfiq_ipc_type.h. The reason is the same as above, a
10987 + * FIQ could happen while even the ISR is not present in virtual memory
10988 + * space due to pagetables being changed at the time.
10989 + *
10990 + * 3) You can't call any Linux API code except simple macros
10991 + * - understand that FIQ can come in at any time, no matter what
10992 + * state of undress the kernel may privately be in, thinking it
10993 + * locked the door by turning off interrupts... FIQ is an
10994 + * unstoppable monster force (which is its value)
10995 + * - they are not vmalloc()'d memory safe
10996 + * - they might do crazy stuff like sleep: FIQ pisses fire and
10997 + * is not interested in 'sleep' that the weak seem to need
10998 + * - calling APIs from FIQ can re-enter un-renterable things
10999 + * - summary: you cannot interoperate with linux APIs directly in the FIQ ISR
11000 + *
11001 + * If you follow these rules, it is fantastic, an extremely powerful, solid,
11002 + * genuine hard realtime feature.
11003 + *
11004 + */
11005 +
11006 +/* more than enough to cover our jump instruction to the isr */
11007 +#define SIZEOF_FIQ_JUMP 8
11008 +/* more than enough to cover s3c2440_fiq_isr() in 4K blocks */
11009 +#define SIZEOF_FIQ_ISR 0x2000
11010 +/* increase the size of the stack that is active during FIQ as needed */
11011 +static u8 u8aFiqStack[4096];
11012 +
11013 +/* only one FIQ ISR possible, okay to do these here */
11014 +u32 _fiq_ack_mask; /* used by isr exit define */
11015 +unsigned long _fiq_count_fiqs; /* used by isr exit define */
11016 +static int _fiq_irq; /* private ; irq index we were started with, or 0 */
11017 +struct s3c2410_pwm pwm_timer_fiq;
11018 +int _fiq_timer_index;
11019 +u16 _fiq_timer_divisor;
11020 +
11021 +
11022 +/* this function must live in the monolithic kernel somewhere! A module is
11023 + * NOT good enough!
11024 + */
11025 +extern void __attribute__ ((naked)) s3c2440_fiq_isr(void);
11026 +
11027 +
11028 +/* this is copied into the hard FIQ vector during init */
11029 +
11030 +static void __attribute__ ((naked)) s3c2440_FIQ_Branch(void)
11031 +{
11032 + asm __volatile__ (
11033 + "mov pc, r8 ; "
11034 + );
11035 +}
11036 +
11037 +/* sysfs */
11038 +
11039 +static ssize_t show_count(struct device *dev, struct device_attribute *attr,
11040 + char *buf)
11041 +{
11042 + return sprintf(buf, "%ld\n", _fiq_count_fiqs);
11043 +}
11044 +
11045 +static DEVICE_ATTR(count, 0444, show_count, NULL);
11046 +
11047 +static struct attribute *s3c2440_fiq_sysfs_entries[] = {
11048 + &dev_attr_count.attr,
11049 + NULL
11050 +};
11051 +
11052 +static struct attribute_group s3c2440_fiq_attr_group = {
11053 + .name = "fiq",
11054 + .attrs = s3c2440_fiq_sysfs_entries,
11055 +};
11056 +
11057 +/*
11058 + * call this from your kernel module to set up the FIQ ISR to service FIQs,
11059 + * You need to have configured your FIQ input pin before anything will happen
11060 + *
11061 + * call it with, eg, IRQ_TIMER3 from asm-arm/arch-s3c2410/irqs.h
11062 + *
11063 + * you still need to clear the source interrupt in S3C2410_INTMSK to get
11064 + * anything good happening
11065 + */
11066 +static int fiq_init_irq_source(int irq_index_fiq)
11067 +{
11068 + int rc = 0;
11069 +
11070 + if (!irq_index_fiq) /* no interrupt */
11071 + goto bail;
11072 +
11073 + local_fiq_disable();
11074 +
11075 + _fiq_irq = irq_index_fiq;
11076 + _fiq_ack_mask = 1 << (irq_index_fiq - S3C2410_CPUIRQ_OFFSET);
11077 + _fiq_timer_index = (irq_index_fiq - IRQ_TIMER0);
11078 +
11079 + /* set up the timer to operate as a pwm device */
11080 +
11081 + rc = s3c2410_pwm_init(&pwm_timer_fiq);
11082 + if (rc)
11083 + goto bail;
11084 +
11085 + pwm_timer_fiq.timerid = PWM0 + _fiq_timer_index;
11086 + pwm_timer_fiq.prescaler = (6 - 1) / 2;
11087 + pwm_timer_fiq.divider = S3C2410_TCFG1_MUX3_DIV2;
11088 + /* default rate == ~32us */
11089 + pwm_timer_fiq.counter = pwm_timer_fiq.comparer = 3000;
11090 +
11091 + rc = s3c2410_pwm_enable(&pwm_timer_fiq);
11092 + if (rc)
11093 + goto bail;
11094 +
11095 + s3c2410_pwm_start(&pwm_timer_fiq);
11096 +
11097 + _fiq_timer_divisor = 0xffff; /* so kick will work initially */
11098 +
11099 + /* let our selected interrupt be a magic FIQ interrupt */
11100 + __raw_writel(_fiq_ack_mask, S3C2410_INTMOD);
11101 +
11102 + /* it's ready to go as soon as we unmask the source in S3C2410_INTMSK */
11103 + local_fiq_enable();
11104 +bail:
11105 + return rc;
11106 +}
11107 +
11108 +
11109 +/* call this from your kernel module to disable generation of FIQ actions */
11110 +static void fiq_disable_irq_source(void)
11111 +{
11112 + /* nothing makes FIQ any more */
11113 + __raw_writel(0, S3C2410_INTMOD);
11114 + local_fiq_disable();
11115 + _fiq_irq = 0; /* no active source interrupt now either */
11116 +}
11117 +
11118 +/*
11119 + * fiq_kick() forces a FIQ event to happen shortly after leaving the routine
11120 + */
11121 +void fiq_kick(void)
11122 +{
11123 + unsigned long flags;
11124 + u32 tcon;
11125 +
11126 + /* we have to take care about FIQ because this modification is
11127 + * non-atomic, FIQ could come in after the read and before the
11128 + * writeback and its changes to the register would be lost
11129 + * (platform INTMSK mod code is taken care of already)
11130 + */
11131 + local_save_flags(flags);
11132 + local_fiq_disable();
11133 + /* allow FIQs to resume */
11134 + __raw_writel(__raw_readl(S3C2410_INTMSK) &
11135 + ~(1 << (_fiq_irq - S3C2410_CPUIRQ_OFFSET)),
11136 + S3C2410_INTMSK);
11137 + tcon = __raw_readl(S3C2410_TCON) & ~S3C2410_TCON_T3START;
11138 + /* fake the timer to a count of 1 */
11139 + __raw_writel(1, S3C2410_TCNTB(_fiq_timer_index));
11140 + __raw_writel(tcon | S3C2410_TCON_T3MANUALUPD, S3C2410_TCON);
11141 + __raw_writel(tcon | S3C2410_TCON_T3MANUALUPD | S3C2410_TCON_T3START,
11142 + S3C2410_TCON);
11143 + __raw_writel(tcon | S3C2410_TCON_T3START, S3C2410_TCON);
11144 + local_irq_restore(flags);
11145 +}
11146 +EXPORT_SYMBOL_GPL(fiq_kick);
11147 +
11148 +
11149 +
11150 +
11151 +static int __init sc32440_fiq_probe(struct platform_device *pdev)
11152 +{
11153 + struct resource *r = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
11154 +
11155 + if (!r)
11156 + return -EIO;
11157 +
11158 + /* configure for the interrupt we are meant to use */
11159 + printk(KERN_INFO"Enabling FIQ using irq %d\n", r->start);
11160 +
11161 + fiq_init_irq_source(r->start);
11162 +
11163 + return sysfs_create_group(&pdev->dev.kobj, &s3c2440_fiq_attr_group);
11164 +}
11165 +
11166 +static int sc32440_fiq_remove(struct platform_device *pdev)
11167 +{
11168 + fiq_disable_irq_source();
11169 + sysfs_remove_group(&pdev->dev.kobj, &s3c2440_fiq_attr_group);
11170 + return 0;
11171 +}
11172 +
11173 +static void fiq_set_vector_and_regs(void)
11174 +{
11175 + struct pt_regs regs;
11176 +
11177 + /* prep the special FIQ mode regs */
11178 + memset(&regs, 0, sizeof(regs));
11179 + regs.ARM_r8 = (unsigned long)s3c2440_fiq_isr;
11180 + regs.ARM_sp = (unsigned long)u8aFiqStack + sizeof(u8aFiqStack) - 4;
11181 + /* set up the special FIQ-mode-only registers from our regs */
11182 + set_fiq_regs(&regs);
11183 + /* copy our jump to the real ISR into the hard vector address */
11184 + set_fiq_handler(s3c2440_FIQ_Branch, SIZEOF_FIQ_JUMP);
11185 +}
11186 +
11187 +#ifdef CONFIG_PM
11188 +static int sc32440_fiq_suspend(struct platform_device *pdev, pm_message_t state)
11189 +{
11190 + /* nothing makes FIQ any more */
11191 + __raw_writel(0, S3C2410_INTMOD);
11192 + local_fiq_disable();
11193 +
11194 + return 0;
11195 +}
11196 +
11197 +static int sc32440_fiq_resume(struct platform_device *pdev)
11198 +{
11199 + fiq_set_vector_and_regs();
11200 + fiq_init_irq_source(_fiq_irq);
11201 + return 0;
11202 +}
11203 +#else
11204 +#define sc32440_fiq_suspend NULL
11205 +#define sc32440_fiq_resume NULL
11206 +#endif
11207 +
11208 +static struct platform_driver sc32440_fiq_driver = {
11209 + .driver = {
11210 + .name = "sc32440_fiq",
11211 + .owner = THIS_MODULE,
11212 + },
11213 +
11214 + .probe = sc32440_fiq_probe,
11215 + .remove = __devexit_p(sc32440_fiq_remove),
11216 + .suspend = sc32440_fiq_suspend,
11217 + .resume = sc32440_fiq_resume,
11218 +};
11219 +
11220 +static int __init sc32440_fiq_init(void)
11221 +{
11222 + fiq_set_vector_and_regs();
11223 +
11224 + return platform_driver_register(&sc32440_fiq_driver);
11225 +}
11226 +
11227 +static void __exit sc32440_fiq_exit(void)
11228 +{
11229 + fiq_disable_irq_source();
11230 +}
11231 +
11232 +MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
11233 +MODULE_LICENSE("GPL");
11234 +
11235 +module_init(sc32440_fiq_init);
11236 +module_exit(sc32440_fiq_exit);
11237 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/fiq_c_isr.h
11238 ===================================================================
11239 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
11240 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/fiq_c_isr.h 2008-12-11 22:46:49.000000000 +0100
11241 @@ -0,0 +1,66 @@
11242 +#ifndef _LINUX_FIQ_C_ISR_H
11243 +#define _LINUX_FIQ_C_ISR_H
11244 +
11245 +#include <asm/arch-s3c2410/regs-irq.h>
11246 +
11247 +extern unsigned long _fiq_count_fiqs;
11248 +extern u32 _fiq_ack_mask;
11249 +extern int _fiq_timer_index;
11250 +extern u16 _fiq_timer_divisor;
11251 +
11252 +/* This CANNOT be implemented in a module -- it has to be used in code
11253 + * included in the monolithic kernel
11254 + */
11255 +
11256 +#define FIQ_HANDLER_START() \
11257 +void __attribute__ ((naked)) s3c2440_fiq_isr(void) \
11258 +{\
11259 + /*\
11260 + * you can declare local vars here, take care to set the frame size\
11261 + * below accordingly if there are more than a few dozen bytes of them\
11262 + */\
11263 +
11264 +/* stick your locals here :-)
11265 + * Do NOT initialize them here! define them and initialize them after
11266 + * FIQ_HANDLER_ENTRY() is done.
11267 + */
11268 +
11269 +#define FIQ_HANDLER_ENTRY(LOCALS, FRAME) \
11270 + const int _FIQ_FRAME_SIZE = FRAME; \
11271 + /* entry takes care to store registers we will be treading on here */\
11272 + asm __volatile__ (\
11273 + "mov ip, sp ;"\
11274 + /* stash FIQ and r0-r8 normal regs */\
11275 + "stmdb sp!, {r0-r12, lr};"\
11276 + /* allow SP to get some space */\
11277 + "sub sp, sp, %1 ;"\
11278 + /* !! THIS SETS THE FRAME, adjust to > sizeof locals */\
11279 + "sub fp, sp, %0 ;"\
11280 + :\
11281 + : "rI" (LOCALS), "rI" (FRAME)\
11282 + :"r9"\
11283 + );
11284 +
11285 +/* stick your ISR code here and then end with... */
11286 +
11287 +#define FIQ_HANDLER_END() \
11288 + _fiq_count_fiqs++;\
11289 + __raw_writel(_fiq_ack_mask, S3C2410_SRCPND);\
11290 +\
11291 + /* exit back to normal mode restoring everything */\
11292 + asm __volatile__ (\
11293 + /* pop our allocation */\
11294 + "add sp, sp, %0 ;"\
11295 + /* return FIQ regs back to pristine state\
11296 + * and get normal regs back\
11297 + */\
11298 + "ldmia sp!, {r0-r12, lr};"\
11299 +\
11300 + /* return */\
11301 + "subs pc, lr, #4;"\
11302 + : \
11303 + : "rI" (_FIQ_FRAME_SIZE) \
11304 + );\
11305 +}
11306 +
11307 +#endif /* _LINUX_FIQ_C_ISR_H */
11308 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/Kconfig
11309 ===================================================================
11310 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2440/Kconfig 2008-12-11 22:46:07.000000000 +0100
11311 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/Kconfig 2008-12-11 22:46:49.000000000 +0100
11312 @@ -22,6 +22,13 @@ config S3C2440_DMA
11313 help
11314 Support for S3C2440 specific DMA code5A
11315
11316 +config S3C2440_C_FIQ
11317 + bool "FIQ ISR support in C"
11318 + depends on ARCH_S3C2410
11319 + select FIQ
11320 + help
11321 + Support for S3C2440 FIQ support in C -- see
11322 + ./arch/arm/macs3c2440/fiq_c_isr.c
11323
11324 menu "S3C2440 Machines"
11325
11326 @@ -67,6 +74,37 @@ config SMDK2440_CPU2440
11327 default y if ARCH_S3C2440
11328 select CPU_S3C2440
11329
11330 +config MACH_HXD8
11331 + bool "FIC HXD8"
11332 + select CPU_S3C2440
11333 + select SENSORS_PCF50606
11334 + help
11335 + Say Y here if you are using the FIC Neo1973 GSM Phone
11336 +
11337 +config MACH_NEO1973_GTA02
11338 + bool "FIC Neo1973 GSM Phone (GTA02 Hardware)"
11339 + select CPU_S3C2442
11340 + select SENSORS_PCF50633
11341 + select POWER_SUPPLY
11342 + select GTA02_HDQ
11343 + help
11344 + Say Y here if you are using the FIC Neo1973 GSM Phone
11345 +
11346 +config NEO1973_GTA02_2440
11347 + bool "Old FIC Neo1973 GTA02 hardware using S3C2440 CPU"
11348 + depends on MACH_NEO1973_GTA02
11349 + select CPU_S3C2440
11350 + help
11351 + Say Y here if you are using an early hardware revision
11352 + of the FIC/Openmoko Neo1973 GTA02 GSM Phone.
11353 +
11354 +config MACH_M800
11355 + bool "E-TEN glofiish M800/X800"
11356 + select CPU_S3C2442
11357 + help
11358 + Say Y here if you are using the E-TEN glofiish M800/X800.
11359 +
11360
11361 endmenu
11362
11363 +#source "arch/arm/mach-s3c2440/camera/Kconfig"
11364 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/mach-glofiish.c
11365 ===================================================================
11366 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
11367 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/mach-glofiish.c 2008-12-11 22:46:49.000000000 +0100
11368 @@ -0,0 +1,620 @@
11369 +/*
11370 + * linux/arch/arm/mach-s3c2440/mach-glofiish.c
11371 + *
11372 + * S3C2440 Machine Support for the E-TEN glofiish X800/M800
11373 + *
11374 + * Copyright (C) 2008 by Harald Welte <laforge@gnumonks.org>
11375 + * All rights reserved.
11376 + *
11377 + * This program is free software; you can redistribute it and/or
11378 + * modify it under the terms of the GNU General Public License as
11379 + * published by the Free Software Foundation; either version 2 of
11380 + * the License, or (at your option) any later version.
11381 + *
11382 + * This program is distributed in the hope that it will be useful,
11383 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
11384 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11385 + * GNU General Public License for more details.
11386 + *
11387 + * You should have received a copy of the GNU General Public License
11388 + * along with this program; if not, write to the Free Software
11389 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
11390 + * MA 02111-1307 USA
11391 + *
11392 + */
11393 +
11394 +#include <linux/kernel.h>
11395 +#include <linux/types.h>
11396 +#include <linux/interrupt.h>
11397 +#include <linux/list.h>
11398 +#include <linux/delay.h>
11399 +#include <linux/timer.h>
11400 +#include <linux/init.h>
11401 +#include <linux/workqueue.h>
11402 +#include <linux/platform_device.h>
11403 +#include <linux/serial_core.h>
11404 +#include <linux/spi/spi.h>
11405 +#include <linux/spi/spi_bitbang.h>
11406 +#include <linux/mmc/host.h>
11407 +
11408 +#include <linux/mtd/mtd.h>
11409 +#include <linux/mtd/nand.h>
11410 +#include <linux/mtd/nand_ecc.h>
11411 +#include <linux/mtd/partitions.h>
11412 +#include <linux/mtd/physmap.h>
11413 +
11414 +#include <asm/mach/arch.h>
11415 +#include <asm/mach/map.h>
11416 +#include <asm/mach/irq.h>
11417 +
11418 +#include <asm/hardware.h>
11419 +#include <asm/io.h>
11420 +#include <asm/irq.h>
11421 +#include <asm/mach-types.h>
11422 +
11423 +#include <asm/arch-s3c2410/regs-irq.h>
11424 +#include <asm/arch/regs-gpio.h>
11425 +#include <asm/arch/regs-gpioj.h>
11426 +#include <asm/arch/fb.h>
11427 +#include <asm/arch/mci.h>
11428 +#include <asm/arch/ts.h>
11429 +#include <asm/arch/spi.h>
11430 +#include <asm/arch/spi-gpio.h>
11431 +#include <asm/arch/usb-control.h>
11432 +
11433 +#include <asm/arch/glofiish.h>
11434 +#include <asm/arch/gta01.h>
11435 +
11436 +#include <asm/plat-s3c/regs-serial.h>
11437 +#include <asm/plat-s3c/nand.h>
11438 +#include <asm/plat-s3c24xx/devs.h>
11439 +#include <asm/plat-s3c24xx/cpu.h>
11440 +#include <asm/plat-s3c24xx/pm.h>
11441 +#include <asm/plat-s3c24xx/udc.h>
11442 +
11443 +#include <linux/jbt6k74.h>
11444 +
11445 +/*
11446 + * this gets called every 1ms when we paniced.
11447 + */
11448 +
11449 +static long glofiish_panic_blink(long count)
11450 +{
11451 + long delay = 0;
11452 + static long last_blink;
11453 + static char led;
11454 +
11455 + if (count - last_blink < 100) /* 200ms period, fast blink */
11456 + return 0;
11457 +
11458 + /* FIXME */
11459 +#if 0
11460 + led ^= 1;
11461 + s3c2410_gpio_cfgpin(GTA02_GPIO_AUX_LED, S3C2410_GPIO_OUTPUT);
11462 + neo1973_gpb_setpin(GTA02_GPIO_AUX_LED, led);
11463 +
11464 + last_blink = count;
11465 +#endif
11466 + return delay;
11467 +}
11468 +
11469 +struct platform_device gta02_version_device = {
11470 + .name = "neo1973-version",
11471 + .num_resources = 0,
11472 +};
11473 +
11474 +struct platform_device gta02_resume_reason_device = {
11475 + .name = "neo1973-resume",
11476 + .num_resources = 0,
11477 +};
11478 +
11479 +struct platform_device gta02_memconfig_device = {
11480 + .name = "neo1973-memconfig",
11481 + .num_resources = 0,
11482 +};
11483 +
11484 +static struct map_desc m800_iodesc[] __initdata = {
11485 + {
11486 + .virtual = 0xe0000000,
11487 + .pfn = __phys_to_pfn(S3C2410_CS3+0x01000000),
11488 + .length = SZ_1M,
11489 + .type = MT_DEVICE
11490 + },
11491 +};
11492 +
11493 +#define UCON S3C2410_UCON_DEFAULT
11494 +#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
11495 +#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
11496 +
11497 +static struct s3c2410_uartcfg m800_uartcfgs[] = {
11498 + [0] = {
11499 + .hwport = 0,
11500 + .flags = 0,
11501 + .ucon = UCON,
11502 + .ulcon = ULCON,
11503 + .ufcon = UFCON,
11504 + },
11505 + [1] = {
11506 + .hwport = 1,
11507 + .flags = 0,
11508 + .ucon = UCON,
11509 + .ulcon = ULCON,
11510 + .ufcon = UFCON,
11511 + },
11512 + [2] = {
11513 + .hwport = 2,
11514 + .flags = 0,
11515 + .ucon = UCON,
11516 + .ulcon = ULCON,
11517 + .ufcon = UFCON,
11518 + },
11519 +
11520 +};
11521 +
11522 +/* Configuration for 480x640 toppoly TD028TTEC1.
11523 + * Do not mark this as __initdata or it will break! */
11524 +static struct s3c2410fb_display glofiish_displays[] = {
11525 + {
11526 + .type = S3C2410_LCDCON1_TFT,
11527 + .width = 43,
11528 + .height = 58,
11529 + .xres = 480,
11530 + .yres = 640,
11531 + .bpp = 16,
11532 +
11533 + .pixclock = 40000, /* HCLK/4 */
11534 + .left_margin = 2,
11535 + .right_margin = 2,
11536 + .hsync_len = 2,
11537 + .upper_margin = 2,
11538 + .lower_margin = 66,
11539 + .vsync_len = 2,
11540 + .lcdcon5 = S3C2410_LCDCON5_FRM565 |
11541 + S3C2410_LCDCON5_INVVCLK |
11542 + S3C2410_LCDCON5_INVVLINE |
11543 + S3C2410_LCDCON5_INVVFRAME |
11544 + S3C2410_LCDCON5_PWREN |
11545 + S3C2410_LCDCON5_HWSWP,
11546 + },
11547 + {
11548 + .type = S3C2410_LCDCON1_TFT,
11549 + .width = 43,
11550 + .height = 58,
11551 + .xres = 480,
11552 + .yres = 640,
11553 + .bpp = 32,
11554 +
11555 + .pixclock = 40000, /* HCLK/4 */
11556 + .left_margin = 104,
11557 + .right_margin = 8,
11558 + .hsync_len = 8,
11559 + .upper_margin = 2,
11560 + .lower_margin = 16,
11561 + .vsync_len = 2,
11562 + .lcdcon5 = S3C2410_LCDCON5_FRM565 |
11563 + S3C2410_LCDCON5_INVVCLK |
11564 + S3C2410_LCDCON5_INVVLINE |
11565 + S3C2410_LCDCON5_INVVFRAME |
11566 + S3C2410_LCDCON5_PWREN |
11567 + S3C2410_LCDCON5_HWSWP,
11568 + },
11569 + {
11570 + .type = S3C2410_LCDCON1_TFT,
11571 + .width = 43,
11572 + .height = 58,
11573 + .xres = 240,
11574 + .yres = 320,
11575 + .bpp = 16,
11576 +
11577 + .pixclock = 40000, /* HCLK/4 */
11578 + .left_margin = 104,
11579 + .right_margin = 8,
11580 + .hsync_len = 8,
11581 + .upper_margin = 2,
11582 + .lower_margin = 16,
11583 + .vsync_len = 2,
11584 + .lcdcon5 = S3C2410_LCDCON5_FRM565 |
11585 + S3C2410_LCDCON5_INVVCLK |
11586 + S3C2410_LCDCON5_INVVLINE |
11587 + S3C2410_LCDCON5_INVVFRAME |
11588 + S3C2410_LCDCON5_PWREN |
11589 + S3C2410_LCDCON5_HWSWP,
11590 + },
11591 +};
11592 +
11593 +static struct s3c2410fb_mach_info glofiish_lcd_cfg __initdata = {
11594 + .displays = glofiish_displays,
11595 + .num_displays = ARRAY_SIZE(glofiish_displays),
11596 + .default_display = 0,
11597 +
11598 + .lpcsel = ((0xCE6) & ~7) | 1<<4,
11599 +};
11600 +
11601 +
11602 +static struct resource m800_sdio_resources[] = {
11603 + [0] = {
11604 + .flags = IORESOURCE_IRQ,
11605 + .start = IRQ_SDI,
11606 + .end = IRQ_SDI,
11607 + },
11608 + [1] = {
11609 + .flags = IORESOURCE_MEM,
11610 + .start = S3C2410_PA_SDI,
11611 + .end = S3C2410_PA_SDI + S3C24XX_SZ_SDI - 1,
11612 + },
11613 + [2] = {
11614 + .flags = IORESOURCE_DMA,
11615 + .start = 0, /* Channel 0 for SDI */
11616 + .end = 0,
11617 + },
11618 +};
11619 +
11620 +static struct platform_device *glofiish_devices[] __initdata = {
11621 + &s3c_device_usb,
11622 + &s3c_device_lcd,
11623 + &s3c_device_wdt,
11624 + &s3c_device_i2c,
11625 + &s3c_device_iis,
11626 + &s3c_device_sdi,
11627 + &s3c_device_usbgadget,
11628 + &s3c_device_nand,
11629 + &s3c_device_ts,
11630 +};
11631 +
11632 +static struct s3c2410_nand_set glofiish_nand_sets[] = {
11633 + [0] = {
11634 + .name = "glofiish-nand",
11635 + .nr_chips = 1,
11636 + .flags = S3C2410_NAND_BBT,
11637 + },
11638 +};
11639 +
11640 +/* choose a set of timings derived from S3C@2442B MCP54
11641 + * data sheet (K5D2G13ACM-D075 MCP Memory)
11642 + */
11643 +
11644 +static struct s3c2410_platform_nand glofiish_nand_info = {
11645 + .tacls = 0,
11646 + .twrph0 = 25,
11647 + .twrph1 = 15,
11648 + .nr_sets = ARRAY_SIZE(glofiish_nand_sets),
11649 + .sets = glofiish_nand_sets,
11650 + .software_ecc = 1,
11651 +};
11652 +
11653 +static struct s3c24xx_mci_pdata glofiish_mmc_cfg = {
11654 + .gpio_detect = M800_GPIO_nSD_DETECT,
11655 + .set_power = NULL,
11656 + .ocr_avail = MMC_VDD_32_33,
11657 +};
11658 +
11659 +static void glofiish_udc_command(enum s3c2410_udc_cmd_e cmd)
11660 +{
11661 + printk(KERN_DEBUG "%s(%d)\n", __func__, cmd);
11662 +
11663 + switch (cmd) {
11664 + case S3C2410_UDC_P_ENABLE:
11665 + s3c2410_gpio_setpin(M800_GPIO_USB_PULLUP, 1);
11666 + break;
11667 + case S3C2410_UDC_P_DISABLE:
11668 + s3c2410_gpio_setpin(M800_GPIO_USB_PULLUP, 0);
11669 + break;
11670 + case S3C2410_UDC_P_RESET:
11671 + /* FIXME! */
11672 + break;
11673 + default:
11674 + break;
11675 + }
11676 +}
11677 +
11678 +/* get PMU to set USB current limit accordingly */
11679 +
11680 +static void glofiish_udc_vbus_draw(unsigned int ma)
11681 +{
11682 + //pcf50633_notify_usb_current_limit_change(pcf50633_global, ma);
11683 +}
11684 +
11685 +static struct s3c2410_udc_mach_info glofiish_udc_cfg = {
11686 + .vbus_draw = glofiish_udc_vbus_draw,
11687 + .udc_command = glofiish_udc_command,
11688 +
11689 +};
11690 +
11691 +static struct s3c2410_ts_mach_info glofiish_ts_cfg = {
11692 + .delay = 10000,
11693 + .presc = 50000000 / 1000000, /* 50 MHz PCLK / 1MHz */
11694 + /* simple averaging, 2^n samples */
11695 + .oversampling_shift = 5,
11696 + /* averaging filter length, 2^n */
11697 + .excursion_filter_len_bits = 5,
11698 + /* flagged for beauty contest on next sample if differs from
11699 + * average more than this
11700 + */
11701 + .reject_threshold_vs_avg = 2,
11702 +};
11703 +
11704 +
11705 +/* SPI: LCM control interface attached to Glamo3362 */
11706 +
11707 +static void m800_jbt6k74_reset(int devidx, int level)
11708 +{
11709 + //glamo_lcm_reset(level);
11710 + printk(KERN_DEBUG "gta01_jbt6k74_reset\n");
11711 +}
11712 +
11713 +/* finally bring up deferred backlight resume now LCM is resumed itself */
11714 +
11715 +static void m800_jbt6k74_resuming(int devidx)
11716 +{
11717 + //pcf50633_backlight_resume(pcf50633_global);
11718 + //gta01bl_deferred_resume();
11719 +}
11720 +
11721 +const struct jbt6k74_platform_data jbt6k74_pdata = {
11722 + .reset = m800_jbt6k74_reset,
11723 + .resuming = m800_jbt6k74_resuming,
11724 +};
11725 +
11726 +static struct spi_board_info glofiish_spi_board_info[] = {
11727 + {
11728 + .modalias = "jbt6k74",
11729 + /* platform_data */
11730 + .platform_data = &jbt6k74_pdata,
11731 + /* controller_data */
11732 + /* irq */
11733 + .max_speed_hz = 10 * 1000 * 1000,
11734 + .bus_num = 2,
11735 + /* chip_select */
11736 + },
11737 +};
11738 +
11739 +static void spi_gpio_cs(struct s3c2410_spigpio_info *spi, int csidx, int cs)
11740 +{
11741 + switch (cs) {
11742 + case BITBANG_CS_ACTIVE:
11743 + s3c2410_gpio_setpin(S3C2410_GPG3, 0);
11744 + break;
11745 + case BITBANG_CS_INACTIVE:
11746 + s3c2410_gpio_setpin(S3C2410_GPG3, 1);
11747 + break;
11748 + }
11749 +}
11750 +
11751 +static struct s3c2410_spigpio_info spi_gpio_cfg = {
11752 + .pin_clk = S3C2410_GPG7,
11753 + .pin_mosi = S3C2410_GPG6,
11754 + .pin_miso = S3C2410_GPG5,
11755 + .board_size = ARRAY_SIZE(glofiish_spi_board_info),
11756 + .board_info = glofiish_spi_board_info,
11757 + .chip_select = &spi_gpio_cs,
11758 + .num_chipselect = 2, /*** Should be 1 or 2 for gta01? ***/
11759 +};
11760 +
11761 +static struct resource s3c_spi_lcm_resource[] = {
11762 + [0] = {
11763 + .start = S3C2410_GPG3,
11764 + .end = S3C2410_GPG3,
11765 + },
11766 + [1] = {
11767 + .start = S3C2410_GPG5,
11768 + .end = S3C2410_GPG5,
11769 + },
11770 + [2] = {
11771 + .start = S3C2410_GPG6,
11772 + .end = S3C2410_GPG6,
11773 + },
11774 + [3] = {
11775 + .start = S3C2410_GPG7,
11776 + .end = S3C2410_GPG7,
11777 + },
11778 +};
11779 +
11780 +struct platform_device s3c_device_spi_lcm = {
11781 + .name = "spi_s3c24xx_gpio",
11782 + .id = 1,
11783 + .num_resources = ARRAY_SIZE(s3c_spi_lcm_resource),
11784 + .resource = s3c_spi_lcm_resource,
11785 + .dev = {
11786 + .platform_data = &spi_gpio_cfg,
11787 + },
11788 +};
11789 +
11790 +static struct gta01bl_machinfo backlight_machinfo = {
11791 + .default_intensity = 1,
11792 + .max_intensity = 1,
11793 + .limit_mask = 1,
11794 + .defer_resume_backlight = 1,
11795 +};
11796 +
11797 +static struct resource gta01_bl_resources[] = {
11798 + [0] = {
11799 + .start = M800_GPIO_BACKLIGHT,
11800 + .end = M800_GPIO_BACKLIGHT,
11801 + },
11802 +};
11803 +
11804 +struct platform_device gta01_bl_dev = {
11805 + .name = "gta01-bl",
11806 + .num_resources = ARRAY_SIZE(gta01_bl_resources),
11807 + .resource = gta01_bl_resources,
11808 + .dev = {
11809 + .platform_data = &backlight_machinfo,
11810 + },
11811 +};
11812 +
11813 +
11814 +#if 0 /* currently this is not used and we use gpio spi */
11815 +static struct glamo_spi_info glamo_spi_cfg = {
11816 + .board_size = ARRAY_SIZE(gta02_spi_board_info),
11817 + .board_info = gta02_spi_board_info,
11818 +};
11819 +#endif /* 0 */
11820 +
11821 +#if 0
11822 +static struct resource gta02_vibrator_resources[] = {
11823 + [0] = {
11824 + .start = GTA02_GPIO_VIBRATOR_ON,
11825 + .end = GTA02_GPIO_VIBRATOR_ON,
11826 + },
11827 +};
11828 +
11829 +static struct platform_device gta02_vibrator_dev = {
11830 + .name = "neo1973-vibrator",
11831 + .num_resources = ARRAY_SIZE(gta02_vibrator_resources),
11832 + .resource = gta02_vibrator_resources,
11833 +};
11834 +
11835 +static struct resource gta02_led_resources[] = {
11836 + {
11837 + .name = "gta02-power:orange",
11838 + .start = GTA02_GPIO_PWR_LED1,
11839 + .end = GTA02_GPIO_PWR_LED1,
11840 + }, {
11841 + .name = "gta02-power:blue",
11842 + .start = GTA02_GPIO_PWR_LED2,
11843 + .end = GTA02_GPIO_PWR_LED2,
11844 + }, {
11845 + .name = "gta02-aux:red",
11846 + .start = GTA02_GPIO_AUX_LED,
11847 + .end = GTA02_GPIO_AUX_LED,
11848 + },
11849 +};
11850 +
11851 +struct platform_device gta02_led_dev = {
11852 + .name = "gta02-led",
11853 + .num_resources = ARRAY_SIZE(gta02_led_resources),
11854 + .resource = gta02_led_resources,
11855 +};
11856 +
11857 +static struct resource gta02_button_resources[] = {
11858 + [0] = {
11859 + .start = GTA02_GPIO_AUX_KEY,
11860 + .end = GTA02_GPIO_AUX_KEY,
11861 + },
11862 + [1] = {
11863 + .start = GTA02_GPIO_HOLD_KEY,
11864 + .end = GTA02_GPIO_HOLD_KEY,
11865 + },
11866 + [2] = {
11867 + .start = GTA02_GPIO_JACK_INSERT,
11868 + .end = GTA02_GPIO_JACK_INSERT,
11869 + },
11870 +};
11871 +
11872 +static struct platform_device gta02_button_dev = {
11873 + .name = "neo1973-button",
11874 + .num_resources = ARRAY_SIZE(gta02_button_resources),
11875 + .resource = gta02_button_resources,
11876 +};
11877 +#endif
11878 +
11879 +/* USB */
11880 +static struct s3c2410_hcd_info glofiish_usb_info = {
11881 + .port[0] = {
11882 + .flags = S3C_HCDFLG_USED,
11883 + },
11884 + .port[1] = {
11885 + .flags = 0,
11886 + },
11887 +};
11888 +
11889 +static struct resource m800_button_resources[] = {
11890 + [0] = {
11891 + .start = M800_GPIO_nKEY_POWER,
11892 + .end = M800_GPIO_nKEY_POWER,
11893 + },
11894 + [1] = {
11895 + .start = M800_GPIO_nKEY_CAMERA,
11896 + .end = M800_GPIO_nKEY_CAMERA,
11897 + },
11898 + [3] = {
11899 + .start = M800_GPIO_nKEY_RECORD,
11900 + .end = M800_GPIO_nKEY_RECORD,
11901 + },
11902 + [2] = {
11903 + .start = M800_GPIO_SLIDE,
11904 + .end = M800_GPIO_SLIDE,
11905 + },
11906 +};
11907 +
11908 +static struct platform_device m800_button_dev = {
11909 + .name = "m800-button",
11910 + .num_resources = ARRAY_SIZE(m800_button_resources),
11911 + .resource = m800_button_resources,
11912 +};
11913 +
11914 +static struct platform_device m800_pm_bt_dev = {
11915 + .name = "neo1973-pm-bt",
11916 +};
11917 +
11918 +static void __init glofiish_map_io(void)
11919 +{
11920 + s3c24xx_init_io(m800_iodesc, ARRAY_SIZE(m800_iodesc));
11921 + s3c24xx_init_clocks(16934400);
11922 + s3c24xx_init_uarts(m800_uartcfgs, ARRAY_SIZE(m800_uartcfgs));
11923 +}
11924 +
11925 +static irqreturn_t gta02_modem_irq(int irq, void *param)
11926 +{
11927 + printk(KERN_DEBUG "modem wakeup interrupt\n");
11928 + return IRQ_HANDLED;
11929 +}
11930 +
11931 +static irqreturn_t ar6000_wow_irq(int irq, void *param)
11932 +{
11933 + printk(KERN_DEBUG "ar6000_wow interrupt\n");
11934 + return IRQ_HANDLED;
11935 +}
11936 +
11937 +/*
11938 + * hardware_ecc=1|0
11939 + */
11940 +static char hardware_ecc_str[4] __initdata = "";
11941 +
11942 +static int __init hardware_ecc_setup(char *str)
11943 +{
11944 + if (str)
11945 + strlcpy(hardware_ecc_str, str, sizeof(hardware_ecc_str));
11946 + return 1;
11947 +}
11948 +
11949 +__setup("hardware_ecc=", hardware_ecc_setup);
11950 +
11951 +static void __init glofiish_machine_init(void)
11952 +{
11953 + int rc;
11954 +
11955 + /* set the panic callback to make AUX blink fast */
11956 + panic_blink = glofiish_panic_blink;
11957 +
11958 + /* do not force soft ecc if we are asked to use hardware_ecc */
11959 + if (hardware_ecc_str[0] == '1')
11960 + glofiish_nand_info.software_ecc = 0;
11961 +
11962 + s3c_device_usb.dev.platform_data = &glofiish_usb_info;
11963 + s3c_device_nand.dev.platform_data = &glofiish_nand_info;
11964 + s3c_device_sdi.dev.platform_data = &glofiish_mmc_cfg;
11965 +
11966 + s3c24xx_fb_set_platdata(&glofiish_lcd_cfg);
11967 + s3c24xx_udc_set_platdata(&glofiish_udc_cfg);
11968 + set_s3c2410ts_info(&glofiish_ts_cfg);
11969 +
11970 + platform_device_register(&gta01_bl_dev);
11971 + platform_device_register(&m800_pm_bt_dev);
11972 + platform_device_register(&m800_button_dev);
11973 + platform_device_register(&s3c_device_spi_lcm);
11974 +
11975 + platform_add_devices(glofiish_devices, ARRAY_SIZE(glofiish_devices));
11976 +
11977 + s3c2410_pm_init();
11978 +}
11979 +
11980 +MACHINE_START(M800, "Glofiish M800")
11981 + .phys_io = S3C2410_PA_UART,
11982 + .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
11983 + .boot_params = S3C2410_SDRAM_PA + 0x100,
11984 + .map_io = glofiish_map_io,
11985 + .init_irq = s3c24xx_init_irq,
11986 + .init_machine = glofiish_machine_init,
11987 + .timer = &s3c24xx_timer,
11988 +MACHINE_END
11989 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/mach-gta02.c
11990 ===================================================================
11991 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
11992 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/mach-gta02.c 2008-12-11 22:46:49.000000000 +0100
11993 @@ -0,0 +1,1656 @@
11994 +/*
11995 + * linux/arch/arm/mach-s3c2440/mach-gta02.c
11996 + *
11997 + * S3C2440 Machine Support for the FIC GTA02 (Neo1973)
11998 + *
11999 + * Copyright (C) 2006-2007 by Openmoko, Inc.
12000 + * Author: Harald Welte <laforge@openmoko.org>
12001 + * All rights reserved.
12002 + *
12003 + * This program is free software; you can redistribute it and/or
12004 + * modify it under the terms of the GNU General Public License as
12005 + * published by the Free Software Foundation; either version 2 of
12006 + * the License, or (at your option) any later version.
12007 + *
12008 + * This program is distributed in the hope that it will be useful,
12009 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
12010 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12011 + * GNU General Public License for more details.
12012 + *
12013 + * You should have received a copy of the GNU General Public License
12014 + * along with this program; if not, write to the Free Software
12015 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
12016 + * MA 02111-1307 USA
12017 + *
12018 + */
12019 +
12020 +#include <linux/kernel.h>
12021 +#include <linux/types.h>
12022 +#include <linux/interrupt.h>
12023 +#include <linux/list.h>
12024 +#include <linux/delay.h>
12025 +#include <linux/timer.h>
12026 +#include <linux/init.h>
12027 +#include <linux/workqueue.h>
12028 +#include <linux/platform_device.h>
12029 +#include <linux/serial_core.h>
12030 +#include <linux/spi/spi.h>
12031 +#include <linux/spi/glamo.h>
12032 +#include <linux/spi/spi_bitbang.h>
12033 +#include <linux/mmc/host.h>
12034 +
12035 +#include <linux/mtd/mtd.h>
12036 +#include <linux/mtd/nand.h>
12037 +#include <linux/mtd/nand_ecc.h>
12038 +#include <linux/mtd/partitions.h>
12039 +#include <linux/mtd/physmap.h>
12040 +
12041 +#include <linux/pcf50633.h>
12042 +#include <linux/lis302dl.h>
12043 +
12044 +#include <asm/mach/arch.h>
12045 +#include <asm/mach/map.h>
12046 +#include <asm/mach/irq.h>
12047 +
12048 +#include <asm/hardware.h>
12049 +#include <asm/io.h>
12050 +#include <asm/irq.h>
12051 +#include <asm/mach-types.h>
12052 +
12053 +#include <asm/arch-s3c2410/regs-irq.h>
12054 +#include <asm/arch/regs-gpio.h>
12055 +#include <asm/arch/regs-gpioj.h>
12056 +#include <asm/arch/fb.h>
12057 +#include <asm/arch/mci.h>
12058 +#include <asm/arch/ts.h>
12059 +#include <asm/arch/spi.h>
12060 +#include <asm/arch/spi-gpio.h>
12061 +#include <asm/arch/usb-control.h>
12062 +
12063 +#include <asm/arch/gta02.h>
12064 +
12065 +#include <asm/plat-s3c/regs-serial.h>
12066 +#include <asm/plat-s3c/nand.h>
12067 +#include <asm/plat-s3c24xx/devs.h>
12068 +#include <asm/plat-s3c24xx/cpu.h>
12069 +#include <asm/plat-s3c24xx/pm.h>
12070 +#include <asm/plat-s3c24xx/udc.h>
12071 +#include <asm/plat-s3c24xx/neo1973.h>
12072 +#include <asm/arch-s3c2410/neo1973-pm-gsm.h>
12073 +
12074 +#include <linux/jbt6k74.h>
12075 +
12076 +#include <linux/glamofb.h>
12077 +
12078 +#include <asm/arch/fiq_ipc_gta02.h>
12079 +#include "fiq_c_isr.h"
12080 +#include <linux/gta02_hdq.h>
12081 +#include <linux/bq27000_battery.h>
12082 +
12083 +#include "../plat-s3c24xx/neo1973_pm_gps.h"
12084 +
12085 +/* arbitrates which sensor IRQ owns the shared SPI bus */
12086 +static spinlock_t motion_irq_lock;
12087 +
12088 +/* the dependency of jbt / LCM on pcf50633 resume */
12089 +struct resume_dependency resume_dep_jbt_pcf;
12090 +/* the dependency of jbt / LCM on glamo resume */
12091 +struct resume_dependency resume_dep_jbt_glamo;
12092 +/* the dependency of Glamo MCI on pcf50633 resume (has to power SD slot) */
12093 +struct resume_dependency resume_dep_glamo_mci_pcf;
12094 +
12095 +
12096 +static int gta02_charger_online_status;
12097 +static int gta02_charger_active_status;
12098 +
12099 +/* define FIQ IPC struct */
12100 +/*
12101 + * contains stuff FIQ ISR modifies and normal kernel code can see and use
12102 + * this is defined in <asm/arch/fiq_ipc_gta02.h>, you should customize
12103 + * the definition in there and include the same definition in your kernel
12104 + * module that wants to interoperate with your FIQ code.
12105 + */
12106 +struct fiq_ipc fiq_ipc;
12107 +EXPORT_SYMBOL(fiq_ipc);
12108 +
12109 +#define DIVISOR_FROM_US(x) ((x) << 1)
12110 +
12111 +#define FIQ_DIVISOR_VIBRATOR DIVISOR_FROM_US(100)
12112 +
12113 +#ifdef CONFIG_GTA02_HDQ
12114 +/* HDQ specific */
12115 +#define HDQ_SAMPLE_PERIOD_US 20
12116 +/* private HDQ FSM state -- all other info interesting for caller in fiq_ipc */
12117 +static enum hdq_bitbang_states hdq_state;
12118 +static u8 hdq_ctr;
12119 +static u8 hdq_ctr2;
12120 +static u8 hdq_bit;
12121 +static u8 hdq_shifter;
12122 +static u8 hdq_tx_data_done;
12123 +
12124 +#define FIQ_DIVISOR_HDQ DIVISOR_FROM_US(HDQ_SAMPLE_PERIOD_US)
12125 +#endif
12126 +/* define FIQ ISR */
12127 +
12128 +FIQ_HANDLER_START()
12129 +/* define your locals here -- no initializers though */
12130 + u16 divisor;
12131 +FIQ_HANDLER_ENTRY(256, 512)
12132 +/* Your ISR here :-) */
12133 + divisor = 0xffff;
12134 +
12135 + /* Vibrator servicing */
12136 +
12137 + if (fiq_ipc.vib_pwm_latched || fiq_ipc.vib_pwm) { /* not idle */
12138 + if (((u8)_fiq_count_fiqs) == fiq_ipc.vib_pwm_latched)
12139 + neo1973_gpb_setpin(fiq_ipc.vib_gpio_pin, 0);
12140 + if (((u8)_fiq_count_fiqs) == 0) {
12141 + fiq_ipc.vib_pwm_latched = fiq_ipc.vib_pwm;
12142 + if (fiq_ipc.vib_pwm_latched)
12143 + neo1973_gpb_setpin(fiq_ipc.vib_gpio_pin, 1);
12144 + }
12145 + divisor = FIQ_DIVISOR_VIBRATOR;
12146 + }
12147 +
12148 +#ifdef CONFIG_GTA02_HDQ
12149 + /* HDQ servicing */
12150 +
12151 + switch (hdq_state) {
12152 + case HDQB_IDLE:
12153 + if (fiq_ipc.hdq_request_ctr == fiq_ipc.hdq_transaction_ctr)
12154 + break;
12155 + hdq_ctr = 210 / HDQ_SAMPLE_PERIOD_US;
12156 + s3c2410_gpio_setpin(fiq_ipc.hdq_gpio_pin, 0);
12157 + s3c2410_gpio_cfgpin(fiq_ipc.hdq_gpio_pin, S3C2410_GPIO_OUTPUT);
12158 + hdq_tx_data_done = 0;
12159 + hdq_state = HDQB_TX_BREAK;
12160 + break;
12161 +
12162 + case HDQB_TX_BREAK: /* issue low for > 190us */
12163 + if (--hdq_ctr == 0) {
12164 + hdq_ctr = 60 / HDQ_SAMPLE_PERIOD_US;
12165 + hdq_state = HDQB_TX_BREAK_RECOVERY;
12166 + s3c2410_gpio_setpin(fiq_ipc.hdq_gpio_pin, 1);
12167 + }
12168 + break;
12169 +
12170 + case HDQB_TX_BREAK_RECOVERY: /* issue low for > 40us */
12171 + if (--hdq_ctr)
12172 + break;
12173 + hdq_shifter = fiq_ipc.hdq_ads;
12174 + hdq_bit = 8; /* 8 bits of ads / rw */
12175 + hdq_tx_data_done = 0; /* doing ads */
12176 + /* fallthru on last one */
12177 + case HDQB_ADS_CALC:
12178 + if (hdq_shifter & 1)
12179 + hdq_ctr = 50 / HDQ_SAMPLE_PERIOD_US;
12180 + else
12181 + hdq_ctr = 120 / HDQ_SAMPLE_PERIOD_US;
12182 + /* carefully precompute the other phase length */
12183 + hdq_ctr2 = (210 - (hdq_ctr * HDQ_SAMPLE_PERIOD_US)) /
12184 + HDQ_SAMPLE_PERIOD_US;
12185 + hdq_state = HDQB_ADS_LOW;
12186 + hdq_shifter >>= 1;
12187 + hdq_bit--;
12188 + s3c2410_gpio_setpin(fiq_ipc.hdq_gpio_pin, 0);
12189 + break;
12190 +
12191 + case HDQB_ADS_LOW:
12192 + if (--hdq_ctr)
12193 + break;
12194 + s3c2410_gpio_setpin(fiq_ipc.hdq_gpio_pin, 1);
12195 + hdq_state = HDQB_ADS_HIGH;
12196 + break;
12197 +
12198 + case HDQB_ADS_HIGH:
12199 + if (--hdq_ctr2 > 1) /* account for HDQB_ADS_CALC */
12200 + break;
12201 + if (hdq_bit) { /* more bits to do */
12202 + hdq_state = HDQB_ADS_CALC;
12203 + break;
12204 + }
12205 + /* no more bits, wait it out until hdq_ctr2 exhausted */
12206 + if (hdq_ctr2)
12207 + break;
12208 + /* ok no more bits and very last state */
12209 + hdq_ctr = 60 / HDQ_SAMPLE_PERIOD_US;
12210 + /* FIXME 0 = read */
12211 + if (fiq_ipc.hdq_ads & 0x80) { /* write the byte out */
12212 + /* set delay before payload */
12213 + hdq_ctr = 300 / HDQ_SAMPLE_PERIOD_US;
12214 + /* already high, no need to write */
12215 + hdq_state = HDQB_WAIT_TX;
12216 + break;
12217 + }
12218 + /* read the next byte */
12219 + hdq_bit = 8; /* 8 bits of data */
12220 + hdq_ctr = 3000 / HDQ_SAMPLE_PERIOD_US;
12221 + hdq_state = HDQB_WAIT_RX;
12222 + s3c2410_gpio_cfgpin(fiq_ipc.hdq_gpio_pin, S3C2410_GPIO_INPUT);
12223 + break;
12224 +
12225 + case HDQB_WAIT_TX: /* issue low for > 40us */
12226 + if (--hdq_ctr)
12227 + break;
12228 + if (!hdq_tx_data_done) { /* was that the data sent? */
12229 + hdq_tx_data_done++;
12230 + hdq_shifter = fiq_ipc.hdq_tx_data;
12231 + hdq_bit = 8; /* 8 bits of data */
12232 + hdq_state = HDQB_ADS_CALC; /* start sending */
12233 + break;
12234 + }
12235 + fiq_ipc.hdq_error = 0;
12236 + fiq_ipc.hdq_transaction_ctr++;
12237 + hdq_state = HDQB_IDLE; /* all tx is done */
12238 + /* idle in input mode, it's pulled up by 10K */
12239 + s3c2410_gpio_cfgpin(fiq_ipc.hdq_gpio_pin, S3C2410_GPIO_INPUT);
12240 + break;
12241 +
12242 + case HDQB_WAIT_RX: /* wait for battery to talk to us */
12243 + if (s3c2410_gpio_getpin(fiq_ipc.hdq_gpio_pin) == 0) {
12244 + /* it talks to us! */
12245 + hdq_ctr2 = 1;
12246 + hdq_bit = 8; /* 8 bits of data */
12247 + /* timeout */
12248 + hdq_ctr = 300 / HDQ_SAMPLE_PERIOD_US;
12249 + hdq_state = HDQB_DATA_RX_LOW;
12250 + break;
12251 + }
12252 + if (--hdq_ctr == 0) { /* timed out, error */
12253 + fiq_ipc.hdq_error = 1;
12254 + fiq_ipc.hdq_transaction_ctr++;
12255 + hdq_state = HDQB_IDLE; /* abort */
12256 + }
12257 + break;
12258 +
12259 + /*
12260 + * HDQ basically works by measuring the low time of the bit cell
12261 + * 32-50us --> '1', 80 - 145us --> '0'
12262 + */
12263 +
12264 + case HDQB_DATA_RX_LOW:
12265 + if (s3c2410_gpio_getpin(fiq_ipc.hdq_gpio_pin)) {
12266 + fiq_ipc.hdq_rx_data >>= 1;
12267 + if (hdq_ctr2 <= (65 / HDQ_SAMPLE_PERIOD_US))
12268 + fiq_ipc.hdq_rx_data |= 0x80;
12269 +
12270 + if (--hdq_bit == 0) {
12271 + fiq_ipc.hdq_error = 0;
12272 + fiq_ipc.hdq_transaction_ctr++; /* done */
12273 + hdq_state = HDQB_IDLE;
12274 + } else
12275 + hdq_state = HDQB_DATA_RX_HIGH;
12276 + /* timeout */
12277 + hdq_ctr = 1000 / HDQ_SAMPLE_PERIOD_US;
12278 + hdq_ctr2 = 1;
12279 + break;
12280 + }
12281 + hdq_ctr2++;
12282 + if (--hdq_ctr)
12283 + break;
12284 + /* timed out, error */
12285 + fiq_ipc.hdq_error = 2;
12286 + fiq_ipc.hdq_transaction_ctr++;
12287 + hdq_state = HDQB_IDLE; /* abort */
12288 + break;
12289 +
12290 + case HDQB_DATA_RX_HIGH:
12291 + if (!s3c2410_gpio_getpin(fiq_ipc.hdq_gpio_pin)) {
12292 + /* it talks to us! */
12293 + hdq_ctr2 = 1;
12294 + /* timeout */
12295 + hdq_ctr = 400 / HDQ_SAMPLE_PERIOD_US;
12296 + hdq_state = HDQB_DATA_RX_LOW;
12297 + break;
12298 + }
12299 + if (--hdq_ctr)
12300 + break;
12301 + /* timed out, error */
12302 + fiq_ipc.hdq_error = 3;
12303 + fiq_ipc.hdq_transaction_ctr++;
12304 + /* we're in input mode already */
12305 + hdq_state = HDQB_IDLE; /* abort */
12306 + break;
12307 + }
12308 +
12309 + if (hdq_state != HDQB_IDLE) /* ie, not idle */
12310 + if (divisor > FIQ_DIVISOR_HDQ)
12311 + divisor = FIQ_DIVISOR_HDQ; /* keep us going */
12312 +#endif
12313 +
12314 + /* disable further timer interrupts if nobody has any work
12315 + * or adjust rate according to who still has work
12316 + *
12317 + * CAUTION: it means forground code must disable FIQ around
12318 + * its own non-atomic S3C2410_INTMSK changes... not common
12319 + * thankfully and taken care of by the fiq-basis patch
12320 + */
12321 + if (divisor == 0xffff) /* mask the fiq irq source */
12322 + __raw_writel(__raw_readl(S3C2410_INTMSK) | _fiq_ack_mask,
12323 + S3C2410_INTMSK);
12324 + else /* still working, maybe at a different rate */
12325 + __raw_writel(divisor, S3C2410_TCNTB(_fiq_timer_index));
12326 + _fiq_timer_divisor = divisor;
12327 +
12328 +FIQ_HANDLER_END()
12329 +
12330 +
12331 +/*
12332 + * this gets called every 1ms when we paniced.
12333 + */
12334 +
12335 +static long gta02_panic_blink(long count)
12336 +{
12337 + long delay = 0;
12338 + static long last_blink;
12339 + static char led;
12340 +
12341 + if (count - last_blink < 100) /* 200ms period, fast blink */
12342 + return 0;
12343 +
12344 + led ^= 1;
12345 + s3c2410_gpio_cfgpin(GTA02_GPIO_AUX_LED, S3C2410_GPIO_OUTPUT);
12346 + neo1973_gpb_setpin(GTA02_GPIO_AUX_LED, led);
12347 +
12348 + last_blink = count;
12349 + return delay;
12350 +}
12351 +
12352 +
12353 +/**
12354 + * returns PCB revision information in b9,b8 and b2,b1,b0
12355 + * Pre-GTA02 A6 returns 0x000
12356 + * GTA02 A6 returns 0x101
12357 + * ...
12358 + */
12359 +
12360 +int gta02_get_pcb_revision(void)
12361 +{
12362 + int n;
12363 + int u = 0;
12364 + static unsigned long pinlist[] = {
12365 + GTA02_PCB_ID1_0,
12366 + GTA02_PCB_ID1_1,
12367 + GTA02_PCB_ID1_2,
12368 + GTA02_PCB_ID2_0,
12369 + GTA02_PCB_ID2_1,
12370 + };
12371 + static int pin_offset[] = {
12372 + 0, 1, 2, 8, 9
12373 + };
12374 +
12375 + for (n = 0 ; n < ARRAY_SIZE(pinlist); n++) {
12376 + /*
12377 + * set the PCB version GPIO to be pulled-down input
12378 + * force low briefly first
12379 + */
12380 + s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_OUTPUT);
12381 + s3c2410_gpio_setpin(pinlist[n], 0);
12382 + /* misnomer: it is a pullDOWN in 2442 */
12383 + s3c2410_gpio_pullup(pinlist[n], 1);
12384 + s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_INPUT);
12385 +
12386 + udelay(10);
12387 +
12388 + if (s3c2410_gpio_getpin(pinlist[n]))
12389 + u |= 1 << pin_offset[n];
12390 +
12391 + /*
12392 + * when not being interrogated, all of the revision GPIO
12393 + * are set to output HIGH without pulldown so no current flows
12394 + * if they are NC or pulled up.
12395 + */
12396 + s3c2410_gpio_setpin(pinlist[n], 1);
12397 + s3c2410_gpio_cfgpin(pinlist[n], S3C2410_GPIO_OUTPUT);
12398 + /* misnomer: it is a pullDOWN in 2442 */
12399 + s3c2410_gpio_pullup(pinlist[n], 0);
12400 + }
12401 +
12402 + return u;
12403 +}
12404 +
12405 +struct platform_device gta02_version_device = {
12406 + .name = "neo1973-version",
12407 + .num_resources = 0,
12408 +};
12409 +
12410 +struct platform_device gta02_resume_reason_device = {
12411 + .name = "neo1973-resume",
12412 + .num_resources = 0,
12413 +};
12414 +
12415 +struct platform_device gta02_memconfig_device = {
12416 + .name = "neo1973-memconfig",
12417 + .num_resources = 0,
12418 +};
12419 +
12420 +static struct map_desc gta02_iodesc[] __initdata = {
12421 + {
12422 + .virtual = 0xe0000000,
12423 + .pfn = __phys_to_pfn(S3C2410_CS3+0x01000000),
12424 + .length = SZ_1M,
12425 + .type = MT_DEVICE
12426 + },
12427 +};
12428 +
12429 +#define UCON S3C2410_UCON_DEFAULT
12430 +#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
12431 +#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
12432 +
12433 +static struct s3c2410_uartcfg gta02_uartcfgs[] = {
12434 + [0] = {
12435 + .hwport = 0,
12436 + .flags = 0,
12437 + .ucon = UCON,
12438 + .ulcon = ULCON,
12439 + .ufcon = UFCON,
12440 + },
12441 + [1] = {
12442 + .hwport = 1,
12443 + .flags = 0,
12444 + .ucon = UCON,
12445 + .ulcon = ULCON,
12446 + .ufcon = UFCON,
12447 + },
12448 + [2] = {
12449 + .hwport = 2,
12450 + .flags = 0,
12451 + .ucon = UCON,
12452 + .ulcon = ULCON,
12453 + .ufcon = UFCON,
12454 + },
12455 +
12456 +};
12457 +
12458 +/* BQ27000 Battery */
12459 +
12460 +static int gta02_get_charger_online_status(void)
12461 +{
12462 + return gta02_charger_online_status;
12463 +}
12464 +
12465 +static int gta02_get_charger_active_status(void)
12466 +{
12467 + return gta02_charger_active_status;
12468 +}
12469 +
12470 +
12471 +struct bq27000_platform_data bq27000_pdata = {
12472 + .name = "bat",
12473 + .rsense_mohms = 20,
12474 + .hdq_read = gta02hdq_read,
12475 + .hdq_write = gta02hdq_write,
12476 + .hdq_initialized = gta02hdq_initialized,
12477 + .get_charger_online_status = gta02_get_charger_online_status,
12478 + .get_charger_active_status = gta02_get_charger_active_status
12479 +};
12480 +
12481 +struct platform_device bq27000_battery_device = {
12482 + .name = "bq27000-battery",
12483 + .dev = {
12484 + .platform_data = &bq27000_pdata,
12485 + },
12486 +};
12487 +
12488 +
12489 +/* PMU driver info */
12490 +
12491 +static int pmu_callback(struct device *dev, unsigned int feature,
12492 + enum pmu_event event)
12493 +{
12494 + switch (feature) {
12495 + case PCF50633_FEAT_MBC:
12496 + switch (event) {
12497 + case PMU_EVT_CHARGER_IDLE:
12498 + gta02_charger_active_status = 0;
12499 + break;
12500 + case PMU_EVT_CHARGER_ACTIVE:
12501 + gta02_charger_active_status = 1;
12502 + break;
12503 + case PMU_EVT_USB_INSERT:
12504 + gta02_charger_online_status = 1;
12505 + break;
12506 + case PMU_EVT_USB_REMOVE:
12507 + gta02_charger_online_status = 0;
12508 + break;
12509 + case PMU_EVT_INSERT: /* adapter is unsused */
12510 + case PMU_EVT_REMOVE: /* adapter is unused */
12511 + break;
12512 + default:
12513 + break;
12514 + }
12515 + break;
12516 + default:
12517 + break;
12518 + }
12519 +
12520 + bq27000_charging_state_change(&bq27000_battery_device);
12521 + return 0;
12522 +}
12523 +
12524 +static struct platform_device gta01_pm_gps_dev = {
12525 + .name = "neo1973-pm-gps",
12526 +};
12527 +
12528 +static struct platform_device gta01_pm_bt_dev = {
12529 + .name = "neo1973-pm-bt",
12530 +};
12531 +
12532 +/* this is called when pc50633 is probed, unfortunately quite late in the
12533 + * day since it is an I2C bus device. Here we can belatedly define some
12534 + * platform devices with the advantage that we can mark the pcf50633 as the
12535 + * parent. This makes them get suspended and resumed with their parent
12536 + * the pcf50633 still around.
12537 + */
12538 +
12539 +static void gta02_pcf50633_attach_child_devices(struct device *parent_device)
12540 +{
12541 + gta01_pm_gps_dev.dev.parent = parent_device;
12542 + gta01_pm_bt_dev.dev.parent = parent_device;
12543 + platform_device_register(&gta01_pm_bt_dev);
12544 + platform_device_register(&gta01_pm_gps_dev);
12545 +}
12546 +
12547 +static struct pcf50633_platform_data gta02_pcf_pdata = {
12548 + .used_features = PCF50633_FEAT_MBC |
12549 + PCF50633_FEAT_BBC |
12550 + PCF50633_FEAT_RTC |
12551 + PCF50633_FEAT_CHGCUR |
12552 + PCF50633_FEAT_BATVOLT |
12553 + PCF50633_FEAT_BATTEMP |
12554 + PCF50633_FEAT_PWM_BL,
12555 + .onkey_seconds_sig_init = 4,
12556 + .onkey_seconds_shutdown = 8,
12557 + .cb = &pmu_callback,
12558 + .r_fix_batt = 10000,
12559 + .r_fix_batt_par = 10000,
12560 + .r_sense_milli = 220,
12561 + .flag_use_apm_emulation = 0,
12562 + .resumers = {
12563 + [0] = PCF50633_INT1_USBINS |
12564 + PCF50633_INT1_USBREM |
12565 + PCF50633_INT1_ALARM,
12566 + [1] = PCF50633_INT2_ONKEYF,
12567 + [2] = PCF50633_INT3_ONKEY1S
12568 + },
12569 + /* warning: these get rewritten during machine init below
12570 + * depending on pcb variant
12571 + */
12572 + .rails = {
12573 + [PCF50633_REGULATOR_AUTO] = {
12574 + .name = "io_3v3",
12575 + .flags = PMU_VRAIL_F_SUSPEND_ON,
12576 + .voltage = {
12577 + .init = 3300,
12578 + .max = 3300,
12579 + },
12580 + },
12581 + [PCF50633_REGULATOR_DOWN1] = {
12582 + .name = "core_1v3",
12583 + /* Wow, when we are going into suspend, after pcf50633
12584 + * runs its suspend (which happens real early since it
12585 + * is an i2c device) we are running out of the 22uF cap
12586 + * on core_1v3 rail !!!!
12587 + */
12588 + .voltage = {
12589 + .init = 1300,
12590 + .max = 1600,
12591 + },
12592 + },
12593 + [PCF50633_REGULATOR_DOWN2] = {
12594 + .name = "core_1v8",
12595 + .flags = PMU_VRAIL_F_SUSPEND_ON,
12596 + .voltage = {
12597 + .init = 1800,
12598 + .max = 1800,
12599 + },
12600 + },
12601 + [PCF50633_REGULATOR_HCLDO] = {
12602 + .name = "sd_3v3",
12603 + .voltage = {
12604 + .init = 2000,
12605 + .max = 3300,
12606 + },
12607 + },
12608 + [PCF50633_REGULATOR_LDO1] = {
12609 + .name = "gsensor_3v3",
12610 + .voltage = {
12611 + .init = 1300,
12612 + .max = 1330,
12613 + },
12614 + },
12615 + [PCF50633_REGULATOR_LDO2] = {
12616 + .name = "codec_3v3",
12617 + .voltage = {
12618 + .init = 3300,
12619 + .max = 3300,
12620 + },
12621 + },
12622 + [PCF50633_REGULATOR_LDO3] = {
12623 + .name = "unused3",
12624 + .voltage = {
12625 + .init = 3000,
12626 + .max = 3000,
12627 + },
12628 + },
12629 + [PCF50633_REGULATOR_LDO4] = {
12630 + .name = "bt_3v2",
12631 + .voltage = {
12632 + .init = 2500,
12633 + .max = 3300,
12634 + },
12635 + },
12636 + [PCF50633_REGULATOR_LDO5] = {
12637 + .name = "rf3v",
12638 + .voltage = {
12639 + .init = 1500,
12640 + .max = 1500,
12641 + },
12642 + },
12643 + [PCF50633_REGULATOR_LDO6] = {
12644 + .name = "lcm_3v",
12645 + .flags = PMU_VRAIL_F_SUSPEND_ON,
12646 + .voltage = {
12647 + .init = 0,
12648 + .max = 3300,
12649 + },
12650 + },
12651 + [PCF50633_REGULATOR_MEMLDO] = {
12652 + .name = "memldo",
12653 + .flags = PMU_VRAIL_F_SUSPEND_ON,
12654 + .voltage = {
12655 + .init = 1800,
12656 + .max = 1800,
12657 + },
12658 + },
12659 + },
12660 + .defer_resume_backlight = 1,
12661 + .resume_backlight_ramp_speed = 5,
12662 + .attach_child_devices = gta02_pcf50633_attach_child_devices
12663 +
12664 +};
12665 +
12666 +#if 0 /* currently unused */
12667 +static void cfg_pmu_vrail(struct pmu_voltage_rail *vrail, char *name,
12668 + unsigned int flags, unsigned int init,
12669 + unsigned int max)
12670 +{
12671 + vrail->name = name;
12672 + vrail->flags = flags;
12673 + vrail->voltage.init = init;
12674 + vrail->voltage.max = max;
12675 +}
12676 +#endif
12677 +
12678 +static void mangle_pmu_pdata_by_system_rev(void)
12679 +{
12680 + switch (system_rev) {
12681 + case GTA02v1_SYSTEM_REV:
12682 + /* FIXME: this is only in v1 due to wrong PMU variant */
12683 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].flags =
12684 + PMU_VRAIL_F_SUSPEND_ON;
12685 + break;
12686 + case GTA02v2_SYSTEM_REV:
12687 + case GTA02v3_SYSTEM_REV:
12688 + case GTA02v4_SYSTEM_REV:
12689 + case GTA02v5_SYSTEM_REV:
12690 + case GTA02v6_SYSTEM_REV:
12691 + /* we need to keep the 1.8V going since this is the SDRAM
12692 + * self-refresh voltage */
12693 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].flags =
12694 + PMU_VRAIL_F_SUSPEND_ON;
12695 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_DOWN2].name =
12696 + "io_1v8",
12697 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].name =
12698 + "gsensor_3v3",
12699 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].voltage.init =
12700 + 3300;
12701 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].voltage.max =
12702 + 3300;
12703 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO1].flags &=
12704 + ~PMU_VRAIL_F_SUSPEND_ON;
12705 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO3].flags =
12706 + PMU_VRAIL_F_UNUSED;
12707 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO5] = ((struct pmu_voltage_rail) {
12708 + .name = "rf_3v",
12709 + .voltage = {
12710 + .init = 0,
12711 + .max = 3000,
12712 + }
12713 + });
12714 + gta02_pcf_pdata.rails[PCF50633_REGULATOR_LDO6] =
12715 + ((struct pmu_voltage_rail) {
12716 + .name = "lcm_3v",
12717 + .flags = PMU_VRAIL_F_SUSPEND_ON,
12718 + .voltage = {
12719 + .init = 3000,
12720 + .max = 3000,
12721 + }
12722 + });
12723 + break;
12724 + default:
12725 + break;
12726 + }
12727 +}
12728 +
12729 +static struct resource gta02_pmu_resources[] = {
12730 + [0] = {
12731 + .flags = IORESOURCE_IRQ,
12732 + .start = GTA02_IRQ_PCF50633,
12733 + .end = GTA02_IRQ_PCF50633,
12734 + },
12735 +};
12736 +
12737 +struct platform_device gta02_pmu_dev = {
12738 + .name = "pcf50633",
12739 + .num_resources = ARRAY_SIZE(gta02_pmu_resources),
12740 + .resource = gta02_pmu_resources,
12741 + .dev = {
12742 + .platform_data = &gta02_pcf_pdata,
12743 + },
12744 +};
12745 +
12746 +/* FIQ */
12747 +
12748 +static struct resource sc32440_fiq_resources[] = {
12749 + [0] = {
12750 + .flags = IORESOURCE_IRQ,
12751 + .start = IRQ_TIMER3,
12752 + .end = IRQ_TIMER3,
12753 + },
12754 +};
12755 +
12756 +struct platform_device sc32440_fiq_device = {
12757 + .name = "sc32440_fiq",
12758 + .num_resources = 1,
12759 + .resource = sc32440_fiq_resources,
12760 +};
12761 +
12762 +#ifdef CONFIG_GTA02_HDQ
12763 +/* HDQ */
12764 +
12765 +static struct resource gta02_hdq_resources[] = {
12766 + [0] = {
12767 + .start = GTA02v5_GPIO_HDQ,
12768 + .end = GTA02v5_GPIO_HDQ,
12769 + },
12770 +};
12771 +
12772 +struct platform_device gta02_hdq_device = {
12773 + .name = "gta02-hdq",
12774 + .num_resources = 1,
12775 + .resource = gta02_hdq_resources,
12776 +};
12777 +#endif
12778 +
12779 +
12780 +/* NOR Flash */
12781 +
12782 +#define GTA02_FLASH_BASE 0x18000000 /* GCS3 */
12783 +#define GTA02_FLASH_SIZE 0x200000 /* 2MBytes */
12784 +
12785 +static struct physmap_flash_data gta02_nor_flash_data = {
12786 + .width = 2,
12787 +};
12788 +
12789 +static struct resource gta02_nor_flash_resource = {
12790 + .start = GTA02_FLASH_BASE,
12791 + .end = GTA02_FLASH_BASE + GTA02_FLASH_SIZE - 1,
12792 + .flags = IORESOURCE_MEM,
12793 +};
12794 +
12795 +static struct platform_device gta02_nor_flash = {
12796 + .name = "physmap-flash",
12797 + .id = 0,
12798 + .dev = {
12799 + .platform_data = &gta02_nor_flash_data,
12800 + },
12801 + .resource = &gta02_nor_flash_resource,
12802 + .num_resources = 1,
12803 +};
12804 +
12805 +
12806 +
12807 +static struct resource gta02_sdio_resources[] = {
12808 + [0] = {
12809 + .flags = IORESOURCE_IRQ,
12810 + .start = IRQ_SDI,
12811 + .end = IRQ_SDI,
12812 + },
12813 + [1] = {
12814 + .flags = IORESOURCE_MEM,
12815 + .start = S3C2410_PA_SDI,
12816 + .end = S3C2410_PA_SDI + S3C24XX_SZ_SDI - 1,
12817 + },
12818 + [2] = {
12819 + .flags = IORESOURCE_DMA,
12820 + .start = 0, /* Channel 0 for SDI */
12821 + .end = 0,
12822 + },
12823 +};
12824 +
12825 +
12826 +static struct platform_device gta02_sdio_dev = {
12827 + .name = "s3c24xx-sdio",
12828 + .id = -1,
12829 + .dev = {
12830 + .coherent_dma_mask = 0xffffffff,
12831 + },
12832 + .resource = gta02_sdio_resources,
12833 + .num_resources = ARRAY_SIZE(gta02_sdio_resources),
12834 +};
12835 +
12836 +struct platform_device s3c24xx_pwm_device = {
12837 + .name = "s3c24xx_pwm",
12838 + .num_resources = 0,
12839 +};
12840 +
12841 +
12842 +static struct platform_device *gta02_devices[] __initdata = {
12843 + &s3c_device_usb,
12844 + &s3c_device_wdt,
12845 + &s3c_device_i2c,
12846 + &s3c_device_iis,
12847 + // &s3c_device_sdi, /* FIXME: temporary disable to avoid s3cmci bind */
12848 + &s3c_device_usbgadget,
12849 + &s3c_device_nand,
12850 + &s3c_device_ts,
12851 + &gta02_nor_flash,
12852 + &sc32440_fiq_device,
12853 + &gta02_version_device,
12854 + &gta02_memconfig_device,
12855 + &gta02_resume_reason_device,
12856 + &s3c24xx_pwm_device,
12857 +
12858 +};
12859 +
12860 +static struct s3c2410_nand_set gta02_nand_sets[] = {
12861 + [0] = {
12862 + .name = "neo1973-nand",
12863 + .nr_chips = 1,
12864 + .flags = S3C2410_NAND_BBT,
12865 + },
12866 +};
12867 +
12868 +/* choose a set of timings derived from S3C@2442B MCP54
12869 + * data sheet (K5D2G13ACM-D075 MCP Memory)
12870 + */
12871 +
12872 +static struct s3c2410_platform_nand gta02_nand_info = {
12873 + .tacls = 0,
12874 + .twrph0 = 25,
12875 + .twrph1 = 15,
12876 + .nr_sets = ARRAY_SIZE(gta02_nand_sets),
12877 + .sets = gta02_nand_sets,
12878 + .software_ecc = 1,
12879 +};
12880 +
12881 +static struct s3c24xx_mci_pdata gta02_mmc_cfg = {
12882 + .gpio_detect = GTA02v1_GPIO_nSD_DETECT,
12883 + .set_power = NULL,
12884 + .ocr_avail = MMC_VDD_32_33,
12885 +};
12886 +
12887 +static void gta02_udc_command(enum s3c2410_udc_cmd_e cmd)
12888 +{
12889 + printk(KERN_DEBUG "%s(%d)\n", __func__, cmd);
12890 +
12891 + switch (cmd) {
12892 + case S3C2410_UDC_P_ENABLE:
12893 + neo1973_gpb_setpin(GTA02_GPIO_USB_PULLUP, 1);
12894 + break;
12895 + case S3C2410_UDC_P_DISABLE:
12896 + neo1973_gpb_setpin(GTA02_GPIO_USB_PULLUP, 0);
12897 + break;
12898 + case S3C2410_UDC_P_RESET:
12899 + /* FIXME! */
12900 + break;
12901 + default:
12902 + break;
12903 + }
12904 +}
12905 +
12906 +/* get PMU to set USB current limit accordingly */
12907 +
12908 +static void gta02_udc_vbus_draw(unsigned int ma)
12909 +{
12910 + if (!pcf50633_global)
12911 + return;
12912 +
12913 + pcf50633_notify_usb_current_limit_change(pcf50633_global, ma);
12914 +}
12915 +
12916 +static struct s3c2410_udc_mach_info gta02_udc_cfg = {
12917 + .vbus_draw = gta02_udc_vbus_draw,
12918 + .udc_command = gta02_udc_command,
12919 +
12920 +};
12921 +
12922 +static struct s3c2410_ts_mach_info gta02_ts_cfg = {
12923 + .delay = 10000,
12924 + .presc = 50000000 / 1000000, /* 50 MHz PCLK / 1MHz */
12925 + /* simple averaging, 2^n samples */
12926 + .oversampling_shift = 5,
12927 + /* averaging filter length, 2^n */
12928 + .excursion_filter_len_bits = 5,
12929 + /* flagged for beauty contest on next sample if differs from
12930 + * average more than this
12931 + */
12932 + .reject_threshold_vs_avg = 2,
12933 +};
12934 +
12935 +
12936 +/* SPI: LCM control interface attached to Glamo3362 */
12937 +
12938 +static void gta02_jbt6k74_reset(int devidx, int level)
12939 +{
12940 + glamo_lcm_reset(level);
12941 +}
12942 +
12943 +/* finally bring up deferred backlight resume now LCM is resumed itself */
12944 +
12945 +static void gta02_jbt6k74_resuming(int devidx)
12946 +{
12947 + pcf50633_backlight_resume(pcf50633_global);
12948 +}
12949 +
12950 +static int gta02_jbt6k74_all_dependencies_resumed(int devidx)
12951 +{
12952 + if (!resume_dep_jbt_pcf.called_flag)
12953 + return 0;
12954 +
12955 + if (!resume_dep_jbt_glamo.called_flag)
12956 + return 0;
12957 +
12958 + return 1;
12959 +}
12960 +
12961 +/* register jbt resume action to be dependent on pcf50633 and glamo resume */
12962 +
12963 +static void gta02_jbt6k74_suspending(int devindex, struct spi_device *spi)
12964 +{
12965 + void jbt6k74_resume(void *spi); /* little white lies about types */
12966 +
12967 + resume_dep_jbt_pcf.callback = jbt6k74_resume;
12968 + resume_dep_jbt_pcf.context = (void *)spi;
12969 + pcf50633_register_resume_dependency(pcf50633_global,
12970 + &resume_dep_jbt_pcf);
12971 + resume_dep_jbt_glamo.callback = jbt6k74_resume;
12972 + resume_dep_jbt_glamo.context = (void *)spi;
12973 + glamo_register_resume_dependency(&resume_dep_jbt_glamo);
12974 +}
12975 +
12976 +
12977 +const struct jbt6k74_platform_data jbt6k74_pdata = {
12978 + .reset = gta02_jbt6k74_reset,
12979 + .resuming = gta02_jbt6k74_resuming,
12980 + .suspending = gta02_jbt6k74_suspending,
12981 + .all_dependencies_resumed = gta02_jbt6k74_all_dependencies_resumed,
12982 +};
12983 +
12984 +static struct spi_board_info gta02_spi_board_info[] = {
12985 + {
12986 + .modalias = "jbt6k74",
12987 + /* platform_data */
12988 + .platform_data = &jbt6k74_pdata,
12989 + /* controller_data */
12990 + /* irq */
12991 + .max_speed_hz = 10 * 1000 * 1000,
12992 + .bus_num = 2,
12993 + /* chip_select */
12994 + },
12995 +};
12996 +
12997 +#if 0 /* currently this is not used and we use gpio spi */
12998 +static struct glamo_spi_info glamo_spi_cfg = {
12999 + .board_size = ARRAY_SIZE(gta02_spi_board_info),
13000 + .board_info = gta02_spi_board_info,
13001 +};
13002 +#endif /* 0 */
13003 +
13004 +static struct glamo_spigpio_info glamo_spigpio_cfg = {
13005 + .pin_clk = GLAMO_GPIO10_OUTPUT,
13006 + .pin_mosi = GLAMO_GPIO11_OUTPUT,
13007 + .pin_cs = GLAMO_GPIO12_OUTPUT,
13008 + .pin_miso = 0,
13009 + .board_size = ARRAY_SIZE(gta02_spi_board_info),
13010 + .board_info = gta02_spi_board_info,
13011 +};
13012 +
13013 +static struct resource gta02_vibrator_resources[] = {
13014 + [0] = {
13015 + .start = GTA02_GPIO_VIBRATOR_ON,
13016 + .end = GTA02_GPIO_VIBRATOR_ON,
13017 + },
13018 +};
13019 +
13020 +static struct platform_device gta02_vibrator_dev = {
13021 + .name = "neo1973-vibrator",
13022 + .num_resources = ARRAY_SIZE(gta02_vibrator_resources),
13023 + .resource = gta02_vibrator_resources,
13024 +};
13025 +
13026 +/* SPI: Accelerometers attached to SPI of s3c244x */
13027 +
13028 +/*
13029 + * Situation is that Linux SPI can't work in an interrupt context, so we
13030 + * implement our own bitbang here. Arbitration is needed because not only
13031 + * can this interrupt happen at any time even if foreground wants to use
13032 + * the bitbang API from Linux, but multiple motion sensors can be on the
13033 + * same SPI bus, and multiple interrupts can happen.
13034 + *
13035 + * Foreground / interrupt arbitration is okay because the interrupts are
13036 + * disabled around all the foreground SPI code.
13037 + *
13038 + * Interrupt / Interrupt arbitration is evidently needed, otherwise we
13039 + * lose edge-triggered service after a while due to the two sensors sharing
13040 + * the SPI bus having irqs at the same time eventually.
13041 + *
13042 + * Servicing is typ 75 - 100us at 400MHz.
13043 + */
13044 +
13045 +/* #define DEBUG_SPEW_MS */
13046 +
13047 +struct lis302dl_platform_data lis302_pdata_top;
13048 +struct lis302dl_platform_data lis302_pdata_bottom;
13049 +
13050 +/*
13051 + * generic SPI RX and TX bitbang
13052 + * only call with interrupts off!
13053 + */
13054 +
13055 +static void gta02_lis302dl_bitbang(struct lis302dl_info *lis, u8 *tx,
13056 + int tx_bytes, u8 *rx, int rx_bytes)
13057 +{
13058 + struct lis302dl_platform_data *pdata = lis->pdata;
13059 + int n;
13060 + u8 shifter = 0;
13061 + unsigned long other_cs;
13062 +
13063 + /*
13064 + * Huh.. "quirk"... CS on this device is not really "CS" like you can
13065 + * expect. Instead when 1 it selects I2C interface mode. Because we
13066 + * have 2 devices on one interface, the "disabled" device when we talk
13067 + * to an "enabled" device sees the clocks as I2C clocks, creating
13068 + * havoc.
13069 + *
13070 + * I2C sees MOSI going LOW while CLK HIGH as a START action, we must
13071 + * ensure this is never issued.
13072 + */
13073 +
13074 + if (&lis302_pdata_top == pdata)
13075 + other_cs = lis302_pdata_bottom.pin_chip_select;
13076 + else
13077 + other_cs = lis302_pdata_top.pin_chip_select;
13078 +
13079 + s3c2410_gpio_setpin(other_cs, 1);
13080 + s3c2410_gpio_setpin(pdata->pin_chip_select, 1);
13081 + s3c2410_gpio_setpin(pdata->pin_clk, 1);
13082 + s3c2410_gpio_setpin(pdata->pin_chip_select, 0);
13083 +
13084 + /* send the register index, r/w and autoinc bits */
13085 + for (n = 0; n < (tx_bytes << 3); n++) {
13086 + if (!(n & 7))
13087 + shifter = tx[n >> 3];
13088 + s3c2410_gpio_setpin(pdata->pin_clk, 0);
13089 + s3c2410_gpio_setpin(pdata->pin_mosi, (shifter >> 7) & 1);
13090 + s3c2410_gpio_setpin(pdata->pin_clk, 0);
13091 + s3c2410_gpio_setpin(pdata->pin_clk, 1);
13092 + s3c2410_gpio_setpin(pdata->pin_clk, 1);
13093 + shifter <<= 1;
13094 + }
13095 +
13096 + for (n = 0; n < (rx_bytes << 3); n++) { /* 8 bits each */
13097 + s3c2410_gpio_setpin(pdata->pin_clk, 0);
13098 + s3c2410_gpio_setpin(pdata->pin_clk, 0);
13099 + shifter <<= 1;
13100 + if (s3c2410_gpio_getpin(pdata->pin_miso))
13101 + shifter |= 1;
13102 + if ((n & 7) == 7)
13103 + rx[n >> 3] = shifter;
13104 + s3c2410_gpio_setpin(pdata->pin_clk, 1);
13105 + s3c2410_gpio_setpin(pdata->pin_clk, 1);
13106 + }
13107 + s3c2410_gpio_setpin(pdata->pin_chip_select, 1);
13108 + s3c2410_gpio_setpin(other_cs, 1);
13109 +}
13110 +
13111 +
13112 +static int gta02_lis302dl_bitbang_read_reg(struct lis302dl_info *lis, u8 reg)
13113 +{
13114 + u8 data = 0xc0 | reg; /* read, autoincrement */
13115 + unsigned long flags;
13116 +
13117 + local_irq_save(flags);
13118 +
13119 + gta02_lis302dl_bitbang(lis, &data, 1, &data, 1);
13120 +
13121 + local_irq_restore(flags);
13122 +
13123 + return data;
13124 +}
13125 +
13126 +static void gta02_lis302dl_bitbang_write_reg(struct lis302dl_info *lis, u8 reg,
13127 + u8 val)
13128 +{
13129 + u8 data[2] = { 0x00 | reg, val }; /* write, no autoincrement */
13130 + unsigned long flags;
13131 +
13132 + local_irq_save(flags);
13133 +
13134 + gta02_lis302dl_bitbang(lis, &data[0], 2, NULL, 0);
13135 +
13136 + local_irq_restore(flags);
13137 +
13138 +}
13139 +
13140 +
13141 +void gta02_lis302dl_suspend_io(struct lis302dl_info *lis, int resume)
13142 +{
13143 + struct lis302dl_platform_data *pdata = lis->pdata;
13144 +
13145 + if (!resume) {
13146 + /*
13147 + * we don't want to power them with a high level
13148 + * because GSENSOR_3V3 is not up during suspend
13149 + */
13150 + s3c2410_gpio_setpin(pdata->pin_chip_select, 0);
13151 + s3c2410_gpio_setpin(pdata->pin_clk, 0);
13152 + s3c2410_gpio_setpin(pdata->pin_mosi, 0);
13153 + /* misnomer: it is a pullDOWN in 2442 */
13154 + s3c2410_gpio_pullup(pdata->pin_miso, 1);
13155 + return;
13156 + }
13157 +
13158 + /* back to normal */
13159 + s3c2410_gpio_setpin(pdata->pin_chip_select, 1);
13160 + s3c2410_gpio_setpin(pdata->pin_clk, 1);
13161 + /* misnomer: it is a pullDOWN in 2442 */
13162 + s3c2410_gpio_pullup(pdata->pin_miso, 0);
13163 +
13164 + s3c2410_gpio_cfgpin(pdata->pin_chip_select, S3C2410_GPIO_OUTPUT);
13165 + s3c2410_gpio_cfgpin(pdata->pin_clk, S3C2410_GPIO_OUTPUT);
13166 + s3c2410_gpio_cfgpin(pdata->pin_mosi, S3C2410_GPIO_OUTPUT);
13167 + s3c2410_gpio_cfgpin(pdata->pin_miso, S3C2410_GPIO_INPUT);
13168 +
13169 +}
13170 +
13171 +
13172 +
13173 +struct lis302dl_platform_data lis302_pdata_top = {
13174 + .name = "lis302-1 (top)",
13175 + .pin_chip_select= S3C2410_GPD12,
13176 + .pin_clk = S3C2410_GPG7,
13177 + .pin_mosi = S3C2410_GPG6,
13178 + .pin_miso = S3C2410_GPG5,
13179 + .interrupt = GTA02_IRQ_GSENSOR_1,
13180 + .open_drain = 1, /* altered at runtime by PCB rev */
13181 + .lis302dl_bitbang = gta02_lis302dl_bitbang,
13182 + .lis302dl_bitbang_reg_read = gta02_lis302dl_bitbang_read_reg,
13183 + .lis302dl_bitbang_reg_write = gta02_lis302dl_bitbang_write_reg,
13184 + .lis302dl_suspend_io = gta02_lis302dl_suspend_io,
13185 +};
13186 +
13187 +struct lis302dl_platform_data lis302_pdata_bottom = {
13188 + .name = "lis302-2 (bottom)",
13189 + .pin_chip_select= S3C2410_GPD13,
13190 + .pin_clk = S3C2410_GPG7,
13191 + .pin_mosi = S3C2410_GPG6,
13192 + .pin_miso = S3C2410_GPG5,
13193 + .interrupt = GTA02_IRQ_GSENSOR_2,
13194 + .open_drain = 1, /* altered at runtime by PCB rev */
13195 + .lis302dl_bitbang = gta02_lis302dl_bitbang,
13196 + .lis302dl_bitbang_reg_read = gta02_lis302dl_bitbang_read_reg,
13197 + .lis302dl_bitbang_reg_write = gta02_lis302dl_bitbang_write_reg,
13198 + .lis302dl_suspend_io = gta02_lis302dl_suspend_io,
13199 +};
13200 +
13201 +
13202 +static struct platform_device s3c_device_spi_acc1 = {
13203 + .name = "lis302dl",
13204 + .id = 1,
13205 + .dev = {
13206 + .platform_data = &lis302_pdata_top,
13207 + },
13208 +};
13209 +
13210 +static struct platform_device s3c_device_spi_acc2 = {
13211 + .name = "lis302dl",
13212 + .id = 2,
13213 + .dev = {
13214 + .platform_data = &lis302_pdata_bottom,
13215 + },
13216 +};
13217 +
13218 +static struct resource gta02_led_resources[] = {
13219 + {
13220 + .name = "gta02-power:orange",
13221 + .start = GTA02_GPIO_PWR_LED1,
13222 + .end = GTA02_GPIO_PWR_LED1,
13223 + }, {
13224 + .name = "gta02-power:blue",
13225 + .start = GTA02_GPIO_PWR_LED2,
13226 + .end = GTA02_GPIO_PWR_LED2,
13227 + }, {
13228 + .name = "gta02-aux:red",
13229 + .start = GTA02_GPIO_AUX_LED,
13230 + .end = GTA02_GPIO_AUX_LED,
13231 + },
13232 +};
13233 +
13234 +struct platform_device gta02_led_dev = {
13235 + .name = "gta02-led",
13236 + .num_resources = ARRAY_SIZE(gta02_led_resources),
13237 + .resource = gta02_led_resources,
13238 +};
13239 +
13240 +static struct resource gta02_button_resources[] = {
13241 + [0] = {
13242 + .start = GTA02_GPIO_AUX_KEY,
13243 + .end = GTA02_GPIO_AUX_KEY,
13244 + },
13245 + [1] = {
13246 + .start = GTA02_GPIO_HOLD_KEY,
13247 + .end = GTA02_GPIO_HOLD_KEY,
13248 + },
13249 + [2] = {
13250 + .start = GTA02_GPIO_JACK_INSERT,
13251 + .end = GTA02_GPIO_JACK_INSERT,
13252 + },
13253 +};
13254 +
13255 +static struct platform_device gta02_button_dev = {
13256 + .name = "neo1973-button",
13257 + .num_resources = ARRAY_SIZE(gta02_button_resources),
13258 + .resource = gta02_button_resources,
13259 +};
13260 +
13261 +static struct platform_device gta02_pm_gsm_dev = {
13262 + .name = "neo1973-pm-gsm",
13263 +};
13264 +
13265 +static struct platform_device gta02_pm_usbhost_dev = {
13266 + .name = "neo1973-pm-host",
13267 +};
13268 +
13269 +
13270 +/* USB */
13271 +static struct s3c2410_hcd_info gta02_usb_info = {
13272 + .port[0] = {
13273 + .flags = S3C_HCDFLG_USED,
13274 + },
13275 + .port[1] = {
13276 + .flags = 0,
13277 + },
13278 +};
13279 +
13280 +static int glamo_irq_is_wired(void)
13281 +{
13282 + int rc;
13283 + int count = 0;
13284 +
13285 + /*
13286 + * GTA02 S-Media IRQs prior to A5 are broken due to a lack of
13287 + * a pullup on the INT# line. Check for the bad behaviour.
13288 + */
13289 + s3c2410_gpio_setpin(S3C2410_GPG4, 0);
13290 + s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_OUTP);
13291 + s3c2410_gpio_cfgpin(S3C2410_GPG4, S3C2410_GPG4_INP);
13292 + /*
13293 + * we force it low ourselves for a moment and resume being input.
13294 + * If there is a pullup, it won't stay low for long. But if the
13295 + * level converter is there as on < A5 revision, the weak keeper
13296 + * on the input of the LC will hold the line low indefinitiely
13297 + */
13298 + do
13299 + rc = s3c2410_gpio_getpin(S3C2410_GPG4);
13300 + while ((!rc) && ((count++) < 10));
13301 + if (rc) { /* it got pulled back up, it's good */
13302 + printk(KERN_INFO "Detected S-Media IRQ# pullup, "
13303 + "enabling interrupt\n");
13304 + return 0;
13305 + } else /* Gah we can't work with this level converter */
13306 + printk(KERN_WARNING "** Detected bad IRQ# circuit found"
13307 + " on pre-A5 GTA02: S-Media interrupt disabled **\n");
13308 + return -ENODEV;
13309 +}
13310 +
13311 +
13312 +static void
13313 +gta02_glamo_mmc_set_power(unsigned char power_mode, unsigned short vdd)
13314 +{
13315 + int mv = 1650;
13316 + int timeout = 500;
13317 +
13318 + printk(KERN_DEBUG "mmc_set_power(power_mode=%u, vdd=%u\n",
13319 + power_mode, vdd);
13320 +
13321 + switch (system_rev) {
13322 + case GTA02v1_SYSTEM_REV:
13323 + case GTA02v2_SYSTEM_REV:
13324 + break;
13325 + case GTA02v3_SYSTEM_REV:
13326 + case GTA02v4_SYSTEM_REV:
13327 + case GTA02v5_SYSTEM_REV:
13328 + case GTA02v6_SYSTEM_REV:
13329 + switch (power_mode) {
13330 + case MMC_POWER_ON:
13331 + case MMC_POWER_UP:
13332 + /* depend on pcf50633 driver init + not suspended */
13333 + while (pcf50633_ready(pcf50633_global) && (timeout--))
13334 + msleep(5);
13335 +
13336 + if (timeout < 0) {
13337 + printk(KERN_ERR"gta02_glamo_mmc_set_power "
13338 + "BAILING on timeout\n");
13339 + return;
13340 + }
13341 + /* select and set the voltage */
13342 + if (vdd > 7)
13343 + mv += 350 + 100 * (vdd - 8);
13344 + printk(KERN_INFO "SD power -> %dmV\n", mv);
13345 + pcf50633_voltage_set(pcf50633_global,
13346 + PCF50633_REGULATOR_HCLDO, mv);
13347 + pcf50633_onoff_set(pcf50633_global,
13348 + PCF50633_REGULATOR_HCLDO, 1);
13349 + break;
13350 + case MMC_POWER_OFF:
13351 + /* power off happens during suspend, when pcf50633 can
13352 + * be already gone and not coming back... just forget
13353 + * the action then because pcf50633 suspend already
13354 + * dealt with it, otherwise we spin forever
13355 + */
13356 + if (pcf50633_ready(pcf50633_global))
13357 + return;
13358 + pcf50633_onoff_set(pcf50633_global,
13359 + PCF50633_REGULATOR_HCLDO, 0);
13360 + break;
13361 + }
13362 + break;
13363 + }
13364 +}
13365 +
13366 +
13367 +static int gta02_glamo_mci_all_dependencies_resumed(struct platform_device *dev)
13368 +{
13369 + return resume_dep_glamo_mci_pcf.called_flag;
13370 +}
13371 +
13372 +/* register jbt resume action to be dependent on pcf50633 and glamo resume */
13373 +
13374 +static void gta02_glamo_mci_suspending(struct platform_device *dev)
13375 +{
13376 + int glamo_mci_resume(struct platform_device *dev);
13377 +
13378 +#if defined(CONFIG_MFD_GLAMO_MCI) && defined(CONFIG_PM)
13379 + resume_dep_glamo_mci_pcf.callback = (void (*)(void *))glamo_mci_resume;
13380 + resume_dep_glamo_mci_pcf.context = (void *)dev;
13381 + pcf50633_register_resume_dependency(pcf50633_global,
13382 + &resume_dep_glamo_mci_pcf);
13383 +#endif
13384 +}
13385 +
13386 +
13387 +
13388 +/* Smedia Glamo 3362 */
13389 +
13390 +/*
13391 + * we crank down SD Card clock dynamically when GPS is powered
13392 + */
13393 +
13394 +static int gta02_glamo_mci_use_slow(void)
13395 +{
13396 + return neo1973_pm_gps_is_on();
13397 +}
13398 +
13399 +static struct glamofb_platform_data gta02_glamo_pdata = {
13400 + .width = 43,
13401 + .height = 58,
13402 + /* 24.5MHz --> 40.816ns */
13403 + .pixclock = 40816,
13404 + .left_margin = 8,
13405 + .right_margin = 16,
13406 + .upper_margin = 2,
13407 + .lower_margin = 16,
13408 + .hsync_len = 8,
13409 + .vsync_len = 2,
13410 + .fb_mem_size = 0x400000, /* glamo has 8 megs of SRAM. we use 4 */
13411 + .xres = {
13412 + .min = 240,
13413 + .max = 640,
13414 + .defval = 480,
13415 + },
13416 + .yres = {
13417 + .min = 320,
13418 + .max = 640,
13419 + .defval = 640,
13420 + },
13421 + .bpp = {
13422 + .min = 16,
13423 + .max = 16,
13424 + .defval = 16,
13425 + },
13426 + //.spi_info = &glamo_spi_cfg,
13427 + .spigpio_info = &glamo_spigpio_cfg,
13428 +
13429 + /* glamo MMC function platform data */
13430 + .glamo_set_mci_power = gta02_glamo_mmc_set_power,
13431 + .glamo_mci_use_slow = gta02_glamo_mci_use_slow,
13432 + .glamo_irq_is_wired = glamo_irq_is_wired,
13433 + .mci_suspending = gta02_glamo_mci_suspending,
13434 + .mci_all_dependencies_resumed =
13435 + gta02_glamo_mci_all_dependencies_resumed,
13436 +};
13437 +
13438 +static struct resource gta02_glamo_resources[] = {
13439 + [0] = {
13440 + .start = S3C2410_CS1,
13441 + .end = S3C2410_CS1 + 0x1000000 - 1,
13442 + .flags = IORESOURCE_MEM,
13443 + },
13444 + [1] = {
13445 + .start = GTA02_IRQ_3D,
13446 + .end = GTA02_IRQ_3D,
13447 + .flags = IORESOURCE_IRQ,
13448 + },
13449 + [2] = {
13450 + .start = GTA02v1_GPIO_3D_RESET,
13451 + .end = GTA02v1_GPIO_3D_RESET,
13452 + },
13453 +};
13454 +
13455 +static struct platform_device gta02_glamo_dev = {
13456 + .name = "glamo3362",
13457 + .num_resources = ARRAY_SIZE(gta02_glamo_resources),
13458 + .resource = gta02_glamo_resources,
13459 + .dev = {
13460 + .platform_data = &gta02_glamo_pdata,
13461 + },
13462 +};
13463 +
13464 +static void mangle_glamo_res_by_system_rev(void)
13465 +{
13466 + switch (system_rev) {
13467 + case GTA02v1_SYSTEM_REV:
13468 + break;
13469 + default:
13470 + gta02_glamo_resources[2].start = GTA02_GPIO_3D_RESET;
13471 + gta02_glamo_resources[2].end = GTA02_GPIO_3D_RESET;
13472 + break;
13473 + }
13474 +
13475 + switch (system_rev) {
13476 + case GTA02v1_SYSTEM_REV:
13477 + case GTA02v2_SYSTEM_REV:
13478 + case GTA02v3_SYSTEM_REV:
13479 + /* case GTA02v4_SYSTEM_REV: - FIXME: handle this later */
13480 + /* The hardware is missing a pull-up resistor and thus can't
13481 + * support the Smedia Glamo IRQ */
13482 + gta02_glamo_resources[1].start = 0;
13483 + gta02_glamo_resources[1].end = 0;
13484 + break;
13485 + }
13486 +}
13487 +
13488 +static void __init gta02_map_io(void)
13489 +{
13490 + s3c24xx_init_io(gta02_iodesc, ARRAY_SIZE(gta02_iodesc));
13491 + s3c24xx_init_clocks(12000000);
13492 + s3c24xx_init_uarts(gta02_uartcfgs, ARRAY_SIZE(gta02_uartcfgs));
13493 +}
13494 +
13495 +static irqreturn_t gta02_modem_irq(int irq, void *param)
13496 +{
13497 + printk(KERN_DEBUG "modem wakeup interrupt\n");
13498 + gta_gsm_interrupts++;
13499 + return IRQ_HANDLED;
13500 +}
13501 +
13502 +static irqreturn_t ar6000_wow_irq(int irq, void *param)
13503 +{
13504 + printk(KERN_DEBUG "ar6000_wow interrupt\n");
13505 + return IRQ_HANDLED;
13506 +}
13507 +
13508 +/*
13509 + * hardware_ecc=1|0
13510 + */
13511 +static char hardware_ecc_str[4] __initdata = "";
13512 +
13513 +static int __init hardware_ecc_setup(char *str)
13514 +{
13515 + if (str)
13516 + strlcpy(hardware_ecc_str, str, sizeof(hardware_ecc_str));
13517 + return 1;
13518 +}
13519 +
13520 +__setup("hardware_ecc=", hardware_ecc_setup);
13521 +
13522 +static void __init gta02_machine_init(void)
13523 +{
13524 + int rc;
13525 +
13526 + /* set the panic callback to make AUX blink fast */
13527 + panic_blink = gta02_panic_blink;
13528 +
13529 + switch (system_rev) {
13530 + case GTA02v6_SYSTEM_REV:
13531 + /* we need push-pull interrupt from motion sensors */
13532 + lis302_pdata_top.open_drain = 0;
13533 + lis302_pdata_bottom.open_drain = 0;
13534 + break;
13535 + default:
13536 + break;
13537 + }
13538 +
13539 + spin_lock_init(&motion_irq_lock);
13540 +
13541 + /* do not force soft ecc if we are asked to use hardware_ecc */
13542 + if (hardware_ecc_str[0] == '1')
13543 + gta02_nand_info.software_ecc = 0;
13544 +
13545 + s3c_device_usb.dev.platform_data = &gta02_usb_info;
13546 + s3c_device_nand.dev.platform_data = &gta02_nand_info;
13547 + s3c_device_sdi.dev.platform_data = &gta02_mmc_cfg;
13548 +
13549 + /* Only GTA02v1 has a SD_DETECT GPIO. Since the slot is not
13550 + * hot-pluggable, this is not required anyway */
13551 + switch (system_rev) {
13552 + case GTA02v1_SYSTEM_REV:
13553 + break;
13554 + default:
13555 + gta02_mmc_cfg.gpio_detect = 0;
13556 + break;
13557 + }
13558 +
13559 + /* acc sensor chip selects */
13560 + s3c2410_gpio_setpin(S3C2410_GPD12, 1);
13561 + s3c2410_gpio_cfgpin(S3C2410_GPD12, S3C2410_GPIO_OUTPUT);
13562 + s3c2410_gpio_setpin(S3C2410_GPD13, 1);
13563 + s3c2410_gpio_cfgpin(S3C2410_GPD13, S3C2410_GPIO_OUTPUT);
13564 +
13565 + s3c24xx_udc_set_platdata(&gta02_udc_cfg);
13566 + set_s3c2410ts_info(&gta02_ts_cfg);
13567 +
13568 + /* FIXME: hardcoded WLAN module power-up */
13569 + s3c2410_gpio_cfgpin(GTA02_CHIP_PWD, S3C2410_GPIO_OUTPUT);
13570 +
13571 + /* Power is down */
13572 + s3c2410_gpio_setpin(GTA02_CHIP_PWD, 1);
13573 + mdelay(100);
13574 +
13575 + switch (system_rev) {
13576 + case GTA02v1_SYSTEM_REV:
13577 + s3c2410_gpio_setpin(GTA02_CHIP_PWD, 0);
13578 + break;
13579 + default:
13580 + /* Chip is in reset state */
13581 + s3c2410_gpio_setpin(GTA02_GPIO_nWLAN_RESET, 0);
13582 + s3c2410_gpio_cfgpin(GTA02_GPIO_nWLAN_RESET, S3C2410_GPIO_OUTPUT);
13583 + mdelay(100);
13584 + /* Power is up */
13585 + s3c2410_gpio_setpin(GTA02_CHIP_PWD, 0);
13586 + mdelay(100);
13587 + /* Chip is out of reset */
13588 + s3c2410_gpio_setpin(GTA02_GPIO_nWLAN_RESET, 1);
13589 + break;
13590 + }
13591 + mangle_glamo_res_by_system_rev();
13592 + platform_device_register(&gta02_glamo_dev);
13593 +
13594 + platform_device_register(&s3c_device_spi_acc1);
13595 + platform_device_register(&s3c_device_spi_acc2);
13596 + platform_device_register(&gta02_button_dev);
13597 + platform_device_register(&gta02_pm_gsm_dev);
13598 + platform_device_register(&gta02_pm_usbhost_dev);
13599 +
13600 + mangle_pmu_pdata_by_system_rev();
13601 + platform_device_register(&gta02_pmu_dev);
13602 + platform_device_register(&gta02_vibrator_dev);
13603 + platform_device_register(&gta02_led_dev);
13604 +
13605 +
13606 + platform_device_register(&gta02_sdio_dev);
13607 +
13608 + platform_add_devices(gta02_devices, ARRAY_SIZE(gta02_devices));
13609 +
13610 +#ifdef CONFIG_GTA02_HDQ
13611 + switch (system_rev) {
13612 + case GTA02v5_SYSTEM_REV:
13613 + case GTA02v6_SYSTEM_REV:
13614 + platform_device_register(&gta02_hdq_device);
13615 + platform_device_register(&bq27000_battery_device);
13616 + break;
13617 + default:
13618 + break;
13619 + }
13620 +#endif
13621 + s3c2410_pm_init();
13622 +
13623 + /* Make sure the modem can wake us up */
13624 + set_irq_type(GTA02_IRQ_MODEM, IRQT_RISING);
13625 + rc = request_irq(GTA02_IRQ_MODEM, gta02_modem_irq, IRQF_DISABLED,
13626 + "modem", NULL);
13627 + if (rc < 0)
13628 + printk(KERN_ERR "GTA02: can't request GSM modem wakeup IRQ\n");
13629 + enable_irq_wake(GTA02_IRQ_MODEM);
13630 +
13631 + /* Make sure the wifi module can wake us up*/
13632 + set_irq_type(GTA02_IRQ_WLAN_GPIO1, IRQT_RISING);
13633 + rc = request_irq(GTA02_IRQ_WLAN_GPIO1, ar6000_wow_irq, IRQF_DISABLED,
13634 + "ar6000", NULL);
13635 +
13636 + if (rc < 0)
13637 + printk(KERN_ERR "GTA02: can't request ar6k wakeup IRQ\n");
13638 + enable_irq_wake(GTA02_IRQ_WLAN_GPIO1);
13639 +}
13640 +
13641 +MACHINE_START(NEO1973_GTA02, "GTA02")
13642 + .phys_io = S3C2410_PA_UART,
13643 + .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
13644 + .boot_params = S3C2410_SDRAM_PA + 0x100,
13645 + .map_io = gta02_map_io,
13646 + .init_irq = s3c24xx_init_irq,
13647 + .init_machine = gta02_machine_init,
13648 + .timer = &s3c24xx_timer,
13649 +MACHINE_END
13650 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/mach-hxd8.c
13651 ===================================================================
13652 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
13653 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/mach-hxd8.c 2008-12-11 22:46:49.000000000 +0100
13654 @@ -0,0 +1,381 @@
13655 +/* linux/arch/arm/mach-s3c2440/mach-hxd8.c
13656 + *
13657 + * S3C2440 Machine Support for the FIC HXD8
13658 + *
13659 + * Copyright (c) 2007 Openmoko, Inc.
13660 + * Author: Harald Welte <laforge@openmoko.org>
13661 + * All rights reserved.
13662 + *
13663 + * This program is free software; you can redistribute it and/or
13664 + * modify it under the terms of the GNU General Public License as
13665 + * published by the Free Software Foundation; either version 2 of
13666 + * the License, or (at your option) any later version.
13667 + *
13668 + * This program is distributed in the hope that it will be useful,
13669 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
13670 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13671 + * GNU General Public License for more details.
13672 + *
13673 + * You should have received a copy of the GNU General Public License
13674 + * along with this program; if not, write to the Free Software
13675 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
13676 + * MA 02111-1307 USA
13677 + *
13678 + */
13679 +
13680 +#include <linux/kernel.h>
13681 +#include <linux/types.h>
13682 +#include <linux/interrupt.h>
13683 +#include <linux/list.h>
13684 +#include <linux/timer.h>
13685 +#include <linux/init.h>
13686 +#include <linux/workqueue.h>
13687 +#include <linux/serial_core.h>
13688 +#include <linux/platform_device.h>
13689 +#include <linux/mmc/host.h>
13690 +
13691 +#include <linux/mtd/mtd.h>
13692 +#include <linux/mtd/nand.h>
13693 +#include <linux/mtd/nand_ecc.h>
13694 +#include <linux/mtd/partitions.h>
13695 +
13696 +#include <linux/pcf50606.h>
13697 +
13698 +#include <asm/mach/arch.h>
13699 +#include <asm/mach/map.h>
13700 +#include <asm/mach/irq.h>
13701 +
13702 +#include <asm/hardware.h>
13703 +#include <asm/hardware/iomd.h>
13704 +#include <asm/io.h>
13705 +#include <asm/irq.h>
13706 +#include <asm/mach-types.h>
13707 +
13708 +//#include <asm/debug-ll.h>
13709 +#include <asm/arch/regs-gpio.h>
13710 +#include <asm/arch/regs-lcd.h>
13711 +#include <asm/arch/idle.h>
13712 +#include <asm/arch/fb.h>
13713 +#include <asm/arch/mci.h>
13714 +#include <asm/arch/ts.h>
13715 +#include <asm/arch/spi.h>
13716 +#include <asm/arch/spi-gpio.h>
13717 +#include <asm/arch/usb-control.h>
13718 +
13719 +#include <asm/arch-s3c2440/hxd8.h>
13720 +#include <asm/arch/gta01.h>
13721 +
13722 +//#include "s3c2410.h"
13723 +//#include "s3c2440.h"
13724 +//#include "clock.h"
13725 +#include <asm/plat-s3c/regs-serial.h>
13726 +#include <asm/plat-s3c/nand.h>
13727 +#include <asm/plat-s3c24xx/devs.h>
13728 +#include <asm/plat-s3c24xx/cpu.h>
13729 +#include <asm/plat-s3c24xx/pm.h>
13730 +#include <asm/plat-s3c24xx/udc.h>
13731 +
13732 +static struct map_desc hxd8_iodesc[] __initdata = {
13733 + /* ISA IO Space map (memory space selected by A24) */
13734 +
13735 + {
13736 + .virtual = (u32)S3C24XX_VA_ISA_WORD,
13737 + .pfn = __phys_to_pfn(S3C2410_CS2),
13738 + .length = 0x10000,
13739 + .type = MT_DEVICE,
13740 + }, {
13741 + .virtual = (u32)S3C24XX_VA_ISA_WORD + 0x10000,
13742 + .pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
13743 + .length = SZ_4M,
13744 + .type = MT_DEVICE,
13745 + }, {
13746 + .virtual = (u32)S3C24XX_VA_ISA_BYTE,
13747 + .pfn = __phys_to_pfn(S3C2410_CS2),
13748 + .length = 0x10000,
13749 + .type = MT_DEVICE,
13750 + }, {
13751 + .virtual = (u32)S3C24XX_VA_ISA_BYTE + 0x10000,
13752 + .pfn = __phys_to_pfn(S3C2410_CS2 + (1<<24)),
13753 + .length = SZ_4M,
13754 + .type = MT_DEVICE,
13755 + }
13756 +};
13757 +
13758 +#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
13759 +#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
13760 +#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
13761 +
13762 +static struct s3c2410_uartcfg hxd8_uartcfgs[] __initdata = {
13763 + [0] = {
13764 + .hwport = 0,
13765 + .flags = 0,
13766 + .ucon = 0x3c5,
13767 + .ulcon = 0x03,
13768 + .ufcon = 0x51,
13769 + },
13770 + [1] = {
13771 + .hwport = 1,
13772 + .flags = 0,
13773 + .ucon = 0x3c5,
13774 + .ulcon = 0x03,
13775 + .ufcon = 0x51,
13776 + },
13777 + [2] = {
13778 + .hwport = 2,
13779 + .flags = 0,
13780 + .ucon = 0x3c5,
13781 + .ulcon = 0x03,
13782 + .ufcon = 0x51,
13783 + }
13784 +};
13785 +
13786 +static struct s3c2410_nand_set hxd8_nand_sets[] = {
13787 + [0] = {
13788 + .name = "hxd8-nand",
13789 + .nr_chips = 1,
13790 + .flags = S3C2410_NAND_BBT,
13791 + },
13792 + [1] = {
13793 + .name = "hxd8-nand-1",
13794 + .nr_chips = 1,
13795 + .flags = S3C2410_NAND_BBT,
13796 + },
13797 + [2] = {
13798 + .name = "hxd8-nand-2",
13799 + .nr_chips = 1,
13800 + .flags = S3C2410_NAND_BBT,
13801 + },
13802 +};
13803 +
13804 +/* choose a set of timings which should suit most 512Mbit
13805 + * chips and beyond.
13806 +*/
13807 +
13808 +static struct s3c2410_platform_nand hxd8_nand_info = {
13809 + .tacls = 20,
13810 + .twrph0 = 60,
13811 + .twrph1 = 20,
13812 + .nr_sets = ARRAY_SIZE(hxd8_nand_sets),
13813 + .sets = hxd8_nand_sets,
13814 +};
13815 +
13816 +/* PMU configuration */
13817 +
13818 +static struct pcf50606_platform_data hxd8_pcf_pdata = {
13819 + .used_features = PCF50606_FEAT_EXTON |
13820 + PCF50606_FEAT_BBC |
13821 + PCF50606_FEAT_WDT |
13822 + PCF50606_FEAT_RTC |
13823 + PCF50606_FEAT_PWM |
13824 + PCF50606_FEAT_PWM_BL |
13825 + PCF50606_FEAT_BATVOLT,
13826 + .onkey_seconds_required = 5,
13827 + .init_brightness = 8,
13828 + .rails = {
13829 + [PCF50606_REGULATOR_D1REG] = {
13830 + .name = "rc_3v3",
13831 + .voltage = {
13832 + .init = 3300,
13833 + .max = 3300,
13834 + },
13835 + },
13836 + [PCF50606_REGULATOR_D2REG] = {
13837 + .name = "gps_3v3",
13838 + .voltage = {
13839 + .init = 3300,
13840 + .max = 3300,
13841 + },
13842 + },
13843 + [PCF50606_REGULATOR_D3REG] = {
13844 + .name = "io2_3v3",
13845 + .voltage = {
13846 + .init = 3300,
13847 + .max = 3300,
13848 + },
13849 + },
13850 + [PCF50606_REGULATOR_DCD] = {
13851 + .name = "core_1v3",
13852 + .voltage = {
13853 + .init = 1300,
13854 + .max = 1500,
13855 + },
13856 + },
13857 + [PCF50606_REGULATOR_DCDE] = {
13858 + .name = "io1_3v3",
13859 + .voltage = {
13860 + .init = 3300,
13861 + .max = 3300,
13862 + },
13863 + },
13864 + [PCF50606_REGULATOR_DCUD] = {
13865 + .name = "rf_3v3",
13866 + .voltage = {
13867 + .init = 3300,
13868 + .max = 3300,
13869 + },
13870 + },
13871 + [PCF50606_REGULATOR_IOREG] = {
13872 + .name = "audio_3v3",
13873 + .voltage = {
13874 + .init = 3300,
13875 + .max = 3300,
13876 + },
13877 + },
13878 + [PCF50606_REGULATOR_LPREG] = {
13879 + .name = "lcm_3v3",
13880 + .voltage = {
13881 + .init = 3300,
13882 + .max = 3300,
13883 + },
13884 + },
13885 + },
13886 +};
13887 +
13888 +static struct resource hxd8_pmu_resources[] = {
13889 + [0] = {
13890 + .flags = IORESOURCE_IRQ,
13891 + .start = HXD8_IRQ_PCF50606,
13892 + .end = HXD8_IRQ_PCF50606,
13893 + },
13894 +};
13895 +
13896 +static struct platform_device hxd8_pmu_dev = {
13897 + .name = "pcf50606",
13898 + .num_resources = ARRAY_SIZE(hxd8_pmu_resources),
13899 + .resource = hxd8_pmu_resources,
13900 + .dev = {
13901 + .platform_data = &hxd8_pcf_pdata,
13902 + },
13903 +};
13904 +
13905 +/* LCD driver info */
13906 +
13907 +static struct s3c2410fb_display hxd8_displays[] __initdata = {
13908 + {
13909 + .type = S3C2410_LCDCON1_TFT,
13910 + .width = 480,
13911 + .height = 272,
13912 + .xres = 480,
13913 + .yres = 272,
13914 + .bpp = 16,
13915 +
13916 + .pixclock = 40000, /* HCLK/4 */
13917 + .left_margin = 2,
13918 + .right_margin = 2,
13919 + .hsync_len = 41,
13920 + .upper_margin = 2,
13921 + .lower_margin = 2,
13922 + .vsync_len = 10,
13923 + .lcdcon5 = S3C2410_LCDCON5_FRM565 |
13924 + S3C2410_LCDCON5_INVVLINE |
13925 + S3C2410_LCDCON5_INVVFRAME,
13926 + },
13927 +};
13928 +
13929 +static struct s3c2410fb_mach_info hxd8_lcd_cfg __initdata = {
13930 + .displays = hxd8_displays,
13931 + .num_displays = ARRAY_SIZE(hxd8_displays),
13932 + .default_display = 1,
13933 +
13934 + .lpcsel = ((0xCE6) & ~7),
13935 +};
13936 +
13937 +static struct platform_device hxd8_pm_gsm_dev = {
13938 + .name = "neo1973-pm-gsm",
13939 +};
13940 +
13941 +static void gta01_udc_command(enum s3c2410_udc_cmd_e cmd)
13942 +{
13943 + printk(KERN_DEBUG "%s(%d)\n", __func__, cmd);
13944 +
13945 + switch (cmd) {
13946 + case S3C2410_UDC_P_ENABLE:
13947 + s3c2410_gpio_setpin(HXD8_GPIO_USB_PULLUP, 1);
13948 + break;
13949 + case S3C2410_UDC_P_DISABLE:
13950 + s3c2410_gpio_setpin(HXD8_GPIO_USB_PULLUP, 0);
13951 + break;
13952 + case S3C2410_UDC_P_RESET:
13953 + /* FIXME! */
13954 + break;
13955 + default:
13956 + break;
13957 + }
13958 +}
13959 +
13960 +/* USB Charger */
13961 +
13962 +static void hxd8_udc_vbus_draw(unsigned int ma)
13963 +{
13964 + if (ma >= 500) {
13965 + /* enable fast charge */
13966 + printk(KERN_DEBUG "udc: enabling fast charge\n");
13967 + s3c2410_gpio_setpin(HXD8_GPIO_USB_CUR_SEL, 1);
13968 + } else {
13969 + /* disable fast charge */
13970 + printk(KERN_DEBUG "udc: disabling fast charge\n");
13971 + s3c2410_gpio_setpin(HXD8_GPIO_USB_CUR_SEL, 0);
13972 + }
13973 +}
13974 +
13975 +static struct s3c2410_udc_mach_info hxd8_udc_cfg = {
13976 + .vbus_draw = hxd8_udc_vbus_draw,
13977 +};
13978 +
13979 +/* Touch Screen */
13980 +static struct s3c2410_ts_mach_info hxd8_ts_cfg = {
13981 + .delay = 10000,
13982 + .presc = 49,
13983 + .oversampling_shift = 4,
13984 +};
13985 +
13986 +static struct platform_device *hxd8_devices[] __initdata = {
13987 + &s3c_device_usb,
13988 + &s3c_device_lcd,
13989 + &s3c_device_wdt,
13990 + &s3c_device_i2c,
13991 + &s3c_device_iis,
13992 + &s3c_device_sdi,
13993 + &s3c_device_usbgadget,
13994 + &s3c_device_nand,
13995 + &s3c_device_ts,
13996 +};
13997 +
13998 +static void __init hxd8_map_io(void)
13999 +{
14000 + s3c24xx_init_io(hxd8_iodesc, ARRAY_SIZE(hxd8_iodesc));
14001 + s3c24xx_init_clocks(16934400);
14002 + s3c24xx_init_uarts(hxd8_uartcfgs, ARRAY_SIZE(hxd8_uartcfgs));
14003 +}
14004 +
14005 +static void __init hxd8_machine_init(void)
14006 +{
14007 + hxd8_udc_cfg.udc_command = gta01_udc_command;
14008 + s3c_device_nand.dev.platform_data = &hxd8_nand_info;
14009 +
14010 + s3c24xx_fb_set_platdata(&hxd8_lcd_cfg);
14011 +
14012 + s3c24xx_udc_set_platdata(&hxd8_udc_cfg);
14013 + set_s3c2410ts_info(&hxd8_ts_cfg);
14014 +
14015 + //platform_device_register(&gta01_button_dev);
14016 + platform_device_register(&hxd8_pm_gsm_dev);
14017 +
14018 + platform_device_register(&hxd8_pmu_dev);
14019 +
14020 + platform_add_devices(hxd8_devices, ARRAY_SIZE(hxd8_devices));
14021 +
14022 + s3c2410_pm_init();
14023 +}
14024 +
14025 +MACHINE_START(HXD8, "HXD8")
14026 + /* Maintainer: Harald Welte <laforge@openmoko.org> */
14027 + .phys_io = S3C2410_PA_UART,
14028 + .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
14029 + .boot_params = S3C2410_SDRAM_PA + 0x100,
14030 +
14031 + .init_irq = s3c24xx_init_irq,
14032 + .map_io = hxd8_map_io,
14033 + .init_machine = hxd8_machine_init,
14034 + .timer = &s3c24xx_timer,
14035 +MACHINE_END
14036 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/Makefile
14037 ===================================================================
14038 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2440/Makefile 2008-12-11 22:46:07.000000000 +0100
14039 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/Makefile 2008-12-11 22:46:49.000000000 +0100
14040 @@ -13,6 +13,7 @@ obj-$(CONFIG_CPU_S3C2440) += s3c2440.o d
14041 obj-$(CONFIG_CPU_S3C2440) += irq.o
14042 obj-$(CONFIG_CPU_S3C2440) += clock.o
14043 obj-$(CONFIG_S3C2440_DMA) += dma.o
14044 +obj-$(CONFIG_S3C2440_C_FIQ) += fiq_c_isr.o
14045
14046 # Machine support
14047
14048 @@ -21,3 +22,6 @@ obj-$(CONFIG_MACH_OSIRIS) += mach-osiris
14049 obj-$(CONFIG_MACH_RX3715) += mach-rx3715.o
14050 obj-$(CONFIG_ARCH_S3C2440) += mach-smdk2440.o
14051 obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
14052 +obj-$(CONFIG_MACH_HXD8) += mach-hxd8.o
14053 +obj-$(CONFIG_MACH_NEO1973_GTA02) += mach-gta02.o
14054 +obj-$(CONFIG_MACH_M800) += mach-glofiish.o
14055 Index: linux-2.6.24.7/arch/arm/mach-s3c2440/s3c2440.c
14056 ===================================================================
14057 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2440/s3c2440.c 2008-12-11 22:46:07.000000000 +0100
14058 +++ linux-2.6.24.7/arch/arm/mach-s3c2440/s3c2440.c 2008-12-11 22:46:49.000000000 +0100
14059 @@ -46,6 +46,9 @@ int __init s3c2440_init(void)
14060 s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
14061 s3c_device_wdt.resource[1].end = IRQ_S3C2440_WDT;
14062
14063 + /* make sure SD/MMC driver can distinguish 2440 from 2410 */
14064 + s3c_device_sdi.name = "s3c2440-sdi";
14065 +
14066 /* register our system device for everything else */
14067
14068 return sysdev_register(&s3c2440_sysdev);
14069 Index: linux-2.6.24.7/arch/arm/mach-s3c2442/Kconfig
14070 ===================================================================
14071 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2442/Kconfig 2008-12-11 22:46:07.000000000 +0100
14072 +++ linux-2.6.24.7/arch/arm/mach-s3c2442/Kconfig 2008-12-11 22:46:49.000000000 +0100
14073 @@ -6,10 +6,11 @@
14074
14075 config CPU_S3C2442
14076 bool
14077 - depends on ARCH_S3C2410
14078 + depends on CPU_S3C2440
14079 select S3C2410_CLOCK
14080 select S3C2410_GPIO
14081 select S3C2410_PM if PM
14082 + select S3C2440_DMA if S3C2410_DMA
14083 select CPU_S3C244X
14084 select CPU_LLSERIAL_S3C2440
14085 help
14086 Index: linux-2.6.24.7/arch/arm/mach-s3c2442/s3c2442.c
14087 ===================================================================
14088 --- linux-2.6.24.7.orig/arch/arm/mach-s3c2442/s3c2442.c 2008-12-11 22:46:07.000000000 +0100
14089 +++ linux-2.6.24.7/arch/arm/mach-s3c2442/s3c2442.c 2008-12-11 22:46:49.000000000 +0100
14090 @@ -21,6 +21,7 @@
14091
14092 #include <asm/plat-s3c24xx/s3c2442.h>
14093 #include <asm/plat-s3c24xx/cpu.h>
14094 +#include <asm/plat-s3c24xx/devs.h>
14095
14096 static struct sys_device s3c2442_sysdev = {
14097 .cls = &s3c2442_sysclass,
14098 @@ -30,5 +31,8 @@ int __init s3c2442_init(void)
14099 {
14100 printk("S3C2442: Initialising architecture\n");
14101
14102 + /* make sure SD/MMC driver can distinguish 2440 from 2410 */
14103 + s3c_device_sdi.name = "s3c2440-sdi";
14104 +
14105 return sysdev_register(&s3c2442_sysdev);
14106 }
14107 Index: linux-2.6.24.7/arch/arm/plat-s3c/Kconfig
14108 ===================================================================
14109 --- linux-2.6.24.7.orig/arch/arm/plat-s3c/Kconfig 2008-12-11 22:46:07.000000000 +0100
14110 +++ linux-2.6.24.7/arch/arm/plat-s3c/Kconfig 2008-12-11 22:46:49.000000000 +0100
14111 @@ -61,7 +61,7 @@ comment "Power management"
14112
14113 config S3C2410_PM_DEBUG
14114 bool "S3C2410 PM Suspend debug"
14115 - depends on PLAT_S3C && PM
14116 + depends on PLAT_S3C && PM && DEBUG_LL
14117 help
14118 Say Y here if you want verbose debugging from the PM Suspend and
14119 Resume code. See <file:Documentation/arm/Samsung-S3C24XX/Suspend.txt>
14120 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/cpu.c
14121 ===================================================================
14122 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/cpu.c 2008-12-11 22:46:07.000000000 +0100
14123 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/cpu.c 2008-12-11 22:46:49.000000000 +0100
14124 @@ -68,6 +68,7 @@ static const char name_s3c2410[] = "S3C
14125 static const char name_s3c2412[] = "S3C2412";
14126 static const char name_s3c2440[] = "S3C2440";
14127 static const char name_s3c2442[] = "S3C2442";
14128 +static const char name_s3c2442b[] = "S3C2442B";
14129 static const char name_s3c2443[] = "S3C2443";
14130 static const char name_s3c2410a[] = "S3C2410A";
14131 static const char name_s3c2440a[] = "S3C2440A";
14132 @@ -119,6 +120,15 @@ static struct cpu_table cpu_ids[] __init
14133 .name = name_s3c2442
14134 },
14135 {
14136 + .idcode = 0x32440aab,
14137 + .idmask = 0xffffffff,
14138 + .map_io = s3c244x_map_io,
14139 + .init_clocks = s3c244x_init_clocks,
14140 + .init_uarts = s3c244x_init_uarts,
14141 + .init = s3c2442_init,
14142 + .name = name_s3c2442b
14143 + },
14144 + {
14145 .idcode = 0x32412001,
14146 .idmask = 0xffffffff,
14147 .map_io = s3c2412_map_io,
14148 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/devs.c
14149 ===================================================================
14150 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/devs.c 2008-12-11 22:46:07.000000000 +0100
14151 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/devs.c 2008-12-11 22:46:49.000000000 +0100
14152 @@ -24,6 +24,7 @@
14153 #include <asm/mach/map.h>
14154 #include <asm/mach/irq.h>
14155 #include <asm/arch/fb.h>
14156 +#include <asm/arch/ts.h>
14157 #include <asm/hardware.h>
14158 #include <asm/io.h>
14159 #include <asm/irq.h>
14160 @@ -207,6 +208,23 @@ struct platform_device s3c_device_nand =
14161
14162 EXPORT_SYMBOL(s3c_device_nand);
14163
14164 +/* Touchscreen */
14165 +struct platform_device s3c_device_ts = {
14166 + .name = "s3c2410-ts",
14167 + .id = -1,
14168 +};
14169 +
14170 +EXPORT_SYMBOL(s3c_device_ts);
14171 +
14172 +static struct s3c2410_ts_mach_info s3c2410ts_info;
14173 +
14174 +void set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info)
14175 +{
14176 + memcpy(&s3c2410ts_info,hard_s3c2410ts_info,sizeof(struct s3c2410_ts_mach_info));
14177 + s3c_device_ts.dev.platform_data = &s3c2410ts_info;
14178 +}
14179 +EXPORT_SYMBOL(set_s3c2410ts_info);
14180 +
14181 /* USB Device (Gadget)*/
14182
14183 static struct resource s3c_usbgadget_resource[] = {
14184 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/gpio.c
14185 ===================================================================
14186 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/gpio.c 2008-12-11 22:46:07.000000000 +0100
14187 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/gpio.c 2008-12-11 22:46:49.000000000 +0100
14188 @@ -32,6 +32,7 @@
14189 #include <asm/io.h>
14190
14191 #include <asm/arch/regs-gpio.h>
14192 +#include <asm/arch/regs-gpioj.h>
14193
14194 void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)
14195 {
14196 @@ -186,3 +187,439 @@ int s3c2410_gpio_getirq(unsigned int pin
14197 }
14198
14199 EXPORT_SYMBOL(s3c2410_gpio_getirq);
14200 +
14201 +int s3c2410_irq_to_gpio(unsigned int irq)
14202 +{
14203 + /* not valid interrupts */
14204 + if (irq > 15 + IRQ_EINT8)
14205 + return -1;
14206 +
14207 + if (irq < IRQ_EINT4)
14208 + return (irq - IRQ_EINT0) + S3C2410_GPF0;
14209 +
14210 + if (irq < IRQ_EINT8)
14211 + return (irq - IRQ_EINT4) + S3C2410_GPF4;
14212 +
14213 + return (irq - IRQ_EINT8) + S3C2410_GPG0;
14214 +}
14215 +
14216 +EXPORT_SYMBOL(s3c2410_irq_to_gpio);
14217 +
14218 +static void pretty_dump(u32 cfg, u32 state, u32 pull,
14219 + const char ** function_names_2,
14220 + const char ** function_names_3,
14221 + const char * prefix,
14222 + int count)
14223 +{
14224 + int n;
14225 + const char *tag_type = NULL,
14226 + *tag_state = NULL,
14227 + *tag_pulldown = NULL,
14228 + * level0 = "0",
14229 + * level1 = "1";
14230 +
14231 + for (n = 0; n < count; n++) {
14232 + switch ((cfg >> (2 * n)) & 3) {
14233 + case 0:
14234 + tag_type = "input ";
14235 + break;
14236 + case 1:
14237 + tag_type = "OUTPUT ";
14238 + break;
14239 + case 2:
14240 + if (function_names_2) {
14241 + if (function_names_2[n])
14242 + tag_type = function_names_2[n];
14243 + else
14244 + tag_type = "*** ILLEGAL CFG (2) *** ";
14245 + } else
14246 + tag_type = "(function) ";
14247 + break;
14248 + default:
14249 + if (function_names_3) {
14250 + if (function_names_3[n])
14251 + tag_type = function_names_3[n];
14252 + else
14253 + tag_type = "*** ILLEGAL CFG (3) *** ";
14254 + } else
14255 + tag_type = "(function) ";
14256 + break;
14257 + }
14258 + if ((state >> n) & 1)
14259 + tag_state = level1;
14260 + else
14261 + tag_state = level0;
14262 +
14263 + if (((pull >> n) & 1))
14264 + tag_pulldown = "";
14265 + else
14266 + tag_pulldown = "(pulldown)";
14267 +
14268 + printk(KERN_INFO"%s%02d: %s %s %s\n", prefix, n, tag_type,
14269 + tag_state, tag_pulldown);
14270 + }
14271 + printk(KERN_INFO"\n");
14272 +}
14273 +
14274 +static void pretty_dump_a(u32 cfg, u32 state,
14275 + const char ** function_names,
14276 + const char * prefix,
14277 + int count)
14278 +{
14279 + int n;
14280 + const char *tag_type = NULL,
14281 + *tag_state = NULL,
14282 + * level0 = "0",
14283 + * level1 = "1";
14284 +
14285 + for (n = 0; n < count; n++) {
14286 + switch ((cfg >> n) & 1) {
14287 + case 0:
14288 + tag_type = "OUTPUT ";
14289 + break;
14290 + default:
14291 + if (function_names) {
14292 + if (function_names[n])
14293 + tag_type = function_names[n];
14294 + else
14295 + tag_type = "*** ILLEGAL CFG *** ";
14296 + } else
14297 + tag_type = "(function) ";
14298 + break;
14299 + }
14300 + if ((state >> n) & 1)
14301 + tag_state = level1;
14302 + else
14303 + tag_state = level0;
14304 +
14305 + printk(KERN_INFO"%s%02d: %s %s\n", prefix, n, tag_type,
14306 + tag_state);
14307 + }
14308 + printk(KERN_INFO"\n");
14309 +}
14310 +
14311 +static const char * funcs_a[] = {
14312 + "ADDR0 ",
14313 + "ADDR16 ",
14314 + "ADDR17 ",
14315 + "ADDR18 ",
14316 + "ADDR19 ",
14317 + "ADDR20 ",
14318 + "ADDR21 ",
14319 + "ADDR22 ",
14320 + "ADDR23 ",
14321 + "ADDR24 ",
14322 + "ADDR25 ",
14323 + "ADDR26 ",
14324 + "nGCS[1] ",
14325 + "nGCS[2] ",
14326 + "nGCS[3] ",
14327 + "nGCS[4] ",
14328 + "nGCS[5] ",
14329 + "CLE ",
14330 + "ALE ",
14331 + "nFWE ",
14332 + "nFRE ",
14333 + "nRSTOUT ",
14334 + "nFCE ",
14335 + NULL,
14336 + NULL
14337 +};
14338 +
14339 +
14340 +static const char * funcs_b2[] = {
14341 + "TOUT0 ",
14342 + "TOUT1 ",
14343 + "TOUT2 ",
14344 + "TOUT3 ",
14345 + "TCLK[0] ",
14346 + "nXBACK ",
14347 + "nXBREQ ",
14348 + "nXDACK1 ",
14349 + "nXDREQ1 ",
14350 + "nXDACK0 ",
14351 + "nXDREQ0 ",
14352 +};
14353 +static const char * funcs_b3[] = {
14354 + NULL,
14355 + NULL,
14356 + NULL,
14357 + NULL,
14358 + NULL,
14359 + NULL,
14360 + NULL,
14361 + NULL,
14362 + NULL,
14363 + NULL,
14364 + NULL,
14365 +};
14366 +
14367 +static const char * funcs_c2[] = {
14368 + "LEND ",
14369 + "VCLK ",
14370 + "VLINE ",
14371 + "VFRAME ",
14372 + "VM ",
14373 + "LCD_LPCOE ",
14374 + "LCD_LPCREV ",
14375 + "LCD_LPCREVB",
14376 + "VD[0] ",
14377 + "VD[1] ",
14378 + "VD[2] ",
14379 + "VD[3] ",
14380 + "VD[4] ",
14381 + "VD[5] ",
14382 + "VD[6] ",
14383 + "VD[7] ",
14384 +};
14385 +static const char * funcs_c3[] = {
14386 + NULL,
14387 + NULL,
14388 + NULL,
14389 + NULL,
14390 + "I2SSDI ",
14391 + NULL,
14392 + NULL,
14393 + NULL,
14394 + NULL,
14395 + NULL,
14396 + NULL,
14397 + NULL,
14398 + NULL,
14399 + NULL,
14400 + NULL,
14401 + NULL,
14402 +};
14403 +
14404 +static const char * funcs_d2[] = {
14405 + "VD[8] ",
14406 + "VD[9] ",
14407 + "VD[10] ",
14408 + "VD[11] ",
14409 + "VD[12] ",
14410 + "VD[13] ",
14411 + "VD[14] ",
14412 + "VD[15] ",
14413 + "VD[16] ",
14414 + "VD[17] ",
14415 + "VD[18] ",
14416 + "VD[19] ",
14417 + "VD[20] ",
14418 + "VD[21] ",
14419 + "VD[22] ",
14420 + "VD[23] ",
14421 +};
14422 +static const char * funcs_d3[] = {
14423 + "nSPICS1 ",
14424 + "SPICLK1 ",
14425 + NULL,
14426 + NULL,
14427 + NULL,
14428 + NULL,
14429 + NULL,
14430 + NULL,
14431 + "SPIMISO1 ",
14432 + "SPIMOSI1 ",
14433 + "SPICLK1 ",
14434 + NULL,
14435 + NULL,
14436 + NULL,
14437 + "nSS1 ",
14438 + "nSS0 ",
14439 +};
14440 +
14441 +static const char * funcs_e2[] = {
14442 + "I2SLRCK ",
14443 + "I2SSCLK ",
14444 + "CDCLK ",
14445 + "I2SDI ",
14446 + "I2SDO ",
14447 + "SDCLK ",
14448 + "SDCMD ",
14449 + "SDDAT0 ",
14450 + "SDDAT1 ",
14451 + "SDDAT2 ",
14452 + "SDDAT3 ",
14453 + "SPIMISO0 ",
14454 + "SPIMOSI0 ",
14455 + "SPICLK0 ",
14456 + "IICSCL ",
14457 + "IICSDA ",
14458 +};
14459 +static const char * funcs_e3[] = {
14460 + NULL,
14461 + NULL,
14462 + NULL,
14463 + NULL,
14464 + NULL,
14465 + NULL,
14466 + NULL,
14467 + NULL,
14468 + NULL,
14469 + NULL,
14470 + NULL,
14471 + NULL,
14472 + NULL,
14473 + NULL,
14474 + NULL,
14475 + NULL,
14476 +};
14477 +
14478 +static const char * funcs_f2[] = {
14479 + "EINT[0] ",
14480 + "EINT[1] ",
14481 + "EINT[2] ",
14482 + "EINT[3] ",
14483 + "EINT[4] ",
14484 + "EINT[5] ",
14485 + "EINT[6] ",
14486 + "EINT[7] ",
14487 +};
14488 +static const char * funcs_f3[] = {
14489 + NULL,
14490 + NULL,
14491 + NULL,
14492 + NULL,
14493 + NULL,
14494 + NULL,
14495 + NULL,
14496 + NULL,
14497 +};
14498 +
14499 +
14500 +static const char * funcs_g2[] = {
14501 + "EINT[8] ",
14502 + "EINT[9] ",
14503 + "EINT[10] ",
14504 + "EINT[11] ",
14505 + "EINT[12] ",
14506 + "EINT[13] ",
14507 + "EINT[14] ",
14508 + "EINT[15] ",
14509 + "EINT[16] ",
14510 + "EINT[17] ",
14511 + "EINT[18] ",
14512 + "EINT[19] ",
14513 + "EINT[20] ",
14514 + "EINT[21] ",
14515 + "EINT[22] ",
14516 + "EINT[23] ",
14517 +};
14518 +static const char * funcs_g3[] = {
14519 + NULL,
14520 + NULL,
14521 + "nSS0 ",
14522 + "nSS1 ",
14523 + "LCD_PWRDN ",
14524 + "SPIMISO1 ",
14525 + "SPIMOSI1 ",
14526 + "SPICLK1 ",
14527 + NULL,
14528 + "nRTS1 ",
14529 + "nCTS1 ",
14530 + "TCLK[1] ",
14531 + "nSPICS0 ",
14532 + NULL,
14533 + NULL,
14534 + NULL,
14535 +};
14536 +
14537 +static const char * funcs_h2[] = {
14538 + "nCTS0 ",
14539 + "nRTS0 ",
14540 + "TXD[0] ",
14541 + "RXD[0] ",
14542 + "TXD[1] ",
14543 + "RXD[1] ",
14544 + "TXD[2] ",
14545 + "RXD[2] ",
14546 + "UEXTCLK ",
14547 + "CLKOUT0 ",
14548 + "CLKOUT1 ",
14549 +};
14550 +static const char * funcs_h3[] = {
14551 + NULL,
14552 + NULL,
14553 + NULL,
14554 + NULL,
14555 + NULL,
14556 + NULL,
14557 + "nRTS1 ",
14558 + "nCTS1 ",
14559 + NULL,
14560 + "nSPICS0 ",
14561 + NULL,
14562 +};
14563 +
14564 +static const char * funcs_j2[] = {
14565 + "CAMDATA[0] ",
14566 + "CAMDATA[1] ",
14567 + "CAMDATA[2] ",
14568 + "CAMDATA[3] ",
14569 + "CAMDATA[4] ",
14570 + "CAMDATA[5] ",
14571 + "CAMDATA[6] ",
14572 + "CAMDATA[7] ",
14573 + "CAMPCLK ",
14574 + "CAMVSYNC ",
14575 + "CAMHREF ",
14576 + "CAMCLKOUT ",
14577 + "CAMRESET ",
14578 +};
14579 +static const char * funcs_j3[] = {
14580 + NULL,
14581 + NULL,
14582 + NULL,
14583 + NULL,
14584 + NULL,
14585 + NULL,
14586 + NULL,
14587 + NULL,
14588 + NULL,
14589 + NULL,
14590 + NULL,
14591 + NULL,
14592 + NULL,
14593 +};
14594 +
14595 +/* used to dump GPIO states at suspend */
14596 +void s3c24xx_dump_gpio_states(void)
14597 +{
14598 + pretty_dump_a(__raw_readl(S3C2410_GPACON),
14599 + __raw_readl(S3C2410_GPADAT),
14600 + funcs_a, "GPA", 25);
14601 + pretty_dump(__raw_readl(S3C2410_GPBCON),
14602 + __raw_readl(S3C2410_GPBDAT),
14603 + __raw_readl(S3C2410_GPBUP),
14604 + funcs_b2, funcs_b3, "GPB", 11);
14605 + pretty_dump(__raw_readl(S3C2410_GPCCON),
14606 + __raw_readl(S3C2410_GPCDAT),
14607 + __raw_readl(S3C2410_GPCUP),
14608 + funcs_c2, funcs_c3, "GPC", 16);
14609 + pretty_dump(__raw_readl(S3C2410_GPDCON),
14610 + __raw_readl(S3C2410_GPDDAT),
14611 + __raw_readl(S3C2410_GPDUP),
14612 + funcs_d2, funcs_d3, "GPD", 16);
14613 + pretty_dump(__raw_readl(S3C2410_GPECON),
14614 + __raw_readl(S3C2410_GPEDAT),
14615 + __raw_readl(S3C2410_GPEUP),
14616 + funcs_e2, funcs_e3, "GPE", 16);
14617 + pretty_dump(__raw_readl(S3C2410_GPFCON),
14618 + __raw_readl(S3C2410_GPFDAT),
14619 + __raw_readl(S3C2410_GPFUP),
14620 + funcs_f2, funcs_f3, "GPF", 8);
14621 + pretty_dump(__raw_readl(S3C2410_GPGCON),
14622 + __raw_readl(S3C2410_GPGDAT),
14623 + __raw_readl(S3C2410_GPGUP),
14624 + funcs_g2, funcs_g3, "GPG", 16);
14625 + pretty_dump(__raw_readl(S3C2410_GPHCON),
14626 + __raw_readl(S3C2410_GPHDAT),
14627 + __raw_readl(S3C2410_GPHUP),
14628 + funcs_h2, funcs_h3, "GPH", 11);
14629 + pretty_dump(__raw_readl(S3C2440_GPJCON),
14630 + __raw_readl(S3C2440_GPJDAT),
14631 + __raw_readl(S3C2440_GPJUP),
14632 + funcs_j2, funcs_j3, "GPJ", 13);
14633 +
14634 +}
14635 +EXPORT_SYMBOL(s3c24xx_dump_gpio_states);
14636 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/irq.c
14637 ===================================================================
14638 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/irq.c 2008-12-11 22:46:07.000000000 +0100
14639 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/irq.c 2008-12-11 22:46:49.000000000 +0100
14640 @@ -133,12 +133,20 @@ static void
14641 s3c_irq_mask(unsigned int irqno)
14642 {
14643 unsigned long mask;
14644 -
14645 +#ifdef CONFIG_S3C2440_C_FIQ
14646 + unsigned long flags;
14647 +#endif
14648 irqno -= IRQ_EINT0;
14649 -
14650 +#ifdef CONFIG_S3C2440_C_FIQ
14651 + local_save_flags(flags);
14652 + local_fiq_disable();
14653 +#endif
14654 mask = __raw_readl(S3C2410_INTMSK);
14655 mask |= 1UL << irqno;
14656 __raw_writel(mask, S3C2410_INTMSK);
14657 +#ifdef CONFIG_S3C2440_C_FIQ
14658 + local_irq_restore(flags);
14659 +#endif
14660 }
14661
14662 static inline void
14663 @@ -155,9 +163,19 @@ s3c_irq_maskack(unsigned int irqno)
14664 {
14665 unsigned long bitval = 1UL << (irqno - IRQ_EINT0);
14666 unsigned long mask;
14667 +#ifdef CONFIG_S3C2440_C_FIQ
14668 + unsigned long flags;
14669 +#endif
14670
14671 +#ifdef CONFIG_S3C2440_C_FIQ
14672 + local_save_flags(flags);
14673 + local_fiq_disable();
14674 +#endif
14675 mask = __raw_readl(S3C2410_INTMSK);
14676 __raw_writel(mask|bitval, S3C2410_INTMSK);
14677 +#ifdef CONFIG_S3C2440_C_FIQ
14678 + local_irq_restore(flags);
14679 +#endif
14680
14681 __raw_writel(bitval, S3C2410_SRCPND);
14682 __raw_writel(bitval, S3C2410_INTPND);
14683 @@ -168,15 +186,25 @@ static void
14684 s3c_irq_unmask(unsigned int irqno)
14685 {
14686 unsigned long mask;
14687 +#ifdef CONFIG_S3C2440_C_FIQ
14688 + unsigned long flags;
14689 +#endif
14690
14691 if (irqno != IRQ_TIMER4 && irqno != IRQ_EINT8t23)
14692 irqdbf2("s3c_irq_unmask %d\n", irqno);
14693
14694 irqno -= IRQ_EINT0;
14695
14696 +#ifdef CONFIG_S3C2440_C_FIQ
14697 + local_save_flags(flags);
14698 + local_fiq_disable();
14699 +#endif
14700 mask = __raw_readl(S3C2410_INTMSK);
14701 mask &= ~(1UL << irqno);
14702 __raw_writel(mask, S3C2410_INTMSK);
14703 +#ifdef CONFIG_S3C2440_C_FIQ
14704 + local_irq_restore(flags);
14705 +#endif
14706 }
14707
14708 struct irq_chip s3c_irq_level_chip = {
14709 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/Kconfig
14710 ===================================================================
14711 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/Kconfig 2008-12-11 22:46:07.000000000 +0100
14712 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/Kconfig 2008-12-11 22:46:49.000000000 +0100
14713 @@ -16,7 +16,7 @@ if PLAT_S3C24XX
14714
14715 config CPU_S3C244X
14716 bool
14717 - depends on ARCH_S3C2410 && (CPU_S3C2440 || CPU_S3C2442)
14718 + default y if CPU_S3C2440 || CPU_S3C2442
14719 help
14720 Support for S3C2440 and S3C2442 Samsung Mobile CPU based systems.
14721
14722 @@ -46,4 +46,9 @@ config MACH_SMDK
14723 help
14724 Common machine code for SMDK2410 and SMDK2440
14725
14726 +config MACH_NEO1973
14727 + bool
14728 + help
14729 + Common machine code for Neo1973 hardware
14730 +
14731 endif
14732 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/Makefile
14733 ===================================================================
14734 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/Makefile 2008-12-11 22:46:07.000000000 +0100
14735 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/Makefile 2008-12-11 22:46:49.000000000 +0100
14736 @@ -28,3 +28,11 @@ obj-$(CONFIG_PM) += pm.o
14737 obj-$(CONFIG_PM) += sleep.o
14738 obj-$(CONFIG_S3C2410_DMA) += dma.o
14739 obj-$(CONFIG_MACH_SMDK) += common-smdk.o
14740 +obj-$(CONFIG_MACH_NEO1973) += neo1973_version.o \
14741 + neo1973_pm_host.o \
14742 + neo1973_pm_gsm.o \
14743 + neo1973_pm_gps.o \
14744 + neo1973_pm_bt.o \
14745 + neo1973_shadow.o \
14746 + neo1973_pm_resume_reason.o \
14747 + neo1973_memconfig.o
14748 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_memconfig.c
14749 ===================================================================
14750 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
14751 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_memconfig.c 2008-12-11 22:46:49.000000000 +0100
14752 @@ -0,0 +1,186 @@
14753 +/*
14754 + * Memory access timing control sysfs for the s3c24xx based device
14755 + *
14756 + * (C) 2008 by Openmoko Inc.
14757 + * Author: Andy Green <andy@openmoko.com>
14758 + * All rights reserved.
14759 + *
14760 + * This program is free software; you can redistribute it and/or modify
14761 + * it under the terms of the GNU General Public License version 2 as
14762 + * published by the Free Software Foundation
14763 + *
14764 + */
14765 +
14766 +#include <linux/module.h>
14767 +#include <linux/init.h>
14768 +#include <linux/kernel.h>
14769 +#include <linux/platform_device.h>
14770 +
14771 +#include <asm/hardware.h>
14772 +#include <asm/mach-types.h>
14773 +#include <asm/arch/regs-mem.h>
14774 +
14775 +static ssize_t neo1973_memconfig_read(struct device *dev,
14776 + struct device_attribute *attr, char *buf)
14777 +{
14778 + int index = attr->attr.name[strlen(attr->attr.name) - 1] - '0';
14779 + u32 reg = *((u32 *)(S3C2410_MEMREG(((index + 1) << 2))));
14780 + static const char *meaning[][8] = {
14781 + {
14782 + [0] = "normal (1 data)",
14783 + [1] = "4 data",
14784 + [2] = "8 data",
14785 + [3] = "16 data",
14786 + }, {
14787 + [0] = "2 clocks",
14788 + [1] = "3 clocks",
14789 + [2] = "4 clocks",
14790 + [3] = "6 clocks",
14791 + }, {
14792 + [0] = "0 clocks",
14793 + [1] = "1 clock",
14794 + [2] = "2 clocks",
14795 + [3] = "4 clocks",
14796 + }, {
14797 + [0] = "1 clock",
14798 + [1] = "2 clocks",
14799 + [2] = "3 clocks",
14800 + [3] = "4 clocks",
14801 + [4] = "6 clocks",
14802 + [5] = "8 clocks",
14803 + [6] = "10 clocks",
14804 + [7] = "14 clocks",
14805 + }, { /* after this, only for CS6 and CS7 */
14806 + [0] = "ROM / SRAM",
14807 + [1] = "(illegal)",
14808 + [2] = "(illegal)",
14809 + [3] = "Sync DRAM",
14810 + }, {
14811 + [0] = "8 Column bits",
14812 + [1] = "9 Column bits",
14813 + [2] = "10 Column bits",
14814 + [3] = "(illegal)",
14815 + }, {
14816 + [0] = "2 clocks",
14817 + [1] = "3 clocks",
14818 + [2] = "4 clocks",
14819 + [3] = "(illegal)",
14820 + }
14821 + };
14822 +
14823 + if (index >= 6)
14824 + if (((reg >> 15) & 3) == 3) /* DRAM */
14825 + return sprintf(buf, "BANKCON%d = 0x%08X\n DRAM:\n"
14826 + " Trcd = %s\n SCAN = %s\n", index,
14827 + reg, meaning[5][reg & 3],
14828 + meaning[1][(reg >> 2) & 3]);
14829 +
14830 + return sprintf(buf, "BANKCON%d = 0x%08X\n Type = %s\n PMC = %s\n"
14831 + " Tacp = %s\n Tcah = %s\n Tcoh = %s\n Tacc = %s\n"
14832 + " Tcos = %s\n Tacs = %s\n",
14833 + index, reg, meaning[4][(reg >> 15) & 3],
14834 + meaning[0][reg & 3],
14835 + meaning[1][(reg >> 2) & 3],
14836 + meaning[2][(reg >> 4) & 3],
14837 + meaning[2][(reg >> 6) & 3],
14838 + meaning[3][(reg >> 8) & 7],
14839 + meaning[2][(reg >> 11) & 3],
14840 + meaning[2][(reg >> 13) & 3]);
14841 +}
14842 +
14843 +static ssize_t neo1973_memconfig_write(struct device *dev,
14844 + struct device_attribute *attr, const char *buf, size_t count)
14845 +{
14846 + int index = attr->attr.name[strlen(attr->attr.name) - 1] - '0';
14847 + unsigned long val = simple_strtoul(buf, NULL, 16);
14848 +
14849 + dev_info(dev, "setting BANKCON%d <- 0x%08X\n", index, (u32)val);
14850 +
14851 + *((u32 *)(S3C2410_MEMREG(((index + 1) << 2)))) = (u32)val;
14852 +
14853 + return count;
14854 +}
14855 +
14856 +
14857 +static DEVICE_ATTR(BANKCON0, 0644, neo1973_memconfig_read,
14858 + neo1973_memconfig_write);
14859 +static DEVICE_ATTR(BANKCON1, 0644, neo1973_memconfig_read,
14860 + neo1973_memconfig_write);
14861 +static DEVICE_ATTR(BANKCON2, 0644, neo1973_memconfig_read,
14862 + neo1973_memconfig_write);
14863 +static DEVICE_ATTR(BANKCON3, 0644, neo1973_memconfig_read,
14864 + neo1973_memconfig_write);
14865 +static DEVICE_ATTR(BANKCON4, 0644, neo1973_memconfig_read,
14866 + neo1973_memconfig_write);
14867 +static DEVICE_ATTR(BANKCON5, 0644, neo1973_memconfig_read,
14868 + neo1973_memconfig_write);
14869 +static DEVICE_ATTR(BANKCON6, 0644, neo1973_memconfig_read,
14870 + neo1973_memconfig_write);
14871 +static DEVICE_ATTR(BANKCON7, 0644, neo1973_memconfig_read,
14872 + neo1973_memconfig_write);
14873 +
14874 +static struct attribute *neo1973_memconfig_sysfs_entries[] = {
14875 + &dev_attr_BANKCON0.attr,
14876 + &dev_attr_BANKCON1.attr,
14877 + &dev_attr_BANKCON2.attr,
14878 + &dev_attr_BANKCON3.attr,
14879 + &dev_attr_BANKCON4.attr,
14880 + &dev_attr_BANKCON5.attr,
14881 + &dev_attr_BANKCON6.attr,
14882 + &dev_attr_BANKCON7.attr,
14883 + NULL
14884 +};
14885 +
14886 +static struct attribute_group neo1973_memconfig_attr_group = {
14887 + .name = NULL,
14888 + .attrs = neo1973_memconfig_sysfs_entries,
14889 +};
14890 +
14891 +static int __init neo1973_memconfig_probe(struct platform_device *pdev)
14892 +{
14893 + dev_info(&pdev->dev, "starting\n");
14894 +
14895 + switch (machine_arch_type) {
14896 +#ifdef CONFIG_MACH_NEO1973_GTA01
14897 + case MACH_TYPE_NEO1973_GTA01:
14898 + return -EINVAL;
14899 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
14900 + default:
14901 + break;
14902 + }
14903 +
14904 + return sysfs_create_group(&pdev->dev.kobj,
14905 + &neo1973_memconfig_attr_group);
14906 +}
14907 +
14908 +static int neo1973_memconfig_remove(struct platform_device *pdev)
14909 +{
14910 + sysfs_remove_group(&pdev->dev.kobj, &neo1973_memconfig_attr_group);
14911 + return 0;
14912 +}
14913 +
14914 +static struct platform_driver neo1973_memconfig_driver = {
14915 + .probe = neo1973_memconfig_probe,
14916 + .remove = neo1973_memconfig_remove,
14917 + .driver = {
14918 + .name = "neo1973-memconfig",
14919 + },
14920 +};
14921 +
14922 +static int __devinit neo1973_memconfig_init(void)
14923 +{
14924 + return platform_driver_register(&neo1973_memconfig_driver);
14925 +}
14926 +
14927 +static void neo1973_memconfig_exit(void)
14928 +{
14929 + platform_driver_unregister(&neo1973_memconfig_driver);
14930 +}
14931 +
14932 +module_init(neo1973_memconfig_init);
14933 +module_exit(neo1973_memconfig_exit);
14934 +
14935 +MODULE_LICENSE("GPL");
14936 +MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
14937 +MODULE_DESCRIPTION("neo1973 memconfig");
14938 +
14939 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_bt.c
14940 ===================================================================
14941 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
14942 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_bt.c 2008-12-11 22:46:49.000000000 +0100
14943 @@ -0,0 +1,265 @@
14944 +/*
14945 + * Bluetooth PM code for the FIC Neo1973 GSM Phone
14946 + *
14947 + * (C) 2007 by Openmoko Inc.
14948 + * Author: Harald Welte <laforge@openmoko.org>
14949 + * All rights reserved.
14950 + *
14951 + * This program is free software; you can redistribute it and/or modify
14952 + * it under the terms of the GNU General Public License version 2 as
14953 + * published by the Free Software Foundation
14954 + *
14955 + */
14956 +
14957 +#include <linux/module.h>
14958 +#include <linux/init.h>
14959 +#include <linux/kernel.h>
14960 +#include <linux/platform_device.h>
14961 +
14962 +#include <asm/hardware.h>
14963 +#include <asm/mach-types.h>
14964 +#include <asm/plat-s3c24xx/neo1973.h>
14965 +
14966 +#ifdef CONFIG_MACH_NEO1973_GTA01
14967 +#include <asm/arch/gta01.h>
14968 +#include <linux/pcf50606.h>
14969 +#endif
14970 +
14971 +#ifdef CONFIG_MACH_NEO1973_GTA02
14972 +#include <asm/arch/gta02.h>
14973 +#include <linux/pcf50633.h>
14974 +#endif
14975 +
14976 +#ifdef CONFIG_MACH_M800
14977 +#include <asm/arch/glofiish.h>
14978 +#endif
14979 +
14980 +#define DRVMSG "FIC Neo1973 Bluetooth Power Management"
14981 +
14982 +static ssize_t bt_read(struct device *dev, struct device_attribute *attr,
14983 + char *buf)
14984 +{
14985 + if (!strcmp(attr->attr.name, "power_on")) {
14986 + switch (machine_arch_type) {
14987 +
14988 +#ifdef CONFIG_MACH_NEO1973_GTA01
14989 + case MACH_TYPE_NEO1973_GTA01:
14990 + if (pcf50606_onoff_get(pcf50606_global,
14991 + PCF50606_REGULATOR_D1REG) &&
14992 + pcf50606_voltage_get(pcf50606_global,
14993 + PCF50606_REGULATOR_D1REG) == 3100)
14994 + goto out_1;
14995 + break;
14996 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
14997 +
14998 +#ifdef CONFIG_MACH_NEO1973_GTA02
14999 + case MACH_TYPE_NEO1973_GTA02:
15000 + if (s3c2410_gpio_getpin(GTA02_GPIO_BT_EN))
15001 + goto out_1;
15002 + break;
15003 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15004 +
15005 +#ifdef CONFIG_MACH_M800
15006 + case MACH_TYPE_M800:
15007 + if (s3c2410_gpio_getpin(M800_GPIO_BT_POWER_1) &&
15008 + s3c2410_gpio_getpin(M800_GPIO_BT_POWER_2))
15009 + goto out_1;
15010 + break;
15011 +#endif /* CONFIG_MACH_M800 */
15012 +
15013 + }
15014 + } else if (!strcmp(attr->attr.name, "reset")) {
15015 + switch (machine_arch_type) {
15016 +
15017 +#ifdef CONFIG_MACH_NEO1973_GTA01
15018 + case MACH_TYPE_NEO1973_GTA01:
15019 + if (s3c2410_gpio_getpin(GTA01_GPIO_BT_EN) == 0)
15020 + goto out_1;
15021 + break;
15022 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15023 +
15024 +#ifdef CONFIG_MACH_NEO1973_GTA02
15025 + case MACH_TYPE_NEO1973_GTA02:
15026 + if (s3c2410_gpio_getpin(GTA02_GPIO_BT_EN) == 0)
15027 + goto out_1;
15028 + break;
15029 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15030 +
15031 + }
15032 + }
15033 +
15034 + return strlcpy(buf, "0\n", 3);
15035 +out_1:
15036 + return strlcpy(buf, "1\n", 3);
15037 +}
15038 +
15039 +static ssize_t bt_write(struct device *dev, struct device_attribute *attr,
15040 + const char *buf, size_t count)
15041 +{
15042 + unsigned long on = simple_strtoul(buf, NULL, 10);
15043 + unsigned int vol;
15044 +
15045 + if (!strcmp(attr->attr.name, "power_on")) {
15046 + switch (machine_arch_type) {
15047 +
15048 +#ifdef CONFIG_MACH_NEO1973_GTA01
15049 + case MACH_TYPE_NEO1973_GTA01:
15050 + /* if we are powering up, assert reset, then power,
15051 + * then release reset */
15052 + if (on) {
15053 + neo1973_gpb_setpin(GTA01_GPIO_BT_EN, 0);
15054 + pcf50606_voltage_set(pcf50606_global,
15055 + PCF50606_REGULATOR_D1REG,
15056 + 3100);
15057 + }
15058 + pcf50606_onoff_set(pcf50606_global,
15059 + PCF50606_REGULATOR_D1REG, on);
15060 + neo1973_gpb_setpin(GTA01_GPIO_BT_EN, on);
15061 + break;
15062 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15063 +
15064 +#ifdef CONFIG_MACH_NEO1973_GTA02
15065 + case MACH_TYPE_NEO1973_GTA02:
15066 + neo1973_gpb_setpin(GTA02_GPIO_BT_EN, on ? 0 : 1);
15067 + if (on)
15068 + pcf50633_voltage_set(pcf50633_global,
15069 + PCF50633_REGULATOR_LDO4, 3200);
15070 + pcf50633_onoff_set(pcf50633_global,
15071 + PCF50633_REGULATOR_LDO4, on);
15072 + vol = pcf50633_voltage_get(pcf50633_global,
15073 + PCF50633_REGULATOR_LDO4);
15074 + dev_info(dev, "GTA02 Set PCF50633 LDO4 = %d\n", vol);
15075 + break;
15076 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15077 +
15078 +#ifdef CONFIG_MACH_M800
15079 + case MACH_TYPE_M800:
15080 + s3c2410_gpio_setpin(M800_GPIO_BT_POWER_1, on);
15081 + s3c2410_gpio_setpin(M800_GPIO_BT_POWER_2, on);
15082 + break;
15083 +#endif /* CONFIG_MACH_M800 */
15084 + }
15085 + } else if (!strcmp(attr->attr.name, "reset")) {
15086 + /* reset is low-active, so we need to invert */
15087 + switch (machine_arch_type) {
15088 +
15089 +#ifdef CONFIG_MACH_NEO1973_GTA01
15090 + case MACH_TYPE_NEO1973_GTA01:
15091 + neo1973_gpb_setpin(GTA01_GPIO_BT_EN, on ? 0 : 1);
15092 + break;
15093 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15094 +
15095 +#ifdef CONFIG_MACH_NEO1973_GTA02
15096 + case MACH_TYPE_NEO1973_GTA02:
15097 + neo1973_gpb_setpin(GTA02_GPIO_BT_EN, on ? 0 : 1);
15098 + break;
15099 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15100 +
15101 + }
15102 + }
15103 +
15104 + return count;
15105 +}
15106 +
15107 +static DEVICE_ATTR(power_on, 0644, bt_read, bt_write);
15108 +static DEVICE_ATTR(reset, 0644, bt_read, bt_write);
15109 +
15110 +#ifdef CONFIG_PM
15111 +static int gta01_bt_suspend(struct platform_device *pdev, pm_message_t state)
15112 +{
15113 + dev_dbg(&pdev->dev, DRVMSG ": suspending\n");
15114 + /* FIXME: The PMU should save the PMU status, and the GPIO code should
15115 + * preserve the GPIO level, so there shouldn't be anything left to do
15116 + * for us, should there? */
15117 +
15118 + return 0;
15119 +}
15120 +
15121 +static int gta01_bt_resume(struct platform_device *pdev)
15122 +{
15123 + dev_dbg(&pdev->dev, DRVMSG ": resuming\n");
15124 +
15125 + return 0;
15126 +}
15127 +#else
15128 +#define gta01_bt_suspend NULL
15129 +#define gta01_bt_resume NULL
15130 +#endif
15131 +
15132 +static struct attribute *gta01_bt_sysfs_entries[] = {
15133 + &dev_attr_power_on.attr,
15134 + &dev_attr_reset.attr,
15135 + NULL
15136 +};
15137 +
15138 +static struct attribute_group gta01_bt_attr_group = {
15139 + .name = NULL,
15140 + .attrs = gta01_bt_sysfs_entries,
15141 +};
15142 +
15143 +static int __init gta01_bt_probe(struct platform_device *pdev)
15144 +{
15145 + dev_info(&pdev->dev, DRVMSG ": starting\n");
15146 +
15147 + switch (machine_arch_type) {
15148 +
15149 +#ifdef CONFIG_MACH_NEO1973_GTA01
15150 + case MACH_TYPE_NEO1973_GTA01:
15151 + /* we make sure that the voltage is off */
15152 + pcf50606_onoff_set(pcf50606_global,
15153 + PCF50606_REGULATOR_D1REG, 0);
15154 + /* we pull reset to low to make sure that the chip doesn't
15155 + * drain power through the reset line */
15156 + neo1973_gpb_setpin(GTA01_GPIO_BT_EN, 0);
15157 + break;
15158 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15159 +
15160 +#ifdef CONFIG_MACH_NEO1973_GTA02
15161 + case MACH_TYPE_NEO1973_GTA02:
15162 + /* we make sure that the voltage is off */
15163 + pcf50633_onoff_set(pcf50633_global,
15164 + PCF50633_REGULATOR_LDO4, 0);
15165 + /* we pull reset to low to make sure that the chip doesn't
15166 + * drain power through the reset line */
15167 + neo1973_gpb_setpin(GTA02_GPIO_BT_EN, 0);
15168 + break;
15169 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15170 +
15171 + }
15172 +
15173 + return sysfs_create_group(&pdev->dev.kobj, &gta01_bt_attr_group);
15174 +}
15175 +
15176 +static int gta01_bt_remove(struct platform_device *pdev)
15177 +{
15178 + sysfs_remove_group(&pdev->dev.kobj, &gta01_bt_attr_group);
15179 +
15180 + return 0;
15181 +}
15182 +
15183 +static struct platform_driver gta01_bt_driver = {
15184 + .probe = gta01_bt_probe,
15185 + .remove = gta01_bt_remove,
15186 + .suspend = gta01_bt_suspend,
15187 + .resume = gta01_bt_resume,
15188 + .driver = {
15189 + .name = "neo1973-pm-bt",
15190 + },
15191 +};
15192 +
15193 +static int __devinit gta01_bt_init(void)
15194 +{
15195 + return platform_driver_register(&gta01_bt_driver);
15196 +}
15197 +
15198 +static void gta01_bt_exit(void)
15199 +{
15200 + platform_driver_unregister(&gta01_bt_driver);
15201 +}
15202 +
15203 +module_init(gta01_bt_init);
15204 +module_exit(gta01_bt_exit);
15205 +
15206 +MODULE_LICENSE("GPL");
15207 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
15208 +MODULE_DESCRIPTION(DRVMSG);
15209 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_gps.c
15210 ===================================================================
15211 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
15212 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_gps.c 2008-12-11 22:46:49.000000000 +0100
15213 @@ -0,0 +1,689 @@
15214 +/*
15215 + * GPS Power Management code for the FIC Neo1973 GSM Phone
15216 + *
15217 + * (C) 2007 by Openmoko Inc.
15218 + * Author: Harald Welte <laforge@openmoko.org>
15219 + * All rights reserved.
15220 + *
15221 + * This program is free software; you can redistribute it and/or modify
15222 + * it under the terms of the GNU General Public License version 2 as
15223 + * published by the Free Software Foundation
15224 + *
15225 + */
15226 +
15227 +#include <linux/module.h>
15228 +#include <linux/init.h>
15229 +#include <linux/kernel.h>
15230 +#include <linux/delay.h>
15231 +#include <linux/platform_device.h>
15232 +
15233 +#include <asm/hardware.h>
15234 +
15235 +#include <asm/mach-types.h>
15236 +
15237 +#include <asm/plat-s3c24xx/neo1973.h>
15238 +
15239 +#ifdef CONFIG_MACH_NEO1973_GTA01
15240 +#include <asm/arch/gta01.h>
15241 +#include <linux/pcf50606.h>
15242 +#endif
15243 +
15244 +#ifdef CONFIG_MACH_NEO1973_GTA02
15245 +#include <asm/arch/gta02.h>
15246 +#include <linux/pcf50633.h>
15247 +#endif
15248 +
15249 +struct neo1973_pm_gps_data {
15250 + int power_was_on;
15251 +};
15252 +
15253 +static struct neo1973_pm_gps_data neo1973_gps;
15254 +
15255 +int neo1973_pm_gps_is_on(void)
15256 +{
15257 + return neo1973_gps.power_was_on;
15258 +}
15259 +EXPORT_SYMBOL_GPL(neo1973_pm_gps_is_on);
15260 +
15261 +/* This is the 2.8V supply for the RTC crystal, the mail clock crystal and
15262 + * the input to VDD_RF */
15263 +static void gps_power_2v8_set(int on)
15264 +{
15265 + switch (system_rev) {
15266 + case GTA01v3_SYSTEM_REV:
15267 + case GTA01v4_SYSTEM_REV:
15268 + if (on)
15269 + pcf50606_voltage_set(pcf50606_global,
15270 + PCF50606_REGULATOR_IOREG, 2800);
15271 + pcf50606_onoff_set(pcf50606_global,
15272 + PCF50606_REGULATOR_IOREG, on);
15273 + break;
15274 + case GTA01Bv2_SYSTEM_REV:
15275 + s3c2410_gpio_setpin(GTA01_GPIO_GPS_EN_2V8, on);
15276 + break;
15277 + case GTA01Bv3_SYSTEM_REV:
15278 + case GTA01Bv4_SYSTEM_REV:
15279 + break;
15280 + }
15281 +}
15282 +
15283 +static int gps_power_2v8_get(void)
15284 +{
15285 + int ret = 0;
15286 +
15287 + switch (system_rev) {
15288 + case GTA01v3_SYSTEM_REV:
15289 + case GTA01v4_SYSTEM_REV:
15290 + if (pcf50606_onoff_get(pcf50606_global,
15291 + PCF50606_REGULATOR_IOREG) &&
15292 + pcf50606_voltage_get(pcf50606_global,
15293 + PCF50606_REGULATOR_IOREG) == 2800)
15294 + ret = 1;
15295 + break;
15296 + case GTA01Bv2_SYSTEM_REV:
15297 + if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_EN_2V8))
15298 + ret = 1;
15299 + break;
15300 + case GTA01Bv3_SYSTEM_REV:
15301 + case GTA01Bv4_SYSTEM_REV:
15302 + break;
15303 + }
15304 +
15305 + return ret;
15306 +}
15307 +
15308 +/* This is the 3V supply (AVDD) for the external RF frontend (LNA bias) */
15309 +static void gps_power_3v_set(int on)
15310 +{
15311 + switch (system_rev) {
15312 + case GTA01v3_SYSTEM_REV:
15313 + case GTA01v4_SYSTEM_REV:
15314 + if (on)
15315 + pcf50606_voltage_set(pcf50606_global,
15316 + PCF50606_REGULATOR_D1REG, 3000);
15317 + pcf50606_onoff_set(pcf50606_global,
15318 + PCF50606_REGULATOR_D1REG, on);
15319 + break;
15320 + case GTA01Bv2_SYSTEM_REV:
15321 + case GTA01Bv3_SYSTEM_REV:
15322 + case GTA01Bv4_SYSTEM_REV:
15323 + s3c2410_gpio_setpin(GTA01_GPIO_GPS_EN_3V, on);
15324 + break;
15325 + }
15326 +}
15327 +
15328 +static int gps_power_3v_get(void)
15329 +{
15330 + int ret = 0;
15331 +
15332 + switch (system_rev) {
15333 + case GTA01v3_SYSTEM_REV:
15334 + case GTA01v4_SYSTEM_REV:
15335 + if (pcf50606_onoff_get(pcf50606_global,
15336 + PCF50606_REGULATOR_D1REG) &&
15337 + pcf50606_voltage_get(pcf50606_global,
15338 + PCF50606_REGULATOR_D1REG) == 3000)
15339 + ret = 1;
15340 + break;
15341 + case GTA01Bv2_SYSTEM_REV:
15342 + case GTA01Bv3_SYSTEM_REV:
15343 + case GTA01Bv4_SYSTEM_REV:
15344 + if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_EN_3V))
15345 + ret = 1;
15346 + break;
15347 + }
15348 +
15349 + return ret;
15350 +}
15351 +
15352 +/* This is the 3.3V supply for VDD_IO and VDD_LPREG input */
15353 +static void gps_power_3v3_set(int on)
15354 +{
15355 + switch (system_rev) {
15356 + case GTA01v3_SYSTEM_REV:
15357 + case GTA01v4_SYSTEM_REV:
15358 + case GTA01Bv2_SYSTEM_REV:
15359 + if (on)
15360 + pcf50606_voltage_set(pcf50606_global,
15361 + PCF50606_REGULATOR_DCD, 3300);
15362 + pcf50606_onoff_set(pcf50606_global,
15363 + PCF50606_REGULATOR_DCD, on);
15364 + break;
15365 + case GTA01Bv3_SYSTEM_REV:
15366 + case GTA01Bv4_SYSTEM_REV:
15367 + s3c2410_gpio_setpin(GTA01_GPIO_GPS_EN_3V3, on);
15368 + break;
15369 + }
15370 +}
15371 +
15372 +static int gps_power_3v3_get(void)
15373 +{
15374 + int ret = 0;
15375 +
15376 + switch (system_rev) {
15377 + case GTA01v3_SYSTEM_REV:
15378 + case GTA01v4_SYSTEM_REV:
15379 + case GTA01Bv2_SYSTEM_REV:
15380 + if (pcf50606_onoff_get(pcf50606_global,
15381 + PCF50606_REGULATOR_DCD) &&
15382 + pcf50606_voltage_get(pcf50606_global,
15383 + PCF50606_REGULATOR_DCD) == 3300)
15384 + ret = 1;
15385 + break;
15386 + case GTA01Bv3_SYSTEM_REV:
15387 + case GTA01Bv4_SYSTEM_REV:
15388 + if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_EN_3V3))
15389 + ret = 1;
15390 + break;
15391 + }
15392 +
15393 + return ret;
15394 +}
15395 +
15396 +/* This is the 2.5V supply for VDD_PLLREG and VDD_COREREG input */
15397 +static void gps_power_2v5_set(int on)
15398 +{
15399 + switch (system_rev) {
15400 + case GTA01v3_SYSTEM_REV:
15401 + /* This is CORE_1V8 and cannot be disabled */
15402 + break;
15403 + case GTA01v4_SYSTEM_REV:
15404 + case GTA01Bv2_SYSTEM_REV:
15405 + case GTA01Bv3_SYSTEM_REV:
15406 + case GTA01Bv4_SYSTEM_REV:
15407 + if (on)
15408 + pcf50606_voltage_set(pcf50606_global,
15409 + PCF50606_REGULATOR_D2REG, 2500);
15410 + pcf50606_onoff_set(pcf50606_global,
15411 + PCF50606_REGULATOR_D2REG, on);
15412 + break;
15413 + }
15414 +}
15415 +
15416 +static int gps_power_2v5_get(void)
15417 +{
15418 + int ret = 0;
15419 +
15420 + switch (system_rev) {
15421 + case GTA01v3_SYSTEM_REV:
15422 + /* This is CORE_1V8 and cannot be disabled */
15423 + ret = 1;
15424 + break;
15425 + case GTA01v4_SYSTEM_REV:
15426 + case GTA01Bv2_SYSTEM_REV:
15427 + case GTA01Bv3_SYSTEM_REV:
15428 + case GTA01Bv4_SYSTEM_REV:
15429 + if (pcf50606_onoff_get(pcf50606_global,
15430 + PCF50606_REGULATOR_D2REG) &&
15431 + pcf50606_voltage_get(pcf50606_global,
15432 + PCF50606_REGULATOR_D2REG) == 2500)
15433 + ret = 1;
15434 + break;
15435 + }
15436 +
15437 + return ret;
15438 +}
15439 +
15440 +/* This is the 1.5V supply for VDD_CORE */
15441 +static void gps_power_1v5_set(int on)
15442 +{
15443 + switch (system_rev) {
15444 + case GTA01v3_SYSTEM_REV:
15445 + case GTA01v4_SYSTEM_REV:
15446 + case GTA01Bv2_SYSTEM_REV:
15447 + /* This is switched via 2v5 */
15448 + break;
15449 + case GTA01Bv3_SYSTEM_REV:
15450 + case GTA01Bv4_SYSTEM_REV:
15451 + if (on)
15452 + pcf50606_voltage_set(pcf50606_global,
15453 + PCF50606_REGULATOR_DCD, 1500);
15454 + pcf50606_onoff_set(pcf50606_global,
15455 + PCF50606_REGULATOR_DCD, on);
15456 + break;
15457 + }
15458 +}
15459 +
15460 +static int gps_power_1v5_get(void)
15461 +{
15462 + int ret = 0;
15463 +
15464 + switch (system_rev) {
15465 + case GTA01v3_SYSTEM_REV:
15466 + case GTA01v4_SYSTEM_REV:
15467 + case GTA01Bv2_SYSTEM_REV:
15468 + /* This is switched via 2v5 */
15469 + ret = 1;
15470 + break;
15471 + case GTA01Bv3_SYSTEM_REV:
15472 + case GTA01Bv4_SYSTEM_REV:
15473 + if (pcf50606_onoff_get(pcf50606_global,
15474 + PCF50606_REGULATOR_DCD) &&
15475 + pcf50606_voltage_get(pcf50606_global,
15476 + PCF50606_REGULATOR_DCD) == 1500)
15477 + ret = 1;
15478 + break;
15479 + }
15480 +
15481 + return ret;
15482 +}
15483 +
15484 +/* This is the POWERON pin */
15485 +static void gps_pwron_set(int on)
15486 +{
15487 +
15488 + neo1973_gps.power_was_on = !!on;
15489 +
15490 +#ifdef CONFIG_MACH_NEO1973_GTA01
15491 + if (machine_is_neo1973_gta01())
15492 + neo1973_gpb_setpin(GTA01_GPIO_GPS_PWRON, on);
15493 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15494 +
15495 +#ifdef CONFIG_MACH_NEO1973_GTA02
15496 + if (machine_is_neo1973_gta02()) {
15497 + if (on) {
15498 + pcf50633_voltage_set(pcf50633_global,
15499 + PCF50633_REGULATOR_LDO5, 3000);
15500 + /* return UART pins to being UART pins */
15501 + s3c2410_gpio_cfgpin(S3C2410_GPH4, S3C2410_GPH4_TXD1);
15502 + /* remove pulldown now it won't be floating any more */
15503 + s3c2410_gpio_pullup(S3C2410_GPH5, 0);
15504 + } else {
15505 + /*
15506 + * take care not to power unpowered GPS from UART TX
15507 + * return them to GPIO and force low
15508 + */
15509 + s3c2410_gpio_cfgpin(S3C2410_GPH4, S3C2410_GPH4_OUTP);
15510 + s3c2410_gpio_setpin(S3C2410_GPH4, 0);
15511 + /* don't let RX from unpowered GPS float */
15512 + s3c2410_gpio_pullup(S3C2410_GPH5, 1);
15513 + }
15514 + pcf50633_onoff_set(pcf50633_global,
15515 + PCF50633_REGULATOR_LDO5, on);
15516 + }
15517 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15518 +}
15519 +
15520 +static int gps_pwron_get(void)
15521 +{
15522 +#ifdef CONFIG_MACH_NEO1973_GTA01
15523 + if (machine_is_neo1973_gta01())
15524 + return !!s3c2410_gpio_getpin(GTA01_GPIO_GPS_PWRON);
15525 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15526 +
15527 +#ifdef CONFIG_MACH_NEO1973_GTA02
15528 + if (machine_is_neo1973_gta02())
15529 + return !!pcf50633_onoff_get(pcf50633_global,
15530 + PCF50633_REGULATOR_LDO5);
15531 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15532 + return -1;
15533 +}
15534 +
15535 +/* This is the nRESET pin */
15536 +static void gps_rst_set(int on)
15537 +{
15538 + switch (system_rev) {
15539 + case GTA01v3_SYSTEM_REV:
15540 + pcf50606_gpo0_set(pcf50606_global, on);
15541 + break;
15542 + case GTA01v4_SYSTEM_REV:
15543 + case GTA01Bv2_SYSTEM_REV:
15544 + case GTA01Bv3_SYSTEM_REV:
15545 + case GTA01Bv4_SYSTEM_REV:
15546 + s3c2410_gpio_setpin(GTA01_GPIO_GPS_RESET, on);
15547 + break;
15548 + }
15549 +}
15550 +
15551 +static int gps_rst_get(void)
15552 +{
15553 + switch (system_rev) {
15554 + case GTA01v3_SYSTEM_REV:
15555 + if (pcf50606_gpo0_get(pcf50606_global))
15556 + return 1;
15557 + break;
15558 + case GTA01v4_SYSTEM_REV:
15559 + case GTA01Bv2_SYSTEM_REV:
15560 + case GTA01Bv3_SYSTEM_REV:
15561 + case GTA01Bv4_SYSTEM_REV:
15562 + if (s3c2410_gpio_getpin(GTA01_GPIO_GPS_RESET))
15563 + return 1;
15564 + break;
15565 + }
15566 +
15567 + return 0;
15568 +}
15569 +
15570 +static ssize_t power_gps_read(struct device *dev,
15571 + struct device_attribute *attr, char *buf)
15572 +{
15573 + int ret = 0;
15574 +
15575 + if (!strcmp(attr->attr.name, "power_tcxo_2v8")) {
15576 + ret = gps_power_2v8_get();
15577 + } else if (!strcmp(attr->attr.name, "power_avdd_3v")) {
15578 + ret = gps_power_3v_get();
15579 + } else if (!strcmp(attr->attr.name, "pwron")) {
15580 + ret = gps_pwron_get();
15581 + } else if (!strcmp(attr->attr.name, "reset")) {
15582 + ret = gps_rst_get();
15583 + } else if (!strcmp(attr->attr.name, "power_lp_io_3v3")) {
15584 + ret = gps_power_3v3_get();
15585 + } else if (!strcmp(attr->attr.name, "power_pll_core_2v5")) {
15586 + ret = gps_power_2v5_get();
15587 + } else if (!strcmp(attr->attr.name, "power_core_1v5") ||
15588 + !strcmp(attr->attr.name, "power_vdd_core_1v5")) {
15589 + ret = gps_power_1v5_get();
15590 + }
15591 +
15592 + if (ret)
15593 + return strlcpy(buf, "1\n", 3);
15594 + else
15595 + return strlcpy(buf, "0\n", 3);
15596 +}
15597 +
15598 +static ssize_t power_gps_write(struct device *dev,
15599 + struct device_attribute *attr, const char *buf,
15600 + size_t count)
15601 +{
15602 + unsigned long on = simple_strtoul(buf, NULL, 10);
15603 +
15604 + if (!strcmp(attr->attr.name, "power_tcxo_2v8")) {
15605 + gps_power_2v8_set(on);
15606 + } else if (!strcmp(attr->attr.name, "power_avdd_3v")) {
15607 + gps_power_3v_set(on);
15608 + } else if (!strcmp(attr->attr.name, "pwron")) {
15609 + gps_pwron_set(on);
15610 + } else if (!strcmp(attr->attr.name, "reset")) {
15611 + gps_rst_set(on);
15612 + } else if (!strcmp(attr->attr.name, "power_lp_io_3v3")) {
15613 + gps_power_3v3_set(on);
15614 + } else if (!strcmp(attr->attr.name, "power_pll_core_2v5")) {
15615 + gps_power_2v5_set(on);
15616 + } else if (!strcmp(attr->attr.name, "power_core_1v5") ||
15617 + !strcmp(attr->attr.name, "power_vdd_core_1v5")) {
15618 + gps_power_1v5_set(on);
15619 + }
15620 +
15621 + return count;
15622 +}
15623 +
15624 +static void gps_power_sequence_up(void)
15625 +{
15626 + /* According to PMB2520 Data Sheet, Rev. 2006-06-05,
15627 + * Chapter 4.2.2 */
15628 +
15629 + /* nRESET must be asserted low */
15630 + gps_rst_set(0);
15631 +
15632 + /* POWERON must be de-asserted (low) */
15633 + gps_pwron_set(0);
15634 +
15635 + /* Apply VDD_IO and VDD_LPREG_IN */
15636 + gps_power_3v3_set(1);
15637 +
15638 + /* VDD_COREREG_IN, VDD_PLLREG_IN */
15639 + gps_power_1v5_set(1);
15640 + gps_power_2v5_set(1);
15641 +
15642 + /* and VDD_RF may be applied */
15643 + gps_power_2v8_set(1);
15644 +
15645 + /* We need to enable AVDD, since in GTA01Bv3 it is
15646 + * shared with RFREG_IN */
15647 + gps_power_3v_set(1);
15648 +
15649 + msleep(3); /* Is 3ms enough? */
15650 +
15651 + /* De-asert nRESET */
15652 + gps_rst_set(1);
15653 +
15654 + /* Switch power on */
15655 + gps_pwron_set(1);
15656 +
15657 +}
15658 +
15659 +static void gps_power_sequence_down(void)
15660 +{
15661 + /* According to PMB2520 Data Sheet, Rev. 2006-06-05,
15662 + * Chapter 4.2.3.1 */
15663 + gps_pwron_set(0);
15664 +
15665 + /* Don't disable AVDD before PWRON is cleared, since
15666 + * in GTA01Bv3, AVDD and RFREG_IN are shared */
15667 + gps_power_3v_set(0);
15668 +
15669 + /* Remove VDD_COREREG_IN, VDD_PLLREG_IN and VDD_REFREG_IN */
15670 + gps_power_1v5_set(0);
15671 + gps_power_2v5_set(0);
15672 + gps_power_2v8_set(0);
15673 +
15674 + /* Remove VDD_LPREG_IN and VDD_IO */
15675 + gps_power_3v3_set(0);
15676 +}
15677 +
15678 +
15679 +static ssize_t power_sequence_read(struct device *dev,
15680 + struct device_attribute *attr,
15681 + char *buf)
15682 +{
15683 + return strlcpy(buf, "power_up power_down\n", PAGE_SIZE);
15684 +}
15685 +
15686 +static ssize_t power_sequence_write(struct device *dev,
15687 + struct device_attribute *attr,
15688 + const char *buf, size_t count)
15689 +{
15690 + dev_dbg(dev, "wrote: '%s'\n", buf);
15691 +
15692 + if (!strncmp(buf, "power_up", 8))
15693 + gps_power_sequence_up();
15694 + else if (!strncmp(buf, "power_down", 10))
15695 + gps_power_sequence_down();
15696 + else
15697 + return -EINVAL;
15698 +
15699 + return count;
15700 +}
15701 +
15702 +static DEVICE_ATTR(power_tcxo_2v8, 0644, power_gps_read, power_gps_write);
15703 +static DEVICE_ATTR(power_avdd_3v, 0644, power_gps_read, power_gps_write);
15704 +static DEVICE_ATTR(pwron, 0644, power_gps_read, power_gps_write);
15705 +static DEVICE_ATTR(reset, 0644, power_gps_read, power_gps_write);
15706 +static DEVICE_ATTR(power_lp_io_3v3, 0644, power_gps_read, power_gps_write);
15707 +static DEVICE_ATTR(power_pll_core_2v5, 0644, power_gps_read, power_gps_write);
15708 +static DEVICE_ATTR(power_core_1v5, 0644, power_gps_read, power_gps_write);
15709 +static DEVICE_ATTR(power_vdd_core_1v5, 0644, power_gps_read, power_gps_write);
15710 +static DEVICE_ATTR(power_sequence, 0644, power_sequence_read,
15711 + power_sequence_write);
15712 +
15713 +#ifdef CONFIG_PM
15714 +static int gta01_pm_gps_suspend(struct platform_device *pdev,
15715 + pm_message_t state)
15716 +{
15717 +#ifdef CONFIG_MACH_NEO1973_GTA01
15718 + if (machine_is_neo1973_gta01()) {
15719 + /* FIXME */
15720 + gps_power_sequence_down();
15721 + }
15722 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15723 +
15724 +#ifdef CONFIG_MACH_NEO1973_GTA02
15725 + if (machine_is_neo1973_gta02())
15726 + gps_pwron_set(0);
15727 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15728 +
15729 + return 0;
15730 +}
15731 +
15732 +static int gta01_pm_gps_resume(struct platform_device *pdev)
15733 +{
15734 +#ifdef CONFIG_MACH_NEO1973_GTA01
15735 + if (machine_is_neo1973_gta01())
15736 + if (neo1973_gps.power_was_on)
15737 + gps_power_sequence_up();
15738 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15739 +
15740 +#ifdef CONFIG_MACH_NEO1973_GTA02
15741 + if (machine_is_neo1973_gta02())
15742 + if (neo1973_gps.power_was_on)
15743 + gps_pwron_set(1);
15744 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15745 +
15746 + return 0;
15747 +}
15748 +#else
15749 +#define gta01_pm_gps_suspend NULL
15750 +#define gta01_pm_gps_resume NULL
15751 +#endif
15752 +
15753 +static struct attribute *gta01_gps_sysfs_entries[] = {
15754 + &dev_attr_power_avdd_3v.attr,
15755 + &dev_attr_pwron.attr,
15756 + &dev_attr_reset.attr,
15757 + &dev_attr_power_lp_io_3v3.attr,
15758 + &dev_attr_power_pll_core_2v5.attr,
15759 + &dev_attr_power_sequence.attr,
15760 + NULL, /* power_core_1v5 */
15761 + NULL, /* power_vdd_core_1v5 */
15762 + NULL /* terminating entry */
15763 +};
15764 +
15765 +static struct attribute_group gta01_gps_attr_group = {
15766 + .name = NULL,
15767 + .attrs = gta01_gps_sysfs_entries,
15768 +};
15769 +
15770 +static struct attribute *gta02_gps_sysfs_entries[] = {
15771 + &dev_attr_pwron.attr,
15772 + NULL
15773 +};
15774 +
15775 +static struct attribute_group gta02_gps_attr_group = {
15776 + .name = NULL,
15777 + .attrs = gta02_gps_sysfs_entries,
15778 +};
15779 +
15780 +static int __init gta01_pm_gps_probe(struct platform_device *pdev)
15781 +{
15782 +#ifdef CONFIG_MACH_NEO1973_GTA01
15783 + if (machine_is_neo1973_gta01()) {
15784 + s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_PWRON, S3C2410_GPIO_OUTPUT);
15785 +
15786 + switch (system_rev) {
15787 + case GTA01v3_SYSTEM_REV:
15788 + break;
15789 + case GTA01v4_SYSTEM_REV:
15790 + s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_RESET, S3C2410_GPIO_OUTPUT);
15791 + break;
15792 + case GTA01Bv3_SYSTEM_REV:
15793 + case GTA01Bv4_SYSTEM_REV:
15794 + s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_3V3, S3C2410_GPIO_OUTPUT);
15795 + /* fallthrough */
15796 + case GTA01Bv2_SYSTEM_REV:
15797 + s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_2V8, S3C2410_GPIO_OUTPUT);
15798 + s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_EN_3V, S3C2410_GPIO_OUTPUT);
15799 + s3c2410_gpio_cfgpin(GTA01_GPIO_GPS_RESET, S3C2410_GPIO_OUTPUT);
15800 + break;
15801 + default:
15802 + dev_warn(&pdev->dev, "Unknown GTA01 Revision 0x%x, "
15803 + "AGPS PM features not available!!!\n",
15804 + system_rev);
15805 + return -1;
15806 + break;
15807 + }
15808 +
15809 + gps_power_sequence_down();
15810 +
15811 + switch (system_rev) {
15812 + case GTA01v3_SYSTEM_REV:
15813 + case GTA01v4_SYSTEM_REV:
15814 + case GTA01Bv2_SYSTEM_REV:
15815 + gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-3] =
15816 + &dev_attr_power_tcxo_2v8.attr;
15817 + break;
15818 + case GTA01Bv3_SYSTEM_REV:
15819 + case GTA01Bv4_SYSTEM_REV:
15820 + gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-3] =
15821 + &dev_attr_power_core_1v5.attr;
15822 + gta01_gps_sysfs_entries[ARRAY_SIZE(gta01_gps_sysfs_entries)-2] =
15823 + &dev_attr_power_vdd_core_1v5.attr;
15824 + break;
15825 + }
15826 +
15827 + return sysfs_create_group(&pdev->dev.kobj, &gta01_gps_attr_group);
15828 + }
15829 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15830 +
15831 +#ifdef CONFIG_MACH_NEO1973_GTA02
15832 + if (machine_is_neo1973_gta02()) {
15833 + switch (system_rev) {
15834 + case GTA02v2_SYSTEM_REV:
15835 + case GTA02v3_SYSTEM_REV:
15836 + case GTA02v4_SYSTEM_REV:
15837 + case GTA02v5_SYSTEM_REV:
15838 + case GTA02v6_SYSTEM_REV:
15839 + pcf50633_voltage_set(pcf50633_global,
15840 + PCF50633_REGULATOR_LDO5, 3000);
15841 + pcf50633_onoff_set(pcf50633_global,
15842 + PCF50633_REGULATOR_LDO5, 0);
15843 + dev_info(&pdev->dev, "FIC Neo1973 GPS Power Managerment:"
15844 + "starting\n");
15845 + break;
15846 + default:
15847 + dev_warn(&pdev->dev, "Unknown GTA02 Revision 0x%x, "
15848 + "AGPS PM features not available!!!\n",
15849 + system_rev);
15850 + return -1;
15851 + break;
15852 + }
15853 + return sysfs_create_group(&pdev->dev.kobj, &gta02_gps_attr_group);
15854 + }
15855 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15856 + return -1;
15857 +}
15858 +
15859 +static int gta01_pm_gps_remove(struct platform_device *pdev)
15860 +{
15861 +#ifdef CONFIG_MACH_NEO1973_GTA01
15862 + if (machine_is_neo1973_gta01()) {
15863 + gps_power_sequence_down();
15864 + sysfs_remove_group(&pdev->dev.kobj, &gta01_gps_attr_group);
15865 + }
15866 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
15867 +
15868 +#ifdef CONFIG_MACH_NEO1973_GTA02
15869 + if (machine_is_neo1973_gta02()) {
15870 + pcf50633_onoff_set(pcf50633_global, PCF50633_REGULATOR_LDO5, 0);
15871 + sysfs_remove_group(&pdev->dev.kobj, &gta02_gps_attr_group);
15872 + }
15873 +#endif /* CONFIG_MACH_NEO1973_GTA02 */
15874 + return 0;
15875 +}
15876 +
15877 +static struct platform_driver gta01_pm_gps_driver = {
15878 + .probe = gta01_pm_gps_probe,
15879 + .remove = gta01_pm_gps_remove,
15880 + .suspend = gta01_pm_gps_suspend,
15881 + .resume = gta01_pm_gps_resume,
15882 + .driver = {
15883 + .name = "neo1973-pm-gps",
15884 + },
15885 +};
15886 +
15887 +static int __devinit gta01_pm_gps_init(void)
15888 +{
15889 + return platform_driver_register(&gta01_pm_gps_driver);
15890 +}
15891 +
15892 +static void gta01_pm_gps_exit(void)
15893 +{
15894 + platform_driver_unregister(&gta01_pm_gps_driver);
15895 +}
15896 +
15897 +module_init(gta01_pm_gps_init);
15898 +module_exit(gta01_pm_gps_exit);
15899 +
15900 +MODULE_LICENSE("GPL");
15901 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
15902 +MODULE_DESCRIPTION("FIC Neo1973 GPS Power Management");
15903 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_gps.h
15904 ===================================================================
15905 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
15906 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_gps.h 2008-12-11 22:46:49.000000000 +0100
15907 @@ -0,0 +1 @@
15908 +extern int neo1973_pm_gps_is_on(void);
15909 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c
15910 ===================================================================
15911 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
15912 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_gsm.c 2008-12-11 22:46:49.000000000 +0100
15913 @@ -0,0 +1,373 @@
15914 +/*
15915 + * GSM Management code for the FIC Neo1973 GSM Phone
15916 + *
15917 + * (C) 2007 by Openmoko Inc.
15918 + * Author: Harald Welte <laforge@openmoko.org>
15919 + * All rights reserved.
15920 + *
15921 + * This program is free software; you can redistribute it and/or modify
15922 + * it under the terms of the GNU General Public License version 2 as
15923 + * published by the Free Software Foundation
15924 + *
15925 + */
15926 +
15927 +#include <linux/module.h>
15928 +#include <linux/init.h>
15929 +#include <linux/kernel.h>
15930 +#include <linux/platform_device.h>
15931 +#include <linux/console.h>
15932 +#include <linux/errno.h>
15933 +#include <linux/interrupt.h>
15934 +
15935 +#include <asm/gpio.h>
15936 +#include <asm/mach-types.h>
15937 +#include <asm/arch/gta01.h>
15938 +#include <asm/plat-s3c24xx/neo1973.h>
15939 +#include <asm/arch/s3c24xx-serial.h>
15940 +
15941 +#ifdef CONFIG_MACH_NEO1973_GTA02
15942 +#include <asm/arch/gta02.h>
15943 +#include <linux/pcf50633.h>
15944 +#include <asm/arch/regs-gpioj.h>
15945 +#endif
15946 +
15947 +int gta_gsm_interrupts;
15948 +EXPORT_SYMBOL(gta_gsm_interrupts);
15949 +
15950 +struct gta01pm_priv {
15951 + int gpio_ngsm_en;
15952 + int gpio_ndl_gsm;
15953 +
15954 + struct console *con;
15955 +};
15956 +
15957 +struct resume_dependency resume_dep_gsm_uart;
15958 +
15959 +static struct gta01pm_priv gta01_gsm;
15960 +
15961 +static struct console *find_s3c24xx_console(void)
15962 +{
15963 + struct console *con;
15964 +
15965 + acquire_console_sem();
15966 +
15967 + for (con = console_drivers; con; con = con->next) {
15968 + if (!strcmp(con->name, "ttySAC"))
15969 + break;
15970 + }
15971 +
15972 + release_console_sem();
15973 +
15974 + return con;
15975 +}
15976 +
15977 +static ssize_t gsm_read(struct device *dev, struct device_attribute *attr,
15978 + char *buf)
15979 +{
15980 + if (!strcmp(attr->attr.name, "power_on")) {
15981 + if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON))
15982 + goto out_1;
15983 + } else if (!strcmp(attr->attr.name, "reset")) {
15984 + if (machine_is_neo1973_gta01() && s3c2410_gpio_getpin(GTA01_GPIO_MODEM_RST))
15985 + goto out_1;
15986 + else if (machine_is_neo1973_gta02() && s3c2410_gpio_getpin(GTA02_GPIO_MODEM_RST))
15987 + goto out_1;
15988 + } else if (!strcmp(attr->attr.name, "download")) {
15989 + if (machine_is_neo1973_gta01()) {
15990 + if (s3c2410_gpio_getpin(GTA01_GPIO_MODEM_DNLOAD))
15991 + goto out_1;
15992 + } else if (machine_is_neo1973_gta02()) {
15993 + if (!s3c2410_gpio_getpin(GTA02_GPIO_nDL_GSM))
15994 + goto out_1;
15995 + }
15996 + } else if (!strcmp(attr->attr.name, "flowcontrolled")) {
15997 + if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT)
15998 + goto out_1;
15999 + }
16000 +
16001 + return strlcpy(buf, "0\n", 3);
16002 +out_1:
16003 + return strlcpy(buf, "1\n", 3);
16004 +}
16005 +
16006 +static ssize_t gsm_write(struct device *dev, struct device_attribute *attr,
16007 + const char *buf, size_t count)
16008 +{
16009 + unsigned long on = simple_strtoul(buf, NULL, 10);
16010 +
16011 + if (!strcmp(attr->attr.name, "power_on")) {
16012 + if (on) {
16013 + if (gta01_gsm.con) {
16014 + dev_dbg(dev, "powering up GSM, thus "
16015 + "disconnecting serial console\n");
16016 +
16017 + console_stop(gta01_gsm.con);
16018 + s3c24xx_serial_console_set_silence(1);
16019 + }
16020 +
16021 + if (gta01_gsm.gpio_ngsm_en)
16022 + s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 0);
16023 +
16024 + switch (system_rev) {
16025 +#ifdef CONFIG_MACH_NEO1973_GTA02
16026 + case GTA02v2_SYSTEM_REV:
16027 + case GTA02v3_SYSTEM_REV:
16028 + case GTA02v4_SYSTEM_REV:
16029 + case GTA02v5_SYSTEM_REV:
16030 + case GTA02v6_SYSTEM_REV:
16031 + pcf50633_gpio_set(pcf50633_global,
16032 + PCF50633_GPIO2, 1);
16033 + break;
16034 +#endif
16035 + }
16036 +
16037 + neo1973_gpb_setpin(GTA01_GPIO_MODEM_ON, 1);
16038 + } else {
16039 + neo1973_gpb_setpin(GTA01_GPIO_MODEM_ON, 0);
16040 +
16041 + switch (system_rev) {
16042 +#ifdef CONFIG_MACH_NEO1973_GTA02
16043 + case GTA02v2_SYSTEM_REV:
16044 + case GTA02v3_SYSTEM_REV:
16045 + case GTA02v4_SYSTEM_REV:
16046 + case GTA02v5_SYSTEM_REV:
16047 + case GTA02v6_SYSTEM_REV:
16048 + pcf50633_gpio_set(pcf50633_global,
16049 + PCF50633_GPIO2, 0);
16050 + break;
16051 +#endif
16052 + }
16053 +
16054 + if (gta01_gsm.gpio_ngsm_en)
16055 + s3c2410_gpio_setpin(gta01_gsm.gpio_ngsm_en, 1);
16056 +
16057 + if (gta01_gsm.con) {
16058 + s3c24xx_serial_console_set_silence(0);
16059 + console_start(gta01_gsm.con);
16060 +
16061 + dev_dbg(dev, "powered down GSM, thus enabling "
16062 + "serial console\n");
16063 + }
16064 + }
16065 + } else if (!strcmp(attr->attr.name, "reset")) {
16066 + if (machine_is_neo1973_gta01())
16067 + neo1973_gpb_setpin(GTA01_GPIO_MODEM_RST, on);
16068 + else if (machine_is_neo1973_gta02())
16069 + neo1973_gpb_setpin(GTA02_GPIO_MODEM_RST, on);
16070 + } else if (!strcmp(attr->attr.name, "download")) {
16071 + if (machine_is_neo1973_gta01())
16072 + s3c2410_gpio_setpin(GTA01_GPIO_MODEM_DNLOAD, on);
16073 +
16074 + if (machine_is_neo1973_gta02()) {
16075 + /*
16076 + * the keyboard / buttons driver requests and enables
16077 + * the JACK_INSERT IRQ. We have to take care about
16078 + * not enabling and disabling the IRQ when it was
16079 + * already in that state or we get "unblanaced IRQ"
16080 + * kernel warnings and stack dumps. So we use the
16081 + * copy of the ndl_gsm state to figure out if we should
16082 + * enable or disable the jack interrupt
16083 + */
16084 + if (on) {
16085 + if (gta01_gsm.gpio_ndl_gsm)
16086 + disable_irq(gpio_to_irq(
16087 + GTA02_GPIO_JACK_INSERT));
16088 + } else {
16089 + if (!gta01_gsm.gpio_ndl_gsm)
16090 + enable_irq(gpio_to_irq(
16091 + GTA02_GPIO_JACK_INSERT));
16092 + }
16093 +
16094 + gta01_gsm.gpio_ndl_gsm = !on;
16095 + s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, !on);
16096 + }
16097 + } else if (!strcmp(attr->attr.name, "flowcontrolled")) {
16098 + if (on) {
16099 + gta_gsm_interrupts = 0;
16100 + s3c2410_gpio_setpin(S3C2410_GPH1, 1);
16101 + s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_OUTP);
16102 + } else
16103 + s3c2410_gpio_cfgpin(S3C2410_GPH1, S3C2410_GPH1_nRTS0);
16104 + }
16105 +
16106 + return count;
16107 +}
16108 +
16109 +static DEVICE_ATTR(power_on, 0644, gsm_read, gsm_write);
16110 +static DEVICE_ATTR(reset, 0644, gsm_read, gsm_write);
16111 +static DEVICE_ATTR(download, 0644, gsm_read, gsm_write);
16112 +static DEVICE_ATTR(flowcontrolled, 0644, gsm_read, gsm_write);
16113 +
16114 +#ifdef CONFIG_PM
16115 +static int gta01_gsm_resume(struct platform_device *pdev);
16116 +static int gta01_gsm_suspend(struct platform_device *pdev, pm_message_t state)
16117 +{
16118 + /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
16119 + * don't need to do much here. */
16120 +
16121 + /* If flowcontrol asserted, abort if GSM already interrupted */
16122 + if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT) {
16123 + if (gta_gsm_interrupts)
16124 + goto busy;
16125 + }
16126 +
16127 + /* disable DL GSM to prevent jack_insert becoming 'floating' */
16128 + if (machine_is_neo1973_gta02())
16129 + s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
16130 +
16131 + /* register our resume dependency on the appropriate UART being up */
16132 + resume_dep_gsm_uart.callback = gta01_gsm_resume;
16133 + resume_dep_gsm_uart.context = (void *)pdev;
16134 +
16135 + s3c24xx_serial_register_resume_dependency(&resume_dep_gsm_uart, 0);
16136 +
16137 + return 0;
16138 +
16139 +busy:
16140 + return -EBUSY;
16141 +}
16142 +
16143 +static int
16144 +gta01_gsm_suspend_late(struct platform_device *pdev, pm_message_t state)
16145 +{
16146 + /* Last chance: abort if GSM already interrupted */
16147 + if (s3c2410_gpio_getcfg(S3C2410_GPH1) == S3C2410_GPIO_OUTPUT) {
16148 + if (gta_gsm_interrupts)
16149 + return -EBUSY;
16150 + }
16151 + return 0;
16152 +}
16153 +
16154 +static int gta01_gsm_resume(struct platform_device *pdev)
16155 +{
16156 + if (resume_dep_gsm_uart.called_flag != 1)
16157 + return 0;
16158 +
16159 + resume_dep_gsm_uart.called_flag++; /* only run once */
16160 +
16161 + /* GPIO state is saved/restored by S3C2410 core GPIO driver, so we
16162 + * don't need to do much here. */
16163 +
16164 + /* Make sure that the kernel console on the serial port is still
16165 + * disabled. FIXME: resume ordering race with serial driver! */
16166 + if (gta01_gsm.con && s3c2410_gpio_getpin(GTA01_GPIO_MODEM_ON))
16167 + console_stop(gta01_gsm.con);
16168 +
16169 + if (machine_is_neo1973_gta02())
16170 + s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, gta01_gsm.gpio_ndl_gsm);
16171 +
16172 + return 0;
16173 +}
16174 +#else
16175 +#define gta01_gsm_suspend NULL
16176 +#define gta01_gsm_suspend_late NULL
16177 +#define gta01_gsm_resume NULL
16178 +#endif
16179 +
16180 +static struct attribute *gta01_gsm_sysfs_entries[] = {
16181 + &dev_attr_power_on.attr,
16182 + &dev_attr_reset.attr,
16183 + &dev_attr_download.attr,
16184 + &dev_attr_flowcontrolled.attr,
16185 + NULL
16186 +};
16187 +
16188 +static struct attribute_group gta01_gsm_attr_group = {
16189 + .name = NULL,
16190 + .attrs = gta01_gsm_sysfs_entries,
16191 +};
16192 +
16193 +static int __init gta01_gsm_probe(struct platform_device *pdev)
16194 +{
16195 + switch (system_rev) {
16196 + case GTA01v3_SYSTEM_REV:
16197 + gta01_gsm.gpio_ngsm_en = GTA01v3_GPIO_nGSM_EN;
16198 + break;
16199 + case GTA01v4_SYSTEM_REV:
16200 + gta01_gsm.gpio_ngsm_en = 0;
16201 + break;
16202 + case GTA01Bv2_SYSTEM_REV:
16203 + case GTA01Bv3_SYSTEM_REV:
16204 + case GTA01Bv4_SYSTEM_REV:
16205 + gta01_gsm.gpio_ngsm_en = GTA01Bv2_GPIO_nGSM_EN;
16206 + s3c2410_gpio_setpin(GTA01v3_GPIO_nGSM_EN, 0);
16207 + break;
16208 +#ifdef CONFIG_MACH_NEO1973_GTA02
16209 + case GTA02v1_SYSTEM_REV:
16210 + case GTA02v2_SYSTEM_REV:
16211 + case GTA02v3_SYSTEM_REV:
16212 + case GTA02v4_SYSTEM_REV:
16213 + case GTA02v5_SYSTEM_REV:
16214 + case GTA02v6_SYSTEM_REV:
16215 + gta01_gsm.gpio_ngsm_en = 0;
16216 + break;
16217 +#endif
16218 + default:
16219 + dev_warn(&pdev->dev, "Unknown Neo1973 Revision 0x%x, "
16220 + "some PM features not available!!!\n",
16221 + system_rev);
16222 + break;
16223 + }
16224 +
16225 + switch (system_rev) {
16226 + case GTA01v4_SYSTEM_REV:
16227 + case GTA01Bv2_SYSTEM_REV:
16228 + gta01_gsm_sysfs_entries[ARRAY_SIZE(gta01_gsm_sysfs_entries)-2] =
16229 + &dev_attr_download.attr;
16230 + break;
16231 + default:
16232 + break;
16233 + }
16234 +
16235 + if (machine_is_neo1973_gta01()) {
16236 + gta01_gsm.con = find_s3c24xx_console();
16237 + if (!gta01_gsm.con)
16238 + dev_warn(&pdev->dev,
16239 + "cannot find S3C24xx console driver\n");
16240 + } else
16241 + gta01_gsm.con = NULL;
16242 +
16243 + /* note that download initially disabled, and enforce that */
16244 + gta01_gsm.gpio_ndl_gsm = 1;
16245 + if (machine_is_neo1973_gta02())
16246 + s3c2410_gpio_setpin(GTA02_GPIO_nDL_GSM, 1);
16247 +
16248 + init_resume_dependency_list(&resume_dep_gsm_uart);
16249 +
16250 + return sysfs_create_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
16251 +}
16252 +
16253 +static int gta01_gsm_remove(struct platform_device *pdev)
16254 +{
16255 + sysfs_remove_group(&pdev->dev.kobj, &gta01_gsm_attr_group);
16256 +
16257 + return 0;
16258 +}
16259 +
16260 +static struct platform_driver gta01_gsm_driver = {
16261 + .probe = gta01_gsm_probe,
16262 + .remove = gta01_gsm_remove,
16263 + .suspend = gta01_gsm_suspend,
16264 + .suspend_late = gta01_gsm_suspend_late,
16265 + .resume = gta01_gsm_resume,
16266 + .driver = {
16267 + .name = "neo1973-pm-gsm",
16268 + },
16269 +};
16270 +
16271 +static int __devinit gta01_gsm_init(void)
16272 +{
16273 + return platform_driver_register(&gta01_gsm_driver);
16274 +}
16275 +
16276 +static void gta01_gsm_exit(void)
16277 +{
16278 + platform_driver_unregister(&gta01_gsm_driver);
16279 +}
16280 +
16281 +module_init(gta01_gsm_init);
16282 +module_exit(gta01_gsm_exit);
16283 +
16284 +MODULE_LICENSE("GPL");
16285 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
16286 +MODULE_DESCRIPTION("FIC Neo1973 GSM Power Management");
16287 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_host.c
16288 ===================================================================
16289 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
16290 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_host.c 2008-12-11 22:46:49.000000000 +0100
16291 @@ -0,0 +1,101 @@
16292 +/*
16293 + * Bluetooth PM code for the FIC Neo1973 GSM Phone
16294 + *
16295 + * (C) 2007 by Openmoko Inc.
16296 + * Author: Harald Welte <laforge@openmoko.org>
16297 + * All rights reserved.
16298 + *
16299 + * This program is free software; you can redistribute it and/or modify
16300 + * it under the terms of the GNU General Public License version 2 as
16301 + * published by the Free Software Foundation
16302 + *
16303 + */
16304 +
16305 +#include <linux/module.h>
16306 +#include <linux/init.h>
16307 +#include <linux/kernel.h>
16308 +#include <linux/platform_device.h>
16309 +
16310 +#include <asm/hardware.h>
16311 +#include <asm/mach-types.h>
16312 +
16313 +#ifdef CONFIG_MACH_NEO1973_GTA02
16314 +#include <asm/arch/gta02.h>
16315 +#include <linux/pcf50633.h>
16316 +
16317 +static ssize_t pm_host_read(struct device *dev, struct device_attribute *attr,
16318 + char *buf)
16319 +{
16320 + return sprintf(buf, "%d\n",
16321 + pcf50633_gpio_get(pcf50633_global, PCF50633_GPO));
16322 +}
16323 +
16324 +static ssize_t pm_host_write(struct device *dev, struct device_attribute *attr,
16325 + const char *buf, size_t count)
16326 +{
16327 + unsigned long on = simple_strtoul(buf, NULL, 10);
16328 +
16329 + pcf50633_gpio_set(pcf50633_global, PCF50633_GPO, on);
16330 +
16331 + return count;
16332 +}
16333 +
16334 +static DEVICE_ATTR(hostmode, 0644, pm_host_read, pm_host_write);
16335 +
16336 +static struct attribute *neo1973_pm_host_sysfs_entries[] = {
16337 + &dev_attr_hostmode.attr,
16338 + NULL
16339 +};
16340 +
16341 +static struct attribute_group neo1973_pm_host_attr_group = {
16342 + .name = NULL,
16343 + .attrs = neo1973_pm_host_sysfs_entries,
16344 +};
16345 +
16346 +static int __init neo1973_pm_host_probe(struct platform_device *pdev)
16347 +{
16348 + dev_info(&pdev->dev, "starting\n");
16349 +
16350 + switch (machine_arch_type) {
16351 +#ifdef CONFIG_MACH_NEO1973_GTA01
16352 + case MACH_TYPE_NEO1973_GTA01:
16353 + return -EINVAL;
16354 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
16355 + default:
16356 + break;
16357 + }
16358 +
16359 + return sysfs_create_group(&pdev->dev.kobj, &neo1973_pm_host_attr_group);
16360 +}
16361 +
16362 +static int neo1973_pm_host_remove(struct platform_device *pdev)
16363 +{
16364 + sysfs_remove_group(&pdev->dev.kobj, &neo1973_pm_host_attr_group);
16365 + return 0;
16366 +}
16367 +
16368 +static struct platform_driver neo1973_pm_host_driver = {
16369 + .probe = neo1973_pm_host_probe,
16370 + .remove = neo1973_pm_host_remove,
16371 + .driver = {
16372 + .name = "neo1973-pm-host",
16373 + },
16374 +};
16375 +
16376 +static int __devinit neo1973_pm_host_init(void)
16377 +{
16378 + return platform_driver_register(&neo1973_pm_host_driver);
16379 +}
16380 +
16381 +static void neo1973_pm_host_exit(void)
16382 +{
16383 + platform_driver_unregister(&neo1973_pm_host_driver);
16384 +}
16385 +
16386 +module_init(neo1973_pm_host_init);
16387 +module_exit(neo1973_pm_host_exit);
16388 +
16389 +MODULE_LICENSE("GPL");
16390 +MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
16391 +MODULE_DESCRIPTION("Neo1973 USB Host Power Management");
16392 +#endif
16393 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_resume_reason.c
16394 ===================================================================
16395 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
16396 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_pm_resume_reason.c 2008-12-11 22:46:49.000000000 +0100
16397 @@ -0,0 +1,147 @@
16398 +/*
16399 + * Resume reason sysfs for the FIC Neo1973 GSM Phone
16400 + *
16401 + * (C) 2008 by Openmoko Inc.
16402 + * Author: Andy Green <andy@openmoko.com>
16403 + * All rights reserved.
16404 + *
16405 + * This program is free software; you can redistribute it and/or modify
16406 + * it under the terms of the GNU General Public License resume_reason 2 as
16407 + * published by the Free Software Foundation
16408 + *
16409 + */
16410 +
16411 +#include <linux/module.h>
16412 +#include <linux/init.h>
16413 +#include <linux/kernel.h>
16414 +#include <linux/platform_device.h>
16415 +#include <linux/io.h>
16416 +
16417 +#include <asm/hardware.h>
16418 +#include <asm/mach-types.h>
16419 +
16420 +#ifdef CONFIG_MACH_NEO1973_GTA02
16421 +#include <asm/arch/gta02.h>
16422 +#include <linux/pcf50633.h>
16423 +#endif
16424 +
16425 +static unsigned int *gstatus4_mapped;
16426 +static char *resume_reasons[][17] = { { /* GTA01 */
16427 + "EINT00_NULL",
16428 + "EINT01_GSM",
16429 + "EINT02_NULL",
16430 + "EINT03_NULL",
16431 + "EINT04_JACK",
16432 + "EINT05_SDCARD",
16433 + "EINT06_AUXKEY",
16434 + "EINT07_HOLDKEY",
16435 + "EINT08_NULL",
16436 + "EINT09_NULL",
16437 + "EINT10_NULL",
16438 + "EINT11_NULL",
16439 + "EINT12_NULL",
16440 + "EINT13_NULL",
16441 + "EINT14_NULL",
16442 + "EINT15_NULL",
16443 + NULL
16444 +}, { /* GTA02 */
16445 + "EINT00_ACCEL1",
16446 + "EINT01_GSM",
16447 + "EINT02_BLUETOOTH",
16448 + "EINT03_DEBUGBRD",
16449 + "EINT04_JACK",
16450 + "EINT05_WLAN",
16451 + "EINT06_AUXKEY",
16452 + "EINT07_HOLDKEY",
16453 + "EINT08_ACCEL2",
16454 + "EINT09_PMU",
16455 + "EINT10_NULL",
16456 + "EINT11_NULL",
16457 + "EINT12_GLAMO",
16458 + "EINT13_NULL",
16459 + "EINT14_NULL",
16460 + "EINT15_NULL",
16461 + NULL
16462 +} };
16463 +
16464 +static ssize_t resume_reason_read(struct device *dev,
16465 + struct device_attribute *attr,
16466 + char *buf)
16467 +{
16468 + int bit = 0;
16469 + char *end = buf;
16470 + int gta = !!machine_is_neo1973_gta02();
16471 +
16472 + for (bit = 0; resume_reasons[gta][bit]; bit++) {
16473 + if ((*gstatus4_mapped) & (1 << bit))
16474 + end += sprintf(end, "* %s\n", resume_reasons[gta][bit]);
16475 + else
16476 + end += sprintf(end, " %s\n", resume_reasons[gta][bit]);
16477 +
16478 +#ifdef CONFIG_MACH_NEO1973_GTA02
16479 + if ((gta) && (bit == 9)) /* PMU */
16480 + end += pcf50633_report_resumers(pcf50633_global, end);
16481 +#endif
16482 + }
16483 +
16484 + return end - buf;
16485 +}
16486 +
16487 +
16488 +static DEVICE_ATTR(resume_reason, 0644, resume_reason_read, NULL);
16489 +
16490 +static struct attribute *neo1973_resume_reason_sysfs_entries[] = {
16491 + &dev_attr_resume_reason.attr,
16492 + NULL
16493 +};
16494 +
16495 +static struct attribute_group neo1973_resume_reason_attr_group = {
16496 + .name = NULL,
16497 + .attrs = neo1973_resume_reason_sysfs_entries,
16498 +};
16499 +
16500 +static int __init neo1973_resume_reason_probe(struct platform_device *pdev)
16501 +{
16502 + dev_info(&pdev->dev, "starting\n");
16503 +
16504 + gstatus4_mapped = ioremap(0x560000BC /* GSTATUS4 */, 0x4);
16505 + if (!gstatus4_mapped) {
16506 + dev_err(&pdev->dev, "failed to ioremap() memory region\n");
16507 + return -EINVAL;
16508 + }
16509 +
16510 + return sysfs_create_group(&pdev->dev.kobj,
16511 + &neo1973_resume_reason_attr_group);
16512 +}
16513 +
16514 +static int neo1973_resume_reason_remove(struct platform_device *pdev)
16515 +{
16516 + sysfs_remove_group(&pdev->dev.kobj, &neo1973_resume_reason_attr_group);
16517 + iounmap(gstatus4_mapped);
16518 + return 0;
16519 +}
16520 +
16521 +static struct platform_driver neo1973_resume_reason_driver = {
16522 + .probe = neo1973_resume_reason_probe,
16523 + .remove = neo1973_resume_reason_remove,
16524 + .driver = {
16525 + .name = "neo1973-resume",
16526 + },
16527 +};
16528 +
16529 +static int __devinit neo1973_resume_reason_init(void)
16530 +{
16531 + return platform_driver_register(&neo1973_resume_reason_driver);
16532 +}
16533 +
16534 +static void neo1973_resume_reason_exit(void)
16535 +{
16536 + platform_driver_unregister(&neo1973_resume_reason_driver);
16537 +}
16538 +
16539 +module_init(neo1973_resume_reason_init);
16540 +module_exit(neo1973_resume_reason_exit);
16541 +
16542 +MODULE_LICENSE("GPL");
16543 +MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
16544 +MODULE_DESCRIPTION("Neo1973 resume_reason");
16545 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_shadow.c
16546 ===================================================================
16547 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
16548 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_shadow.c 2008-12-11 22:46:49.000000000 +0100
16549 @@ -0,0 +1,86 @@
16550 +/*
16551 + * include/asm-arm/plat-s3c24xx/neo1973.h
16552 + *
16553 + * Common utility code for GTA01 and GTA02
16554 + *
16555 + * Copyright (C) 2008 by Openmoko, Inc.
16556 + * Author: Holger Hans Peter Freyther <freyther@openmoko.org>
16557 + * All rights reserved.
16558 + *
16559 + * This program is free software; you can redistribute it and/or
16560 + * modify it under the terms of the GNU General Public License as
16561 + * published by the Free Software Foundation; either version 2 of
16562 + * the License, or (at your option) any later version.
16563 + *
16564 + * This program is distributed in the hope that it will be useful,
16565 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
16566 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16567 + * GNU General Public License for more details.
16568 + *
16569 + * You should have received a copy of the GNU General Public License
16570 + * along with this program; if not, write to the Free Software
16571 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
16572 + * MA 02111-1307 USA
16573 + *
16574 + */
16575 +
16576 +#include <linux/io.h>
16577 +#include <linux/irq.h>
16578 +
16579 +#include <asm/gpio.h>
16580 +#include <asm/plat-s3c24xx/neo1973.h>
16581 +
16582 +/**
16583 + * Shadow GPIO bank B handling. For the LEDs we need to keep track of the state
16584 + * in software. The s3c2410_gpio_setpin must not be used for GPIOs on bank B
16585 + */
16586 +static unsigned long gpb_mask;
16587 +static unsigned long gpb_state;
16588 +
16589 +void neo1973_gpb_add_shadow_gpio(unsigned int gpio)
16590 +{
16591 + unsigned long offset = S3C2410_GPIO_OFFSET(gpio);
16592 + unsigned long flags;
16593 +
16594 + local_irq_save(flags);
16595 + gpb_mask |= 1L << offset;
16596 + local_irq_restore(flags);
16597 +}
16598 +EXPORT_SYMBOL(neo1973_gpb_add_shadow_gpio);
16599 +
16600 +static void set_shadow_gpio(unsigned long offset, unsigned int value)
16601 +{
16602 + unsigned long state = value != 0;
16603 +
16604 + gpb_state &= ~(1L << offset);
16605 + gpb_state |= state << offset;
16606 +}
16607 +
16608 +void neo1973_gpb_setpin(unsigned int pin, unsigned to)
16609 +{
16610 + void __iomem *base = S3C24XX_GPIO_BASE(S3C2410_GPB0);
16611 + unsigned long offset = S3C2410_GPIO_OFFSET(pin);
16612 + unsigned long flags;
16613 + unsigned long dat;
16614 +
16615 + BUG_ON(base != S3C24XX_GPIO_BASE(pin));
16616 +
16617 + local_irq_save(flags);
16618 + dat = __raw_readl(base + 0x04);
16619 +
16620 + /* Add the shadow values */
16621 + dat &= ~gpb_mask;
16622 + dat |= gpb_state;
16623 +
16624 + /* Do the operation like s3c2410_gpio_setpin */
16625 + dat &= ~(1L << offset);
16626 + dat |= to << offset;
16627 +
16628 + /* Update the shadow state */
16629 + if ((1L << offset) & gpb_mask)
16630 + set_shadow_gpio(offset, to);
16631 +
16632 + __raw_writel(dat, base + 0x04);
16633 + local_irq_restore(flags);
16634 +}
16635 +EXPORT_SYMBOL(neo1973_gpb_setpin);
16636 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_version.c
16637 ===================================================================
16638 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
16639 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/neo1973_version.c 2008-12-11 22:46:49.000000000 +0100
16640 @@ -0,0 +1,90 @@
16641 +/*
16642 + * PCB version sysfs for the FIC Neo1973 GSM Phone
16643 + *
16644 + * (C) 2007 by Openmoko Inc.
16645 + * Author: Andy Green <andy@openmoko.com>
16646 + * All rights reserved.
16647 + *
16648 + * This program is free software; you can redistribute it and/or modify
16649 + * it under the terms of the GNU General Public License version 2 as
16650 + * published by the Free Software Foundation
16651 + *
16652 + */
16653 +
16654 +#include <linux/module.h>
16655 +#include <linux/init.h>
16656 +#include <linux/kernel.h>
16657 +#include <linux/platform_device.h>
16658 +
16659 +#include <asm/hardware.h>
16660 +#include <asm/mach-types.h>
16661 +
16662 +#ifdef CONFIG_MACH_NEO1973_GTA02
16663 +#include <asm/arch/gta02.h>
16664 +
16665 +static ssize_t version_read(struct device *dev, struct device_attribute *attr,
16666 + char *buf)
16667 +{
16668 + return sprintf(buf, "0x%03X\n", gta02_get_pcb_revision());
16669 +}
16670 +
16671 +
16672 +static DEVICE_ATTR(pcb, 0644, version_read, NULL);
16673 +
16674 +static struct attribute *neo1973_version_sysfs_entries[] = {
16675 + &dev_attr_pcb.attr,
16676 + NULL
16677 +};
16678 +
16679 +static struct attribute_group neo1973_version_attr_group = {
16680 + .name = NULL,
16681 + .attrs = neo1973_version_sysfs_entries,
16682 +};
16683 +
16684 +static int __init neo1973_version_probe(struct platform_device *pdev)
16685 +{
16686 + dev_info(&pdev->dev, "starting\n");
16687 +
16688 + switch (machine_arch_type) {
16689 +#ifdef CONFIG_MACH_NEO1973_GTA01
16690 + case MACH_TYPE_NEO1973_GTA01:
16691 + return -EINVAL;
16692 +#endif /* CONFIG_MACH_NEO1973_GTA01 */
16693 + default:
16694 + break;
16695 + }
16696 +
16697 + return sysfs_create_group(&pdev->dev.kobj, &neo1973_version_attr_group);
16698 +}
16699 +
16700 +static int neo1973_version_remove(struct platform_device *pdev)
16701 +{
16702 + sysfs_remove_group(&pdev->dev.kobj, &neo1973_version_attr_group);
16703 + return 0;
16704 +}
16705 +
16706 +static struct platform_driver neo1973_version_driver = {
16707 + .probe = neo1973_version_probe,
16708 + .remove = neo1973_version_remove,
16709 + .driver = {
16710 + .name = "neo1973-version",
16711 + },
16712 +};
16713 +
16714 +static int __devinit neo1973_version_init(void)
16715 +{
16716 + return platform_driver_register(&neo1973_version_driver);
16717 +}
16718 +
16719 +static void neo1973_version_exit(void)
16720 +{
16721 + platform_driver_unregister(&neo1973_version_driver);
16722 +}
16723 +
16724 +module_init(neo1973_version_init);
16725 +module_exit(neo1973_version_exit);
16726 +
16727 +MODULE_LICENSE("GPL");
16728 +MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
16729 +MODULE_DESCRIPTION("Neo1973 PCB version");
16730 +#endif
16731 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/pm.c
16732 ===================================================================
16733 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/pm.c 2008-12-11 22:46:07.000000000 +0100
16734 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/pm.c 2008-12-11 22:46:49.000000000 +0100
16735 @@ -169,8 +169,15 @@ static void s3c2410_pm_debug_init(void)
16736 }
16737
16738 #define DBG(fmt...) pm_dbg(fmt)
16739 +#define RESTORE_DBG(fmt...) printk(KERN_DEBUG fmt)
16740 #else
16741 +#if 0
16742 #define DBG(fmt...) printk(KERN_DEBUG fmt)
16743 +#define RESTORE_DBG(fmt...) printk(KERN_DEBUG fmt)
16744 +#else
16745 +#define DBG(fmt...) do { } while (0)
16746 +#define RESTORE_DBG(fmt...) do { } while (0)
16747 +#endif
16748
16749 #define s3c2410_pm_debug_init() do { } while(0)
16750
16751 @@ -392,7 +399,7 @@ void s3c2410_pm_do_save(struct sleep_sav
16752 void s3c2410_pm_do_restore(struct sleep_save *ptr, int count)
16753 {
16754 for (; count > 0; count--, ptr++) {
16755 - printk(KERN_DEBUG "restore %p (restore %08lx, was %08x)\n",
16756 + RESTORE_DBG("restore %p (restore %08lx, was %08x)\n",
16757 ptr->reg, ptr->val, __raw_readl(ptr->reg));
16758
16759 __raw_writel(ptr->val, ptr->reg);
16760 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/s3c244x.c
16761 ===================================================================
16762 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/s3c244x.c 2008-12-11 22:46:07.000000000 +0100
16763 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/s3c244x.c 2008-12-11 22:46:49.000000000 +0100
16764 @@ -67,6 +67,7 @@ void __init s3c244x_map_io(struct map_de
16765
16766 s3c_device_i2c.name = "s3c2440-i2c";
16767 s3c_device_nand.name = "s3c2440-nand";
16768 + s3c_device_ts.name = "s3c2440-ts";
16769 s3c_device_usbgadget.name = "s3c2440-usbgadget";
16770 }
16771
16772 Index: linux-2.6.24.7/arch/arm/plat-s3c24xx/time.c
16773 ===================================================================
16774 --- linux-2.6.24.7.orig/arch/arm/plat-s3c24xx/time.c 2008-12-11 22:46:07.000000000 +0100
16775 +++ linux-2.6.24.7/arch/arm/plat-s3c24xx/time.c 2008-12-11 22:46:49.000000000 +0100
16776 @@ -3,6 +3,8 @@
16777 * Copyright (C) 2003-2005 Simtec Electronics
16778 * Ben Dooks, <ben@simtec.co.uk>
16779 *
16780 + * dyn_tick support by Andrzej Zaborowski based on omap_dyn_tick_timer.
16781 + *
16782 * This program is free software; you can redistribute it and/or modify
16783 * it under the terms of the GNU General Public License as published by
16784 * the Free Software Foundation; either version 2 of the License, or
16785 @@ -42,6 +44,10 @@
16786
16787 static unsigned long timer_startval;
16788 static unsigned long timer_usec_ticks;
16789 +static struct work_struct resume_work;
16790 +
16791 +unsigned long pclk;
16792 +struct clk *clk;
16793
16794 #define TIMER_USEC_SHIFT 16
16795
16796 @@ -179,11 +185,7 @@ static void s3c2410_timer_setup (void)
16797 tcfg1 &= ~S3C2410_TCFG1_MUX4_MASK;
16798 tcfg1 |= S3C2410_TCFG1_MUX4_TCLK1;
16799 } else {
16800 - unsigned long pclk;
16801 - struct clk *clk;
16802 -
16803 - /* for the h1940 (and others), we use the pclk from the core
16804 - * to generate the timer values. since values around 50 to
16805 + /* since values around 50 to
16806 * 70MHz are not values we can directly generate the timer
16807 * value from, we need to pre-scale and divide before using it.
16808 *
16809 @@ -191,19 +193,9 @@ static void s3c2410_timer_setup (void)
16810 * (8.45 ticks per usec)
16811 */
16812
16813 - /* this is used as default if no other timer can be found */
16814 -
16815 - clk = clk_get(NULL, "timers");
16816 - if (IS_ERR(clk))
16817 - panic("failed to get clock for system timer");
16818 -
16819 - clk_enable(clk);
16820 -
16821 - pclk = clk_get_rate(clk);
16822 -
16823 /* configure clock tick */
16824 -
16825 timer_usec_ticks = timer_mask_usec_ticks(6, pclk);
16826 + printk("timer_usec_ticks = %lu\n", timer_usec_ticks);
16827
16828 tcfg1 &= ~S3C2410_TCFG1_MUX4_MASK;
16829 tcfg1 |= S3C2410_TCFG1_MUX4_DIV2;
16830 @@ -247,16 +239,244 @@ static void s3c2410_timer_setup (void)
16831 tcon |= S3C2410_TCON_T4START;
16832 tcon &= ~S3C2410_TCON_T4MANUALUPD;
16833 __raw_writel(tcon, S3C2410_TCON);
16834 +
16835 + __raw_writel(__raw_readl(S3C2410_INTMSK) & (~(1UL << 14)),
16836 + S3C2410_INTMSK);
16837 +
16838 +}
16839 +
16840 +struct sys_timer s3c24xx_timer;
16841 +static void timer_resume_work(struct work_struct *work)
16842 +{
16843 + clk_enable(clk);
16844 +
16845 +#ifdef CONFIG_NO_IDLE_HZ
16846 + if (s3c24xx_timer.dyn_tick->state & DYN_TICK_ENABLED)
16847 + s3c24xx_timer.dyn_tick->enable();
16848 + else
16849 +#endif
16850 + s3c2410_timer_setup();
16851 }
16852
16853 static void __init s3c2410_timer_init (void)
16854 {
16855 + if (!use_tclk1_12()) {
16856 + /* for the h1940 (and others), we use the pclk from the core
16857 + * to generate the timer values.
16858 + */
16859 +
16860 + /* this is used as default if no other timer can be found */
16861 + clk = clk_get(NULL, "timers");
16862 + if (IS_ERR(clk))
16863 + panic("failed to get clock for system timer");
16864 +
16865 + clk_enable(clk);
16866 +
16867 + pclk = clk_get_rate(clk);
16868 + printk("pclk = %lu\n", pclk);
16869 + }
16870 +
16871 + INIT_WORK(&resume_work, timer_resume_work);
16872 s3c2410_timer_setup();
16873 setup_irq(IRQ_TIMER4, &s3c2410_timer_irq);
16874 }
16875
16876 +static void s3c2410_timer_resume_work(struct work_struct *work)
16877 +{
16878 + s3c2410_timer_setup();
16879 +}
16880 +
16881 +static void s3c2410_timer_resume(void)
16882 +{
16883 + static DECLARE_WORK(work, s3c2410_timer_resume_work);
16884 + int res;
16885 +
16886 + res = schedule_work(&work);
16887 + if (!res)
16888 + printk(KERN_ERR
16889 + "s3c2410_timer_resume_work already queued ???\n");
16890 +}
16891 +
16892 +#ifdef CONFIG_NO_IDLE_HZ
16893 +/*
16894 + * We'll set a constant prescaler so we don't have to bother setting it
16895 + * when reprogramming and so that we avoid costly divisions.
16896 + *
16897 + * (2 * HZ) << INPUT_FREQ_SHIFT is the desired frequency after prescaler.
16898 + * At HZ == 200, HZ * 1024 should work for PCLKs of up to ~53.5 MHz.
16899 + */
16900 +#define INPUT_FREQ_SHIFT 9
16901 +
16902 +static int ticks_last;
16903 +static int ticks_left;
16904 +static uint32_t tcnto_last;
16905 +
16906 +static inline int s3c24xx_timer_read(void)
16907 +{
16908 + uint32_t tcnto = __raw_readl(S3C2410_TCNTO(4));
16909 +
16910 + /*
16911 + * WARNING: sometimes we get called before TCNTB has been
16912 + * loaded into the counter and TCNTO then returns its previous
16913 + * value and kill us, so don't do anything before counter is
16914 + * reloaded.
16915 + */
16916 + if (unlikely(tcnto == tcnto_last))
16917 + return ticks_last;
16918 +
16919 + tcnto_last = -1;
16920 + return tcnto <<
16921 + ((__raw_readl(S3C2410_TCFG1) >> S3C2410_TCFG1_MUX4_SHIFT) & 3);
16922 +}
16923 +
16924 +static inline void s3c24xx_timer_program(int ticks)
16925 +{
16926 + uint32_t tcon = __raw_readl(S3C2410_TCON) & ~(7 << 20);
16927 + uint32_t tcfg1 = __raw_readl(S3C2410_TCFG1) & ~S3C2410_TCFG1_MUX4_MASK;
16928 +
16929 + /* Just make sure the timer is stopped. */
16930 + __raw_writel(tcon, S3C2410_TCON);
16931 +
16932 + /* TODO: add likely()ies / unlikely()ies */
16933 + if (ticks >> 18) {
16934 + ticks_last = min(ticks, 0xffff << 3);
16935 + ticks_left = ticks - ticks_last;
16936 + __raw_writel(tcfg1 | S3C2410_TCFG1_MUX4_DIV16, S3C2410_TCFG1);
16937 + __raw_writel(ticks_last >> 3, S3C2410_TCNTB(4));
16938 + } else if (ticks >> 17) {
16939 + ticks_last = ticks;
16940 + ticks_left = 0;
16941 + __raw_writel(tcfg1 | S3C2410_TCFG1_MUX4_DIV8, S3C2410_TCFG1);
16942 + __raw_writel(ticks_last >> 2, S3C2410_TCNTB(4));
16943 + } else if (ticks >> 16) {
16944 + ticks_last = ticks;
16945 + ticks_left = 0;
16946 + __raw_writel(tcfg1 | S3C2410_TCFG1_MUX4_DIV4, S3C2410_TCFG1);
16947 + __raw_writel(ticks_last >> 1, S3C2410_TCNTB(4));
16948 + } else {
16949 + ticks_last = ticks;
16950 + ticks_left = 0;
16951 + __raw_writel(tcfg1 | S3C2410_TCFG1_MUX4_DIV2, S3C2410_TCFG1);
16952 + __raw_writel(ticks_last >> 0, S3C2410_TCNTB(4));
16953 + }
16954 +
16955 + tcnto_last = __raw_readl(S3C2410_TCNTO(4));
16956 + __raw_writel(tcon | S3C2410_TCON_T4MANUALUPD,
16957 + S3C2410_TCON);
16958 + __raw_writel(tcon | S3C2410_TCON_T4START,
16959 + S3C2410_TCON);
16960 +}
16961 +
16962 +/*
16963 + * If we have already waited all the time we were supposed to wait,
16964 + * kick the timer, setting the longest allowed timeout value just
16965 + * for time-keeping.
16966 + */
16967 +static inline void s3c24xx_timer_program_idle(void)
16968 +{
16969 + s3c24xx_timer_program(0xffff << 3);
16970 +}
16971 +
16972 +static inline void s3c24xx_timer_update(int restart)
16973 +{
16974 + int ticks_cur = s3c24xx_timer_read();
16975 + int jiffies_elapsed = (ticks_last - ticks_cur) >> INPUT_FREQ_SHIFT;
16976 + int subjiffy = ticks_last - (jiffies_elapsed << INPUT_FREQ_SHIFT);
16977 +
16978 + if (restart) {
16979 + if (ticks_left >= (1 << INPUT_FREQ_SHIFT))
16980 + s3c24xx_timer_program(ticks_left);
16981 + else
16982 + s3c24xx_timer_program_idle();
16983 + ticks_last += subjiffy;
16984 + } else
16985 + ticks_last = subjiffy;
16986 +
16987 + while (jiffies_elapsed --)
16988 + timer_tick();
16989 +}
16990 +
16991 +/* Called when the timer expires. */
16992 +static irqreturn_t s3c24xx_timer_handler(int irq, void *dev_id)
16993 +{
16994 + tcnto_last = -1;
16995 + s3c24xx_timer_update(1);
16996 +
16997 + return IRQ_HANDLED;
16998 +}
16999 +
17000 +/* Called to update jiffies with time elapsed. */
17001 +static irqreturn_t s3c24xx_timer_handler_dyn_tick(int irq, void *dev_id)
17002 +{
17003 + s3c24xx_timer_update(0);
17004 +
17005 + return IRQ_HANDLED;
17006 +}
17007 +
17008 +/*
17009 + * Programs the next timer interrupt needed. Called when dynamic tick is
17010 + * enabled, and to reprogram the ticks to skip from pm_idle. The CPU goes
17011 + * to sleep directly after this.
17012 + */
17013 +static void s3c24xx_timer_reprogram_dyn_tick(unsigned long next_jiffies)
17014 +{
17015 + int subjiffy_left = ticks_last - s3c24xx_timer_read();
17016 +
17017 + s3c24xx_timer_program(max((int) next_jiffies, 1) << INPUT_FREQ_SHIFT);
17018 + ticks_last += subjiffy_left;
17019 +}
17020 +
17021 +static unsigned long s3c24xx_timer_offset_dyn_tick(void)
17022 +{
17023 + /* TODO */
17024 + return 0;
17025 +}
17026 +
17027 +static int s3c24xx_timer_enable_dyn_tick(void)
17028 +{
17029 + /* Set our constant prescaler. */
17030 + uint32_t tcfg0 = __raw_readl(S3C2410_TCFG0);
17031 + int prescaler =
17032 + max(min(256, (int) pclk / (HZ << (INPUT_FREQ_SHIFT + 1))), 1);
17033 +
17034 + tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
17035 + tcfg0 |= (prescaler - 1) << S3C2410_TCFG_PRESCALER1_SHIFT;
17036 + __raw_writel(tcfg0, S3C2410_TCFG0);
17037 +
17038 + /* Override handlers. */
17039 + s3c2410_timer_irq.handler = s3c24xx_timer_handler;
17040 + s3c24xx_timer.offset = s3c24xx_timer_offset_dyn_tick;
17041 +
17042 + printk(KERN_INFO "dyn_tick enabled on s3c24xx timer 4, "
17043 + "%li Hz pclk with prescaler %i\n", pclk, prescaler);
17044 +
17045 + s3c24xx_timer_program_idle();
17046 +
17047 + return 0;
17048 +}
17049 +
17050 +static int s3c24xx_timer_disable_dyn_tick(void)
17051 +{
17052 + s3c2410_timer_irq.handler = s3c2410_timer_interrupt;
17053 + s3c24xx_timer.offset = s3c2410_gettimeoffset;
17054 + s3c2410_timer_setup();
17055 +
17056 + return 0;
17057 +}
17058 +
17059 +static struct dyn_tick_timer s3c24xx_dyn_tick_timer = {
17060 + .enable = s3c24xx_timer_enable_dyn_tick,
17061 + .disable = s3c24xx_timer_disable_dyn_tick,
17062 + .reprogram = s3c24xx_timer_reprogram_dyn_tick,
17063 + .handler = s3c24xx_timer_handler_dyn_tick,
17064 +};
17065 +#endif /* CONFIG_NO_IDLE_HZ */
17066 +
17067 struct sys_timer s3c24xx_timer = {
17068 .init = s3c2410_timer_init,
17069 .offset = s3c2410_gettimeoffset,
17070 - .resume = s3c2410_timer_setup
17071 + .resume = s3c2410_timer_resume,
17072 +#ifdef CONFIG_NO_IDLE_HZ
17073 + .dyn_tick = &s3c24xx_dyn_tick_timer,
17074 +#endif
17075 };
17076 Index: linux-2.6.24.7/defconfig-gta01
17077 ===================================================================
17078 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
17079 +++ linux-2.6.24.7/defconfig-gta01 2008-12-11 22:46:49.000000000 +0100
17080 @@ -0,0 +1,1770 @@
17081 +#
17082 +# Automatically generated make config: don't edit
17083 +# Linux kernel version: 2.6.24
17084 +# Mon Feb 25 07:03:56 2008
17085 +#
17086 +CONFIG_ARM=y
17087 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
17088 +CONFIG_GENERIC_GPIO=y
17089 +# CONFIG_GENERIC_TIME is not set
17090 +# CONFIG_GENERIC_CLOCKEVENTS is not set
17091 +CONFIG_MMU=y
17092 +CONFIG_NO_IOPORT=y
17093 +CONFIG_GENERIC_HARDIRQS=y
17094 +CONFIG_STACKTRACE_SUPPORT=y
17095 +CONFIG_LOCKDEP_SUPPORT=y
17096 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
17097 +CONFIG_HARDIRQS_SW_RESEND=y
17098 +CONFIG_GENERIC_IRQ_PROBE=y
17099 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
17100 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
17101 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
17102 +CONFIG_GENERIC_HWEIGHT=y
17103 +CONFIG_GENERIC_CALIBRATE_DELAY=y
17104 +CONFIG_ZONE_DMA=y
17105 +CONFIG_FIQ=y
17106 +CONFIG_VECTORS_BASE=0xffff0000
17107 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
17108 +
17109 +#
17110 +# General setup
17111 +#
17112 +CONFIG_EXPERIMENTAL=y
17113 +CONFIG_BROKEN_ON_SMP=y
17114 +CONFIG_LOCK_KERNEL=y
17115 +CONFIG_INIT_ENV_ARG_LIMIT=32
17116 +CONFIG_LOCALVERSION=""
17117 +# CONFIG_LOCALVERSION_AUTO is not set
17118 +CONFIG_SWAP=y
17119 +CONFIG_SYSVIPC=y
17120 +CONFIG_SYSVIPC_SYSCTL=y
17121 +# CONFIG_POSIX_MQUEUE is not set
17122 +# CONFIG_BSD_PROCESS_ACCT is not set
17123 +# CONFIG_TASKSTATS is not set
17124 +# CONFIG_USER_NS is not set
17125 +# CONFIG_PID_NS is not set
17126 +# CONFIG_AUDIT is not set
17127 +CONFIG_IKCONFIG=y
17128 +CONFIG_IKCONFIG_PROC=y
17129 +CONFIG_LOG_BUF_SHIFT=14
17130 +# CONFIG_CGROUPS is not set
17131 +# CONFIG_FAIR_GROUP_SCHED is not set
17132 +# CONFIG_SYSFS_DEPRECATED is not set
17133 +# CONFIG_RELAY is not set
17134 +CONFIG_BLK_DEV_INITRD=y
17135 +CONFIG_INITRAMFS_SOURCE=""
17136 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
17137 +CONFIG_SYSCTL=y
17138 +# CONFIG_EMBEDDED is not set
17139 +CONFIG_UID16=y
17140 +CONFIG_SYSCTL_SYSCALL=y
17141 +CONFIG_KALLSYMS=y
17142 +# CONFIG_KALLSYMS_ALL is not set
17143 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
17144 +CONFIG_HOTPLUG=y
17145 +CONFIG_PRINTK=y
17146 +CONFIG_BUG=y
17147 +CONFIG_ELF_CORE=y
17148 +CONFIG_BASE_FULL=y
17149 +CONFIG_FUTEX=y
17150 +CONFIG_ANON_INODES=y
17151 +CONFIG_EPOLL=y
17152 +CONFIG_SIGNALFD=y
17153 +CONFIG_EVENTFD=y
17154 +CONFIG_SHMEM=y
17155 +CONFIG_VM_EVENT_COUNTERS=y
17156 +CONFIG_SLAB=y
17157 +# CONFIG_SLUB is not set
17158 +# CONFIG_SLOB is not set
17159 +CONFIG_SLABINFO=y
17160 +CONFIG_RT_MUTEXES=y
17161 +# CONFIG_TINY_SHMEM is not set
17162 +CONFIG_BASE_SMALL=0
17163 +CONFIG_MODULES=y
17164 +CONFIG_MODULE_UNLOAD=y
17165 +CONFIG_MODULE_FORCE_UNLOAD=y
17166 +# CONFIG_MODVERSIONS is not set
17167 +# CONFIG_MODULE_SRCVERSION_ALL is not set
17168 +CONFIG_KMOD=y
17169 +CONFIG_BLOCK=y
17170 +# CONFIG_LBD is not set
17171 +# CONFIG_BLK_DEV_IO_TRACE is not set
17172 +# CONFIG_LSF is not set
17173 +# CONFIG_BLK_DEV_BSG is not set
17174 +
17175 +#
17176 +# IO Schedulers
17177 +#
17178 +CONFIG_IOSCHED_NOOP=y
17179 +CONFIG_IOSCHED_AS=m
17180 +CONFIG_IOSCHED_DEADLINE=y
17181 +CONFIG_IOSCHED_CFQ=m
17182 +# CONFIG_DEFAULT_AS is not set
17183 +CONFIG_DEFAULT_DEADLINE=y
17184 +# CONFIG_DEFAULT_CFQ is not set
17185 +# CONFIG_DEFAULT_NOOP is not set
17186 +CONFIG_DEFAULT_IOSCHED="deadline"
17187 +
17188 +#
17189 +# System Type
17190 +#
17191 +# CONFIG_ARCH_AAEC2000 is not set
17192 +# CONFIG_ARCH_INTEGRATOR is not set
17193 +# CONFIG_ARCH_REALVIEW is not set
17194 +# CONFIG_ARCH_VERSATILE is not set
17195 +# CONFIG_ARCH_AT91 is not set
17196 +# CONFIG_ARCH_CLPS7500 is not set
17197 +# CONFIG_ARCH_CLPS711X is not set
17198 +# CONFIG_ARCH_CO285 is not set
17199 +# CONFIG_ARCH_EBSA110 is not set
17200 +# CONFIG_ARCH_EP93XX is not set
17201 +# CONFIG_ARCH_FOOTBRIDGE is not set
17202 +# CONFIG_ARCH_NETX is not set
17203 +# CONFIG_ARCH_H720X is not set
17204 +# CONFIG_ARCH_IMX is not set
17205 +# CONFIG_ARCH_IOP13XX is not set
17206 +# CONFIG_ARCH_IOP32X is not set
17207 +# CONFIG_ARCH_IOP33X is not set
17208 +# CONFIG_ARCH_IXP23XX is not set
17209 +# CONFIG_ARCH_IXP2000 is not set
17210 +# CONFIG_ARCH_IXP4XX is not set
17211 +# CONFIG_ARCH_L7200 is not set
17212 +# CONFIG_ARCH_KS8695 is not set
17213 +# CONFIG_ARCH_NS9XXX is not set
17214 +# CONFIG_ARCH_MXC is not set
17215 +# CONFIG_ARCH_PNX4008 is not set
17216 +# CONFIG_ARCH_PXA is not set
17217 +# CONFIG_ARCH_RPC is not set
17218 +# CONFIG_ARCH_SA1100 is not set
17219 +CONFIG_ARCH_S3C2410=y
17220 +# CONFIG_ARCH_SHARK is not set
17221 +# CONFIG_ARCH_LH7A40X is not set
17222 +# CONFIG_ARCH_DAVINCI is not set
17223 +# CONFIG_ARCH_OMAP is not set
17224 +CONFIG_PLAT_S3C24XX=y
17225 +CONFIG_CPU_S3C244X=y
17226 +CONFIG_S3C2410_DMA=y
17227 +# CONFIG_S3C2410_DMA_DEBUG is not set
17228 +CONFIG_MACH_SMDK=y
17229 +CONFIG_MACH_NEO1973=y
17230 +CONFIG_PLAT_S3C=y
17231 +CONFIG_CPU_LLSERIAL_S3C2410=y
17232 +CONFIG_CPU_LLSERIAL_S3C2440=y
17233 +
17234 +#
17235 +# Boot options
17236 +#
17237 +# CONFIG_S3C_BOOT_WATCHDOG is not set
17238 +# CONFIG_S3C_BOOT_ERROR_RESET is not set
17239 +
17240 +#
17241 +# Power management
17242 +#
17243 +# CONFIG_S3C2410_PM_DEBUG is not set
17244 +# CONFIG_S3C2410_PM_CHECK is not set
17245 +CONFIG_S3C_LOWLEVEL_UART_PORT=0
17246 +
17247 +#
17248 +# S3C2400 Machines
17249 +#
17250 +CONFIG_CPU_S3C2410=y
17251 +CONFIG_CPU_S3C2410_DMA=y
17252 +CONFIG_S3C2410_PM=y
17253 +CONFIG_S3C2410_GPIO=y
17254 +CONFIG_S3C2410_CLOCK=y
17255 +CONFIG_S3C2410_PWM=y
17256 +
17257 +#
17258 +# S3C2410 Machines
17259 +#
17260 +# CONFIG_ARCH_SMDK2410 is not set
17261 +# CONFIG_ARCH_H1940 is not set
17262 +# CONFIG_MACH_N30 is not set
17263 +# CONFIG_ARCH_BAST is not set
17264 +# CONFIG_MACH_OTOM is not set
17265 +# CONFIG_MACH_AML_M5900 is not set
17266 +# CONFIG_MACH_VR1000 is not set
17267 +CONFIG_MACH_QT2410=y
17268 +CONFIG_MACH_NEO1973_GTA01=y
17269 +
17270 +#
17271 +# S3C2412 Machines
17272 +#
17273 +# CONFIG_MACH_SMDK2413 is not set
17274 +# CONFIG_MACH_SMDK2412 is not set
17275 +# CONFIG_MACH_VSTMS is not set
17276 +CONFIG_CPU_S3C2440=y
17277 +CONFIG_S3C2440_DMA=y
17278 +CONFIG_S3C2440_C_FIQ=y
17279 +
17280 +#
17281 +# S3C2440 Machines
17282 +#
17283 +# CONFIG_MACH_ANUBIS is not set
17284 +# CONFIG_MACH_OSIRIS is not set
17285 +# CONFIG_MACH_RX3715 is not set
17286 +CONFIG_ARCH_S3C2440=y
17287 +# CONFIG_MACH_NEXCODER_2440 is not set
17288 +CONFIG_SMDK2440_CPU2440=y
17289 +CONFIG_MACH_HXD8=y
17290 +CONFIG_MACH_NEO1973_GTA02=y
17291 +# CONFIG_NEO1973_GTA02_2440 is not set
17292 +CONFIG_CPU_S3C2442=y
17293 +
17294 +#
17295 +# S3C2442 Machines
17296 +#
17297 +CONFIG_SMDK2440_CPU2442=y
17298 +
17299 +#
17300 +# S3C2443 Machines
17301 +#
17302 +# CONFIG_MACH_SMDK2443 is not set
17303 +
17304 +#
17305 +# Processor Type
17306 +#
17307 +CONFIG_CPU_32=y
17308 +CONFIG_CPU_ARM920T=y
17309 +CONFIG_CPU_32v4T=y
17310 +CONFIG_CPU_ABRT_EV4T=y
17311 +CONFIG_CPU_CACHE_V4WT=y
17312 +CONFIG_CPU_CACHE_VIVT=y
17313 +CONFIG_CPU_COPY_V4WB=y
17314 +CONFIG_CPU_TLB_V4WBI=y
17315 +CONFIG_CPU_CP15=y
17316 +CONFIG_CPU_CP15_MMU=y
17317 +
17318 +#
17319 +# Processor Features
17320 +#
17321 +CONFIG_ARM_THUMB=y
17322 +# CONFIG_CPU_ICACHE_DISABLE is not set
17323 +# CONFIG_CPU_DCACHE_DISABLE is not set
17324 +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
17325 +# CONFIG_OUTER_CACHE is not set
17326 +
17327 +#
17328 +# Bus support
17329 +#
17330 +# CONFIG_PCI_SYSCALL is not set
17331 +# CONFIG_ARCH_SUPPORTS_MSI is not set
17332 +# CONFIG_PCCARD is not set
17333 +
17334 +#
17335 +# Kernel Features
17336 +#
17337 +# CONFIG_TICK_ONESHOT is not set
17338 +CONFIG_PREEMPT=y
17339 +CONFIG_NO_IDLE_HZ=y
17340 +CONFIG_HZ=200
17341 +CONFIG_AEABI=y
17342 +CONFIG_OABI_COMPAT=y
17343 +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
17344 +CONFIG_SELECT_MEMORY_MODEL=y
17345 +CONFIG_FLATMEM_MANUAL=y
17346 +# CONFIG_DISCONTIGMEM_MANUAL is not set
17347 +# CONFIG_SPARSEMEM_MANUAL is not set
17348 +CONFIG_FLATMEM=y
17349 +CONFIG_FLAT_NODE_MEM_MAP=y
17350 +# CONFIG_SPARSEMEM_STATIC is not set
17351 +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
17352 +CONFIG_SPLIT_PTLOCK_CPUS=4096
17353 +# CONFIG_RESOURCES_64BIT is not set
17354 +CONFIG_ZONE_DMA_FLAG=1
17355 +CONFIG_BOUNCE=y
17356 +CONFIG_VIRT_TO_BUS=y
17357 +CONFIG_ALIGNMENT_TRAP=y
17358 +
17359 +#
17360 +# Boot options
17361 +#
17362 +CONFIG_ZBOOT_ROM_TEXT=0x0
17363 +CONFIG_ZBOOT_ROM_BSS=0x0
17364 +CONFIG_CMDLINE="unused -- bootloader passes ATAG list"
17365 +# CONFIG_XIP_KERNEL is not set
17366 +CONFIG_KEXEC=y
17367 +CONFIG_ATAGS_PROC=y
17368 +
17369 +#
17370 +# Floating point emulation
17371 +#
17372 +
17373 +#
17374 +# At least one emulation must be selected
17375 +#
17376 +CONFIG_FPE_NWFPE=y
17377 +# CONFIG_FPE_NWFPE_XP is not set
17378 +# CONFIG_FPE_FASTFPE is not set
17379 +
17380 +#
17381 +# Userspace binary formats
17382 +#
17383 +CONFIG_BINFMT_ELF=y
17384 +# CONFIG_BINFMT_AOUT is not set
17385 +# CONFIG_BINFMT_MISC is not set
17386 +
17387 +#
17388 +# Power management options
17389 +#
17390 +CONFIG_PM=y
17391 +CONFIG_PM_LEGACY=y
17392 +CONFIG_PM_DEBUG=y
17393 +# CONFIG_PM_VERBOSE is not set
17394 +CONFIG_PM_SLEEP=y
17395 +CONFIG_SUSPEND_UP_POSSIBLE=y
17396 +CONFIG_SUSPEND=y
17397 +CONFIG_APM_EMULATION=y
17398 +
17399 +#
17400 +# Networking
17401 +#
17402 +CONFIG_NET=y
17403 +
17404 +#
17405 +# Networking options
17406 +#
17407 +CONFIG_PACKET=y
17408 +CONFIG_PACKET_MMAP=y
17409 +CONFIG_UNIX=y
17410 +CONFIG_XFRM=y
17411 +# CONFIG_XFRM_USER is not set
17412 +# CONFIG_XFRM_SUB_POLICY is not set
17413 +CONFIG_XFRM_MIGRATE=y
17414 +CONFIG_NET_KEY=m
17415 +CONFIG_NET_KEY_MIGRATE=y
17416 +CONFIG_INET=y
17417 +CONFIG_IP_MULTICAST=y
17418 +CONFIG_IP_ADVANCED_ROUTER=y
17419 +CONFIG_ASK_IP_FIB_HASH=y
17420 +# CONFIG_IP_FIB_TRIE is not set
17421 +CONFIG_IP_FIB_HASH=y
17422 +CONFIG_IP_MULTIPLE_TABLES=y
17423 +# CONFIG_IP_ROUTE_MULTIPATH is not set
17424 +# CONFIG_IP_ROUTE_VERBOSE is not set
17425 +CONFIG_IP_PNP=y
17426 +# CONFIG_IP_PNP_DHCP is not set
17427 +# CONFIG_IP_PNP_BOOTP is not set
17428 +# CONFIG_IP_PNP_RARP is not set
17429 +CONFIG_NET_IPIP=m
17430 +CONFIG_NET_IPGRE=m
17431 +# CONFIG_NET_IPGRE_BROADCAST is not set
17432 +# CONFIG_IP_MROUTE is not set
17433 +# CONFIG_ARPD is not set
17434 +CONFIG_SYN_COOKIES=y
17435 +CONFIG_INET_AH=m
17436 +CONFIG_INET_ESP=m
17437 +CONFIG_INET_IPCOMP=m
17438 +CONFIG_INET_XFRM_TUNNEL=m
17439 +CONFIG_INET_TUNNEL=m
17440 +CONFIG_INET_XFRM_MODE_TRANSPORT=m
17441 +CONFIG_INET_XFRM_MODE_TUNNEL=m
17442 +CONFIG_INET_XFRM_MODE_BEET=m
17443 +# CONFIG_INET_LRO is not set
17444 +CONFIG_INET_DIAG=y
17445 +CONFIG_INET_TCP_DIAG=y
17446 +# CONFIG_TCP_CONG_ADVANCED is not set
17447 +CONFIG_TCP_CONG_CUBIC=y
17448 +CONFIG_DEFAULT_TCP_CONG="cubic"
17449 +CONFIG_TCP_MD5SIG=y
17450 +# CONFIG_IP_VS is not set
17451 +CONFIG_IPV6=m
17452 +# CONFIG_IPV6_PRIVACY is not set
17453 +# CONFIG_IPV6_ROUTER_PREF is not set
17454 +# CONFIG_IPV6_OPTIMISTIC_DAD is not set
17455 +CONFIG_INET6_AH=m
17456 +CONFIG_INET6_ESP=m
17457 +CONFIG_INET6_IPCOMP=m
17458 +# CONFIG_IPV6_MIP6 is not set
17459 +CONFIG_INET6_XFRM_TUNNEL=m
17460 +CONFIG_INET6_TUNNEL=m
17461 +CONFIG_INET6_XFRM_MODE_TRANSPORT=m
17462 +CONFIG_INET6_XFRM_MODE_TUNNEL=m
17463 +CONFIG_INET6_XFRM_MODE_BEET=m
17464 +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
17465 +CONFIG_IPV6_SIT=m
17466 +CONFIG_IPV6_TUNNEL=m
17467 +# CONFIG_IPV6_MULTIPLE_TABLES is not set
17468 +# CONFIG_NETWORK_SECMARK is not set
17469 +CONFIG_NETFILTER=y
17470 +# CONFIG_NETFILTER_DEBUG is not set
17471 +
17472 +#
17473 +# Core Netfilter Configuration
17474 +#
17475 +CONFIG_NETFILTER_NETLINK=m
17476 +CONFIG_NETFILTER_NETLINK_QUEUE=m
17477 +CONFIG_NETFILTER_NETLINK_LOG=m
17478 +CONFIG_NF_CONNTRACK_ENABLED=m
17479 +CONFIG_NF_CONNTRACK=m
17480 +CONFIG_NF_CT_ACCT=y
17481 +CONFIG_NF_CONNTRACK_MARK=y
17482 +CONFIG_NF_CONNTRACK_EVENTS=y
17483 +CONFIG_NF_CT_PROTO_GRE=m
17484 +CONFIG_NF_CT_PROTO_SCTP=m
17485 +# CONFIG_NF_CT_PROTO_UDPLITE is not set
17486 +# CONFIG_NF_CONNTRACK_AMANDA is not set
17487 +CONFIG_NF_CONNTRACK_FTP=m
17488 +CONFIG_NF_CONNTRACK_H323=m
17489 +CONFIG_NF_CONNTRACK_IRC=m
17490 +CONFIG_NF_CONNTRACK_NETBIOS_NS=m
17491 +CONFIG_NF_CONNTRACK_PPTP=m
17492 +CONFIG_NF_CONNTRACK_SANE=m
17493 +CONFIG_NF_CONNTRACK_SIP=m
17494 +CONFIG_NF_CONNTRACK_TFTP=m
17495 +CONFIG_NF_CT_NETLINK=m
17496 +CONFIG_NETFILTER_XTABLES=m
17497 +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
17498 +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
17499 +CONFIG_NETFILTER_XT_TARGET_DSCP=m
17500 +CONFIG_NETFILTER_XT_TARGET_MARK=m
17501 +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
17502 +CONFIG_NETFILTER_XT_TARGET_NFLOG=m
17503 +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
17504 +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
17505 +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
17506 +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
17507 +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
17508 +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
17509 +CONFIG_NETFILTER_XT_MATCH_DCCP=m
17510 +CONFIG_NETFILTER_XT_MATCH_DSCP=m
17511 +CONFIG_NETFILTER_XT_MATCH_ESP=m
17512 +CONFIG_NETFILTER_XT_MATCH_HELPER=m
17513 +CONFIG_NETFILTER_XT_MATCH_LENGTH=m
17514 +CONFIG_NETFILTER_XT_MATCH_LIMIT=m
17515 +CONFIG_NETFILTER_XT_MATCH_MAC=m
17516 +CONFIG_NETFILTER_XT_MATCH_MARK=m
17517 +CONFIG_NETFILTER_XT_MATCH_POLICY=m
17518 +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
17519 +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
17520 +CONFIG_NETFILTER_XT_MATCH_QUOTA=m
17521 +CONFIG_NETFILTER_XT_MATCH_REALM=m
17522 +CONFIG_NETFILTER_XT_MATCH_SCTP=m
17523 +CONFIG_NETFILTER_XT_MATCH_STATE=m
17524 +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
17525 +CONFIG_NETFILTER_XT_MATCH_STRING=m
17526 +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
17527 +# CONFIG_NETFILTER_XT_MATCH_TIME is not set
17528 +# CONFIG_NETFILTER_XT_MATCH_U32 is not set
17529 +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
17530 +
17531 +#
17532 +# IP: Netfilter Configuration
17533 +#
17534 +CONFIG_NF_CONNTRACK_IPV4=m
17535 +CONFIG_NF_CONNTRACK_PROC_COMPAT=y
17536 +# CONFIG_IP_NF_QUEUE is not set
17537 +CONFIG_IP_NF_IPTABLES=m
17538 +CONFIG_IP_NF_MATCH_IPRANGE=m
17539 +CONFIG_IP_NF_MATCH_TOS=m
17540 +# CONFIG_IP_NF_MATCH_RECENT is not set
17541 +CONFIG_IP_NF_MATCH_ECN=m
17542 +CONFIG_IP_NF_MATCH_AH=m
17543 +CONFIG_IP_NF_MATCH_TTL=m
17544 +CONFIG_IP_NF_MATCH_OWNER=m
17545 +CONFIG_IP_NF_MATCH_ADDRTYPE=m
17546 +CONFIG_IP_NF_FILTER=m
17547 +CONFIG_IP_NF_TARGET_REJECT=m
17548 +CONFIG_IP_NF_TARGET_LOG=m
17549 +CONFIG_IP_NF_TARGET_ULOG=m
17550 +CONFIG_NF_NAT=m
17551 +CONFIG_NF_NAT_NEEDED=y
17552 +CONFIG_IP_NF_TARGET_MASQUERADE=m
17553 +CONFIG_IP_NF_TARGET_REDIRECT=m
17554 +CONFIG_IP_NF_TARGET_NETMAP=m
17555 +CONFIG_IP_NF_TARGET_SAME=m
17556 +CONFIG_NF_NAT_SNMP_BASIC=m
17557 +CONFIG_NF_NAT_PROTO_GRE=m
17558 +CONFIG_NF_NAT_FTP=m
17559 +CONFIG_NF_NAT_IRC=m
17560 +CONFIG_NF_NAT_TFTP=m
17561 +# CONFIG_NF_NAT_AMANDA is not set
17562 +CONFIG_NF_NAT_PPTP=m
17563 +CONFIG_NF_NAT_H323=m
17564 +CONFIG_NF_NAT_SIP=m
17565 +CONFIG_IP_NF_MANGLE=m
17566 +CONFIG_IP_NF_TARGET_TOS=m
17567 +CONFIG_IP_NF_TARGET_ECN=m
17568 +CONFIG_IP_NF_TARGET_TTL=m
17569 +CONFIG_IP_NF_TARGET_CLUSTERIP=m
17570 +# CONFIG_IP_NF_RAW is not set
17571 +# CONFIG_IP_NF_ARPTABLES is not set
17572 +
17573 +#
17574 +# IPv6: Netfilter Configuration (EXPERIMENTAL)
17575 +#
17576 +CONFIG_NF_CONNTRACK_IPV6=m
17577 +# CONFIG_IP6_NF_QUEUE is not set
17578 +CONFIG_IP6_NF_IPTABLES=m
17579 +CONFIG_IP6_NF_MATCH_RT=m
17580 +CONFIG_IP6_NF_MATCH_OPTS=m
17581 +CONFIG_IP6_NF_MATCH_FRAG=m
17582 +CONFIG_IP6_NF_MATCH_HL=m
17583 +CONFIG_IP6_NF_MATCH_OWNER=m
17584 +CONFIG_IP6_NF_MATCH_IPV6HEADER=m
17585 +CONFIG_IP6_NF_MATCH_AH=m
17586 +CONFIG_IP6_NF_MATCH_MH=m
17587 +CONFIG_IP6_NF_MATCH_EUI64=m
17588 +CONFIG_IP6_NF_FILTER=m
17589 +CONFIG_IP6_NF_TARGET_LOG=m
17590 +CONFIG_IP6_NF_TARGET_REJECT=m
17591 +CONFIG_IP6_NF_MANGLE=m
17592 +CONFIG_IP6_NF_TARGET_HL=m
17593 +# CONFIG_IP6_NF_RAW is not set
17594 +# CONFIG_IP_DCCP is not set
17595 +# CONFIG_IP_SCTP is not set
17596 +# CONFIG_TIPC is not set
17597 +# CONFIG_ATM is not set
17598 +# CONFIG_BRIDGE is not set
17599 +# CONFIG_VLAN_8021Q is not set
17600 +# CONFIG_DECNET is not set
17601 +# CONFIG_LLC2 is not set
17602 +# CONFIG_IPX is not set
17603 +# CONFIG_ATALK is not set
17604 +# CONFIG_X25 is not set
17605 +# CONFIG_LAPB is not set
17606 +# CONFIG_ECONET is not set
17607 +# CONFIG_WAN_ROUTER is not set
17608 +CONFIG_NET_SCHED=y
17609 +
17610 +#
17611 +# Queueing/Scheduling
17612 +#
17613 +CONFIG_NET_SCH_CBQ=m
17614 +CONFIG_NET_SCH_HTB=m
17615 +CONFIG_NET_SCH_HFSC=m
17616 +CONFIG_NET_SCH_PRIO=m
17617 +# CONFIG_NET_SCH_RR is not set
17618 +CONFIG_NET_SCH_RED=m
17619 +CONFIG_NET_SCH_SFQ=m
17620 +CONFIG_NET_SCH_TEQL=m
17621 +CONFIG_NET_SCH_TBF=m
17622 +CONFIG_NET_SCH_GRED=m
17623 +CONFIG_NET_SCH_DSMARK=m
17624 +CONFIG_NET_SCH_NETEM=m
17625 +CONFIG_NET_SCH_INGRESS=m
17626 +
17627 +#
17628 +# Classification
17629 +#
17630 +CONFIG_NET_CLS=y
17631 +CONFIG_NET_CLS_BASIC=m
17632 +CONFIG_NET_CLS_TCINDEX=m
17633 +CONFIG_NET_CLS_ROUTE4=m
17634 +CONFIG_NET_CLS_ROUTE=y
17635 +CONFIG_NET_CLS_FW=m
17636 +CONFIG_NET_CLS_U32=m
17637 +CONFIG_CLS_U32_PERF=y
17638 +CONFIG_CLS_U32_MARK=y
17639 +CONFIG_NET_CLS_RSVP=m
17640 +CONFIG_NET_CLS_RSVP6=m
17641 +# CONFIG_NET_EMATCH is not set
17642 +# CONFIG_NET_CLS_ACT is not set
17643 +# CONFIG_NET_CLS_POLICE is not set
17644 +# CONFIG_NET_CLS_IND is not set
17645 +CONFIG_NET_SCH_FIFO=y
17646 +
17647 +#
17648 +# Network testing
17649 +#
17650 +# CONFIG_NET_PKTGEN is not set
17651 +# CONFIG_HAMRADIO is not set
17652 +# CONFIG_IRDA is not set
17653 +CONFIG_BT=m
17654 +CONFIG_BT_L2CAP=m
17655 +CONFIG_BT_SCO=m
17656 +CONFIG_BT_RFCOMM=m
17657 +CONFIG_BT_RFCOMM_TTY=y
17658 +CONFIG_BT_BNEP=m
17659 +CONFIG_BT_BNEP_MC_FILTER=y
17660 +CONFIG_BT_BNEP_PROTO_FILTER=y
17661 +CONFIG_BT_HIDP=m
17662 +
17663 +#
17664 +# Bluetooth device drivers
17665 +#
17666 +CONFIG_BT_HCIUSB=m
17667 +CONFIG_BT_HCIUSB_SCO=y
17668 +# CONFIG_BT_HCIBTSDIO is not set
17669 +# CONFIG_BT_HCIUART is not set
17670 +# CONFIG_BT_HCIBCM203X is not set
17671 +# CONFIG_BT_HCIBPA10X is not set
17672 +# CONFIG_BT_HCIBFUSB is not set
17673 +# CONFIG_BT_HCIVHCI is not set
17674 +# CONFIG_AF_RXRPC is not set
17675 +CONFIG_FIB_RULES=y
17676 +
17677 +#
17678 +# Wireless
17679 +#
17680 +# CONFIG_CFG80211 is not set
17681 +CONFIG_WIRELESS_EXT=y
17682 +# CONFIG_MAC80211 is not set
17683 +# CONFIG_IEEE80211 is not set
17684 +# CONFIG_RFKILL is not set
17685 +# CONFIG_NET_9P is not set
17686 +
17687 +#
17688 +# Device Drivers
17689 +#
17690 +
17691 +#
17692 +# Generic Driver Options
17693 +#
17694 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
17695 +CONFIG_STANDALONE=y
17696 +CONFIG_PREVENT_FIRMWARE_BUILD=y
17697 +CONFIG_FW_LOADER=m
17698 +# CONFIG_DEBUG_DRIVER is not set
17699 +# CONFIG_DEBUG_DEVRES is not set
17700 +# CONFIG_SYS_HYPERVISOR is not set
17701 +CONFIG_CONNECTOR=m
17702 +CONFIG_MTD=y
17703 +# CONFIG_MTD_DEBUG is not set
17704 +# CONFIG_MTD_CONCAT is not set
17705 +CONFIG_MTD_PARTITIONS=y
17706 +# CONFIG_MTD_REDBOOT_PARTS is not set
17707 +CONFIG_MTD_CMDLINE_PARTS=y
17708 +# CONFIG_MTD_AFS_PARTS is not set
17709 +
17710 +#
17711 +# User Modules And Translation Layers
17712 +#
17713 +CONFIG_MTD_CHAR=y
17714 +CONFIG_MTD_BLKDEVS=y
17715 +CONFIG_MTD_BLOCK=y
17716 +# CONFIG_FTL is not set
17717 +# CONFIG_NFTL is not set
17718 +# CONFIG_INFTL is not set
17719 +# CONFIG_RFD_FTL is not set
17720 +# CONFIG_SSFDC is not set
17721 +# CONFIG_MTD_OOPS is not set
17722 +
17723 +#
17724 +# RAM/ROM/Flash chip drivers
17725 +#
17726 +CONFIG_MTD_CFI=y
17727 +# CONFIG_MTD_JEDECPROBE is not set
17728 +CONFIG_MTD_GEN_PROBE=y
17729 +# CONFIG_MTD_CFI_ADV_OPTIONS is not set
17730 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
17731 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
17732 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
17733 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
17734 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
17735 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
17736 +CONFIG_MTD_CFI_I1=y
17737 +CONFIG_MTD_CFI_I2=y
17738 +# CONFIG_MTD_CFI_I4 is not set
17739 +# CONFIG_MTD_CFI_I8 is not set
17740 +CONFIG_MTD_CFI_INTELEXT=y
17741 +# CONFIG_MTD_CFI_AMDSTD is not set
17742 +# CONFIG_MTD_CFI_STAA is not set
17743 +CONFIG_MTD_CFI_UTIL=y
17744 +# CONFIG_MTD_RAM is not set
17745 +# CONFIG_MTD_ROM is not set
17746 +CONFIG_MTD_ABSENT=y
17747 +
17748 +#
17749 +# Mapping drivers for chip access
17750 +#
17751 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
17752 +CONFIG_MTD_PHYSMAP=y
17753 +CONFIG_MTD_PHYSMAP_START=0x8000000
17754 +CONFIG_MTD_PHYSMAP_LEN=0
17755 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2
17756 +# CONFIG_MTD_ARM_INTEGRATOR is not set
17757 +# CONFIG_MTD_PLATRAM is not set
17758 +
17759 +#
17760 +# Self-contained MTD device drivers
17761 +#
17762 +# CONFIG_MTD_DATAFLASH is not set
17763 +# CONFIG_MTD_M25P80 is not set
17764 +# CONFIG_MTD_SLRAM is not set
17765 +# CONFIG_MTD_PHRAM is not set
17766 +# CONFIG_MTD_MTDRAM is not set
17767 +# CONFIG_MTD_BLOCK2MTD is not set
17768 +
17769 +#
17770 +# Disk-On-Chip Device Drivers
17771 +#
17772 +# CONFIG_MTD_DOC2000 is not set
17773 +# CONFIG_MTD_DOC2001 is not set
17774 +# CONFIG_MTD_DOC2001PLUS is not set
17775 +CONFIG_MTD_NAND=y
17776 +CONFIG_MTD_NAND_VERIFY_WRITE=y
17777 +# CONFIG_MTD_NAND_ECC_SMC is not set
17778 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
17779 +CONFIG_MTD_NAND_IDS=y
17780 +CONFIG_MTD_NAND_S3C2410=y
17781 +# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
17782 +CONFIG_MTD_NAND_S3C2410_HWECC=y
17783 +# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
17784 +# CONFIG_MTD_NAND_DISKONCHIP is not set
17785 +# CONFIG_MTD_NAND_NANDSIM is not set
17786 +# CONFIG_MTD_NAND_PLATFORM is not set
17787 +# CONFIG_MTD_ALAUDA is not set
17788 +# CONFIG_MTD_ONENAND is not set
17789 +
17790 +#
17791 +# UBI - Unsorted block images
17792 +#
17793 +# CONFIG_MTD_UBI is not set
17794 +# CONFIG_PARPORT is not set
17795 +CONFIG_PNP=y
17796 +CONFIG_PNP_DEBUG=y
17797 +
17798 +#
17799 +# Protocols
17800 +#
17801 +# CONFIG_PNPACPI is not set
17802 +CONFIG_BLK_DEV=y
17803 +# CONFIG_BLK_DEV_COW_COMMON is not set
17804 +CONFIG_BLK_DEV_LOOP=m
17805 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
17806 +# CONFIG_BLK_DEV_NBD is not set
17807 +CONFIG_BLK_DEV_UB=m
17808 +CONFIG_BLK_DEV_RAM=y
17809 +CONFIG_BLK_DEV_RAM_COUNT=16
17810 +CONFIG_BLK_DEV_RAM_SIZE=4096
17811 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
17812 +# CONFIG_CDROM_PKTCDVD is not set
17813 +# CONFIG_ATA_OVER_ETH is not set
17814 +CONFIG_MISC_DEVICES=y
17815 +# CONFIG_EEPROM_93CX6 is not set
17816 +# CONFIG_IDE is not set
17817 +
17818 +#
17819 +# SCSI device support
17820 +#
17821 +# CONFIG_RAID_ATTRS is not set
17822 +CONFIG_SCSI=m
17823 +CONFIG_SCSI_DMA=y
17824 +# CONFIG_SCSI_TGT is not set
17825 +# CONFIG_SCSI_NETLINK is not set
17826 +CONFIG_SCSI_PROC_FS=y
17827 +
17828 +#
17829 +# SCSI support type (disk, tape, CD-ROM)
17830 +#
17831 +CONFIG_BLK_DEV_SD=m
17832 +# CONFIG_CHR_DEV_ST is not set
17833 +# CONFIG_CHR_DEV_OSST is not set
17834 +CONFIG_BLK_DEV_SR=m
17835 +# CONFIG_BLK_DEV_SR_VENDOR is not set
17836 +CONFIG_CHR_DEV_SG=m
17837 +# CONFIG_CHR_DEV_SCH is not set
17838 +
17839 +#
17840 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
17841 +#
17842 +# CONFIG_SCSI_MULTI_LUN is not set
17843 +# CONFIG_SCSI_CONSTANTS is not set
17844 +# CONFIG_SCSI_LOGGING is not set
17845 +CONFIG_SCSI_SCAN_ASYNC=y
17846 +CONFIG_SCSI_WAIT_SCAN=m
17847 +
17848 +#
17849 +# SCSI Transports
17850 +#
17851 +# CONFIG_SCSI_SPI_ATTRS is not set
17852 +# CONFIG_SCSI_FC_ATTRS is not set
17853 +# CONFIG_SCSI_ISCSI_ATTRS is not set
17854 +# CONFIG_SCSI_SAS_LIBSAS is not set
17855 +# CONFIG_SCSI_SRP_ATTRS is not set
17856 +CONFIG_SCSI_LOWLEVEL=y
17857 +# CONFIG_ISCSI_TCP is not set
17858 +# CONFIG_SCSI_DEBUG is not set
17859 +# CONFIG_ATA is not set
17860 +# CONFIG_MD is not set
17861 +CONFIG_NETDEVICES=y
17862 +# CONFIG_NETDEVICES_MULTIQUEUE is not set
17863 +# CONFIG_DUMMY is not set
17864 +# CONFIG_BONDING is not set
17865 +# CONFIG_MACVLAN is not set
17866 +# CONFIG_EQUALIZER is not set
17867 +CONFIG_TUN=m
17868 +# CONFIG_VETH is not set
17869 +# CONFIG_NET_SB1000 is not set
17870 +# CONFIG_PHYLIB is not set
17871 +CONFIG_NET_ETHERNET=y
17872 +CONFIG_MII=y
17873 +# CONFIG_AX88796 is not set
17874 +# CONFIG_SMC91X is not set
17875 +# CONFIG_DM9000 is not set
17876 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
17877 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
17878 +# CONFIG_IBM_NEW_EMAC_TAH is not set
17879 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
17880 +CONFIG_NET_PCI=y
17881 +# CONFIG_B44 is not set
17882 +CONFIG_CS89x0=m
17883 +# CONFIG_NETDEV_1000 is not set
17884 +# CONFIG_NETDEV_10000 is not set
17885 +
17886 +#
17887 +# Wireless LAN
17888 +#
17889 +# CONFIG_WLAN_PRE80211 is not set
17890 +# CONFIG_WLAN_80211 is not set
17891 +
17892 +#
17893 +# USB Network Adapters
17894 +#
17895 +CONFIG_USB_CATC=m
17896 +CONFIG_USB_KAWETH=m
17897 +CONFIG_USB_PEGASUS=m
17898 +CONFIG_USB_RTL8150=m
17899 +CONFIG_USB_USBNET=y
17900 +CONFIG_USB_NET_AX8817X=m
17901 +CONFIG_USB_NET_CDCETHER=m
17902 +CONFIG_USB_NET_DM9601=m
17903 +CONFIG_USB_NET_GL620A=m
17904 +CONFIG_USB_NET_NET1080=m
17905 +CONFIG_USB_NET_PLUSB=m
17906 +CONFIG_USB_NET_MCS7830=m
17907 +CONFIG_USB_NET_RNDIS_HOST=m
17908 +CONFIG_USB_NET_CDC_SUBSET=m
17909 +CONFIG_USB_ALI_M5632=y
17910 +CONFIG_USB_AN2720=y
17911 +CONFIG_USB_BELKIN=y
17912 +CONFIG_USB_ARMLINUX=y
17913 +CONFIG_USB_EPSON2888=y
17914 +CONFIG_USB_KC2190=y
17915 +CONFIG_USB_NET_ZAURUS=m
17916 +# CONFIG_WAN is not set
17917 +CONFIG_PPP=m
17918 +CONFIG_PPP_MULTILINK=y
17919 +CONFIG_PPP_FILTER=y
17920 +CONFIG_PPP_ASYNC=m
17921 +CONFIG_PPP_SYNC_TTY=m
17922 +CONFIG_PPP_DEFLATE=m
17923 +CONFIG_PPP_BSDCOMP=m
17924 +CONFIG_PPP_MPPE=m
17925 +# CONFIG_PPPOE is not set
17926 +# CONFIG_PPPOL2TP is not set
17927 +# CONFIG_SLIP is not set
17928 +CONFIG_SLHC=m
17929 +# CONFIG_SHAPER is not set
17930 +# CONFIG_NETCONSOLE is not set
17931 +# CONFIG_NETPOLL is not set
17932 +# CONFIG_NET_POLL_CONTROLLER is not set
17933 +# CONFIG_ISDN is not set
17934 +
17935 +#
17936 +# Input device support
17937 +#
17938 +CONFIG_INPUT=y
17939 +# CONFIG_INPUT_FF_MEMLESS is not set
17940 +# CONFIG_INPUT_POLLDEV is not set
17941 +
17942 +#
17943 +# Userland interfaces
17944 +#
17945 +CONFIG_INPUT_MOUSEDEV=y
17946 +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
17947 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
17948 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
17949 +# CONFIG_INPUT_JOYDEV is not set
17950 +CONFIG_INPUT_EVDEV=y
17951 +# CONFIG_INPUT_EVBUG is not set
17952 +
17953 +#
17954 +# Input Device Drivers
17955 +#
17956 +CONFIG_INPUT_KEYBOARD=y
17957 +# CONFIG_KEYBOARD_ATKBD is not set
17958 +# CONFIG_KEYBOARD_SUNKBD is not set
17959 +# CONFIG_KEYBOARD_LKKBD is not set
17960 +# CONFIG_KEYBOARD_XTKBD is not set
17961 +# CONFIG_KEYBOARD_NEWTON is not set
17962 +CONFIG_KEYBOARD_STOWAWAY=m
17963 +CONFIG_KEYBOARD_GPIO=m
17964 +CONFIG_KEYBOARD_NEO1973=y
17965 +CONFIG_KEYBOARD_QT2410=y
17966 +CONFIG_INPUT_MOUSE=y
17967 +# CONFIG_MOUSE_PS2 is not set
17968 +# CONFIG_MOUSE_SERIAL is not set
17969 +# CONFIG_MOUSE_APPLETOUCH is not set
17970 +# CONFIG_MOUSE_VSXXXAA is not set
17971 +# CONFIG_MOUSE_GPIO is not set
17972 +# CONFIG_INPUT_JOYSTICK is not set
17973 +# CONFIG_INPUT_TABLET is not set
17974 +CONFIG_INPUT_TOUCHSCREEN=y
17975 +# CONFIG_TOUCHSCREEN_ADS7846 is not set
17976 +# CONFIG_TOUCHSCREEN_FUJITSU is not set
17977 +CONFIG_TOUCHSCREEN_S3C2410=y
17978 +# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
17979 +# CONFIG_TOUCHSCREEN_GUNZE is not set
17980 +# CONFIG_TOUCHSCREEN_ELO is not set
17981 +# CONFIG_TOUCHSCREEN_MTOUCH is not set
17982 +# CONFIG_TOUCHSCREEN_MK712 is not set
17983 +# CONFIG_TOUCHSCREEN_PENMOUNT is not set
17984 +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
17985 +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
17986 +# CONFIG_TOUCHSCREEN_UCB1400 is not set
17987 +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
17988 +CONFIG_INPUT_MISC=y
17989 +# CONFIG_INPUT_ATI_REMOTE is not set
17990 +# CONFIG_INPUT_ATI_REMOTE2 is not set
17991 +# CONFIG_INPUT_KEYSPAN_REMOTE is not set
17992 +# CONFIG_INPUT_POWERMATE is not set
17993 +# CONFIG_INPUT_YEALINK is not set
17994 +CONFIG_INPUT_UINPUT=m
17995 +CONFIG_INPUT_LIS302DL=y
17996 +
17997 +#
17998 +# Hardware I/O ports
17999 +#
18000 +CONFIG_SERIO=y
18001 +# CONFIG_SERIO_SERPORT is not set
18002 +# CONFIG_SERIO_RAW is not set
18003 +# CONFIG_GAMEPORT is not set
18004 +
18005 +#
18006 +# Character devices
18007 +#
18008 +CONFIG_VT=y
18009 +CONFIG_VT_CONSOLE=y
18010 +CONFIG_NR_TTY_DEVICES=4
18011 +CONFIG_HW_CONSOLE=y
18012 +CONFIG_VT_HW_CONSOLE_BINDING=y
18013 +# CONFIG_SERIAL_NONSTANDARD is not set
18014 +
18015 +#
18016 +# Serial drivers
18017 +#
18018 +# CONFIG_SERIAL_8250 is not set
18019 +
18020 +#
18021 +# Non-8250 serial port support
18022 +#
18023 +CONFIG_SERIAL_S3C2410=y
18024 +CONFIG_SERIAL_S3C2410_CONSOLE=y
18025 +CONFIG_SERIAL_CORE=y
18026 +CONFIG_SERIAL_CORE_CONSOLE=y
18027 +CONFIG_UNIX98_PTYS=y
18028 +# CONFIG_LEGACY_PTYS is not set
18029 +# CONFIG_IPMI_HANDLER is not set
18030 +# CONFIG_HW_RANDOM is not set
18031 +# CONFIG_NVRAM is not set
18032 +# CONFIG_R3964 is not set
18033 +# CONFIG_RAW_DRIVER is not set
18034 +# CONFIG_TCG_TPM is not set
18035 +CONFIG_I2C=y
18036 +CONFIG_I2C_BOARDINFO=y
18037 +CONFIG_I2C_CHARDEV=y
18038 +
18039 +#
18040 +# I2C Algorithms
18041 +#
18042 +# CONFIG_I2C_ALGOBIT is not set
18043 +# CONFIG_I2C_ALGOPCF is not set
18044 +# CONFIG_I2C_ALGOPCA is not set
18045 +
18046 +#
18047 +# I2C Hardware Bus support
18048 +#
18049 +# CONFIG_I2C_GPIO is not set
18050 +# CONFIG_I2C_OCORES is not set
18051 +# CONFIG_I2C_PARPORT_LIGHT is not set
18052 +CONFIG_I2C_S3C2410=y
18053 +# CONFIG_I2C_SIMTEC is not set
18054 +# CONFIG_I2C_TAOS_EVM is not set
18055 +# CONFIG_I2C_STUB is not set
18056 +# CONFIG_I2C_TINY_USB is not set
18057 +
18058 +#
18059 +# Miscellaneous I2C Chip support
18060 +#
18061 +# CONFIG_SENSORS_DS1337 is not set
18062 +# CONFIG_SENSORS_DS1374 is not set
18063 +# CONFIG_DS1682 is not set
18064 +# CONFIG_SENSORS_EEPROM is not set
18065 +CONFIG_SENSORS_PCF50606=y
18066 +CONFIG_SENSORS_PCF50633=y
18067 +# CONFIG_SENSORS_PCF8574 is not set
18068 +# CONFIG_SENSORS_PCA9539 is not set
18069 +# CONFIG_SENSORS_PCF8591 is not set
18070 +# CONFIG_SENSORS_MAX6875 is not set
18071 +# CONFIG_SENSORS_TSL2550 is not set
18072 +CONFIG_SENSORS_TSL256X=m
18073 +# CONFIG_I2C_DEBUG_CORE is not set
18074 +# CONFIG_I2C_DEBUG_ALGO is not set
18075 +# CONFIG_I2C_DEBUG_BUS is not set
18076 +# CONFIG_I2C_DEBUG_CHIP is not set
18077 +
18078 +#
18079 +# SPI support
18080 +#
18081 +CONFIG_SPI=y
18082 +# CONFIG_SPI_DEBUG is not set
18083 +CONFIG_SPI_MASTER=y
18084 +
18085 +#
18086 +# SPI Master Controller Drivers
18087 +#
18088 +CONFIG_SPI_BITBANG=y
18089 +CONFIG_SPI_S3C24XX=y
18090 +CONFIG_SPI_S3C24XX_GPIO=y
18091 +
18092 +#
18093 +# SPI Protocol Masters
18094 +#
18095 +# CONFIG_SPI_AT25 is not set
18096 +# CONFIG_SPI_SPIDEV is not set
18097 +# CONFIG_SPI_TLE62X0 is not set
18098 +# CONFIG_W1 is not set
18099 +CONFIG_POWER_SUPPLY=y
18100 +# CONFIG_POWER_SUPPLY_DEBUG is not set
18101 +# CONFIG_PDA_POWER is not set
18102 +# CONFIG_APM_POWER is not set
18103 +# CONFIG_BATTERY_DS2760 is not set
18104 +CONFIG_BATTERY_GTA01=y
18105 +CONFIG_BATTERY_BQ27000_HDQ=y
18106 +CONFIG_GTA02_HDQ=y
18107 +# CONFIG_HWMON is not set
18108 +CONFIG_WATCHDOG=y
18109 +# CONFIG_WATCHDOG_NOWAYOUT is not set
18110 +
18111 +#
18112 +# Watchdog Device Drivers
18113 +#
18114 +# CONFIG_SOFT_WATCHDOG is not set
18115 +CONFIG_S3C2410_WATCHDOG=m
18116 +
18117 +#
18118 +# USB-based Watchdog Cards
18119 +#
18120 +# CONFIG_USBPCWATCHDOG is not set
18121 +
18122 +#
18123 +# Sonics Silicon Backplane
18124 +#
18125 +CONFIG_SSB_POSSIBLE=y
18126 +# CONFIG_SSB is not set
18127 +
18128 +#
18129 +# Multifunction device drivers
18130 +#
18131 +# CONFIG_MFD_SM501 is not set
18132 +CONFIG_MFD_GLAMO=y
18133 +CONFIG_MFD_GLAMO_FB=y
18134 +CONFIG_MFD_GLAMO_SPI_GPIO=y
18135 +CONFIG_MFD_GLAMO_SPI_FB=y
18136 +CONFIG_MFD_GLAMO_MCI=y
18137 +
18138 +#
18139 +# Multimedia devices
18140 +#
18141 +# CONFIG_VIDEO_DEV is not set
18142 +# CONFIG_DVB_CORE is not set
18143 +CONFIG_DAB=y
18144 +# CONFIG_USB_DABUSB is not set
18145 +
18146 +#
18147 +# Graphics support
18148 +#
18149 +# CONFIG_VGASTATE is not set
18150 +# CONFIG_VIDEO_OUTPUT_CONTROL is not set
18151 +CONFIG_FB=y
18152 +# CONFIG_FIRMWARE_EDID is not set
18153 +# CONFIG_FB_DDC is not set
18154 +CONFIG_FB_CFB_FILLRECT=y
18155 +CONFIG_FB_CFB_COPYAREA=y
18156 +CONFIG_FB_CFB_IMAGEBLIT=y
18157 +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
18158 +# CONFIG_FB_SYS_FILLRECT is not set
18159 +# CONFIG_FB_SYS_COPYAREA is not set
18160 +# CONFIG_FB_SYS_IMAGEBLIT is not set
18161 +# CONFIG_FB_SYS_FOPS is not set
18162 +CONFIG_FB_DEFERRED_IO=y
18163 +# CONFIG_FB_SVGALIB is not set
18164 +# CONFIG_FB_MACMODES is not set
18165 +# CONFIG_FB_BACKLIGHT is not set
18166 +# CONFIG_FB_MODE_HELPERS is not set
18167 +# CONFIG_FB_TILEBLITTING is not set
18168 +
18169 +#
18170 +# Frame buffer hardware drivers
18171 +#
18172 +# CONFIG_FB_UVESA is not set
18173 +# CONFIG_FB_S1D13XXX is not set
18174 +CONFIG_FB_S3C2410=y
18175 +# CONFIG_FB_S3C2410_DEBUG is not set
18176 +# CONFIG_FB_VIRTUAL is not set
18177 +CONFIG_BACKLIGHT_LCD_SUPPORT=y
18178 +CONFIG_LCD_CLASS_DEVICE=y
18179 +# CONFIG_LCD_LTV350QV is not set
18180 +CONFIG_BACKLIGHT_CLASS_DEVICE=y
18181 +# CONFIG_BACKLIGHT_CORGI is not set
18182 +CONFIG_BACKLIGHT_GTA01=y
18183 +
18184 +#
18185 +# Display device support
18186 +#
18187 +# CONFIG_DISPLAY_SUPPORT is not set
18188 +CONFIG_DISPLAY_JBT6K74=y
18189 +
18190 +#
18191 +# Console display driver support
18192 +#
18193 +# CONFIG_VGA_CONSOLE is not set
18194 +CONFIG_DUMMY_CONSOLE=y
18195 +CONFIG_FRAMEBUFFER_CONSOLE=y
18196 +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
18197 +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
18198 +CONFIG_FONTS=y
18199 +# CONFIG_FONT_8x8 is not set
18200 +# CONFIG_FONT_8x16 is not set
18201 +CONFIG_FONT_6x11=y
18202 +# CONFIG_FONT_7x14 is not set
18203 +# CONFIG_FONT_PEARL_8x8 is not set
18204 +# CONFIG_FONT_ACORN_8x8 is not set
18205 +# CONFIG_FONT_MINI_4x6 is not set
18206 +# CONFIG_FONT_SUN8x16 is not set
18207 +# CONFIG_FONT_SUN12x22 is not set
18208 +# CONFIG_FONT_10x18 is not set
18209 +# CONFIG_LOGO is not set
18210 +
18211 +#
18212 +# Sound
18213 +#
18214 +CONFIG_SOUND=y
18215 +
18216 +#
18217 +# Advanced Linux Sound Architecture
18218 +#
18219 +CONFIG_SND=m
18220 +CONFIG_SND_TIMER=m
18221 +CONFIG_SND_PCM=m
18222 +# CONFIG_SND_SEQUENCER is not set
18223 +CONFIG_SND_OSSEMUL=y
18224 +CONFIG_SND_MIXER_OSS=m
18225 +CONFIG_SND_PCM_OSS=m
18226 +CONFIG_SND_PCM_OSS_PLUGINS=y
18227 +# CONFIG_SND_DYNAMIC_MINORS is not set
18228 +CONFIG_SND_SUPPORT_OLD_API=y
18229 +CONFIG_SND_VERBOSE_PROCFS=y
18230 +# CONFIG_SND_VERBOSE_PRINTK is not set
18231 +# CONFIG_SND_DEBUG is not set
18232 +
18233 +#
18234 +# Generic devices
18235 +#
18236 +# CONFIG_SND_DUMMY is not set
18237 +# CONFIG_SND_MTPAV is not set
18238 +# CONFIG_SND_SERIAL_U16550 is not set
18239 +# CONFIG_SND_MPU401 is not set
18240 +
18241 +#
18242 +# ALSA ARM devices
18243 +#
18244 +
18245 +#
18246 +# SPI devices
18247 +#
18248 +
18249 +#
18250 +# USB devices
18251 +#
18252 +# CONFIG_SND_USB_AUDIO is not set
18253 +# CONFIG_SND_USB_CAIAQ is not set
18254 +
18255 +#
18256 +# System on Chip audio support
18257 +#
18258 +CONFIG_SND_SOC=m
18259 +CONFIG_SND_S3C24XX_SOC=m
18260 +CONFIG_SND_S3C24XX_SOC_I2S=m
18261 +CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753=m
18262 +CONFIG_SND_S3C24XX_SOC_NEO1973_GTA02_WM8753=m
18263 +
18264 +#
18265 +# SoC Audio support for SuperH
18266 +#
18267 +CONFIG_SND_SOC_WM8753=m
18268 +
18269 +#
18270 +# Open Sound System
18271 +#
18272 +# CONFIG_SOUND_PRIME is not set
18273 +CONFIG_HID_SUPPORT=y
18274 +CONFIG_HID=y
18275 +# CONFIG_HID_DEBUG is not set
18276 +# CONFIG_HIDRAW is not set
18277 +
18278 +#
18279 +# USB Input Devices
18280 +#
18281 +CONFIG_USB_HID=m
18282 +# CONFIG_USB_HIDINPUT_POWERBOOK is not set
18283 +# CONFIG_HID_FF is not set
18284 +# CONFIG_USB_HIDDEV is not set
18285 +
18286 +#
18287 +# USB HID Boot Protocol drivers
18288 +#
18289 +# CONFIG_USB_KBD is not set
18290 +# CONFIG_USB_MOUSE is not set
18291 +CONFIG_USB_SUPPORT=y
18292 +CONFIG_USB_ARCH_HAS_HCD=y
18293 +CONFIG_USB_ARCH_HAS_OHCI=y
18294 +# CONFIG_USB_ARCH_HAS_EHCI is not set
18295 +CONFIG_USB=y
18296 +# CONFIG_USB_DEBUG is not set
18297 +
18298 +#
18299 +# Miscellaneous USB options
18300 +#
18301 +CONFIG_USB_DEVICEFS=y
18302 +CONFIG_USB_DEVICE_CLASS=y
18303 +# CONFIG_USB_DYNAMIC_MINORS is not set
18304 +CONFIG_USB_SUSPEND=y
18305 +# CONFIG_USB_PERSIST is not set
18306 +# CONFIG_USB_OTG is not set
18307 +
18308 +#
18309 +# USB Host Controller Drivers
18310 +#
18311 +# CONFIG_USB_ISP116X_HCD is not set
18312 +CONFIG_USB_OHCI_HCD=m
18313 +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
18314 +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
18315 +CONFIG_USB_OHCI_LITTLE_ENDIAN=y
18316 +# CONFIG_USB_SL811_HCD is not set
18317 +# CONFIG_USB_R8A66597_HCD is not set
18318 +
18319 +#
18320 +# USB Device Class drivers
18321 +#
18322 +CONFIG_USB_ACM=m
18323 +CONFIG_USB_PRINTER=m
18324 +
18325 +#
18326 +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
18327 +#
18328 +
18329 +#
18330 +# may also be needed; see USB_STORAGE Help for more information
18331 +#
18332 +CONFIG_USB_STORAGE=m
18333 +# CONFIG_USB_STORAGE_DEBUG is not set
18334 +CONFIG_USB_STORAGE_DATAFAB=y
18335 +CONFIG_USB_STORAGE_FREECOM=y
18336 +# CONFIG_USB_STORAGE_ISD200 is not set
18337 +CONFIG_USB_STORAGE_DPCM=y
18338 +CONFIG_USB_STORAGE_USBAT=y
18339 +CONFIG_USB_STORAGE_SDDR09=y
18340 +CONFIG_USB_STORAGE_SDDR55=y
18341 +CONFIG_USB_STORAGE_JUMPSHOT=y
18342 +CONFIG_USB_STORAGE_ALAUDA=y
18343 +CONFIG_USB_STORAGE_KARMA=y
18344 +CONFIG_USB_LIBUSUAL=y
18345 +
18346 +#
18347 +# USB Imaging devices
18348 +#
18349 +# CONFIG_USB_MDC800 is not set
18350 +# CONFIG_USB_MICROTEK is not set
18351 +CONFIG_USB_MON=y
18352 +
18353 +#
18354 +# USB port drivers
18355 +#
18356 +
18357 +#
18358 +# USB Serial Converter support
18359 +#
18360 +CONFIG_USB_SERIAL=m
18361 +CONFIG_USB_SERIAL_GENERIC=y
18362 +CONFIG_USB_SERIAL_AIRCABLE=m
18363 +CONFIG_USB_SERIAL_AIRPRIME=m
18364 +CONFIG_USB_SERIAL_ARK3116=m
18365 +CONFIG_USB_SERIAL_BELKIN=m
18366 +# CONFIG_USB_SERIAL_CH341 is not set
18367 +CONFIG_USB_SERIAL_WHITEHEAT=m
18368 +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
18369 +CONFIG_USB_SERIAL_CP2101=m
18370 +CONFIG_USB_SERIAL_CYPRESS_M8=m
18371 +CONFIG_USB_SERIAL_EMPEG=m
18372 +CONFIG_USB_SERIAL_FTDI_SIO=m
18373 +CONFIG_USB_SERIAL_FUNSOFT=m
18374 +CONFIG_USB_SERIAL_VISOR=m
18375 +CONFIG_USB_SERIAL_IPAQ=m
18376 +CONFIG_USB_SERIAL_IR=m
18377 +CONFIG_USB_SERIAL_EDGEPORT=m
18378 +CONFIG_USB_SERIAL_EDGEPORT_TI=m
18379 +CONFIG_USB_SERIAL_GARMIN=m
18380 +CONFIG_USB_SERIAL_IPW=m
18381 +CONFIG_USB_SERIAL_KEYSPAN_PDA=m
18382 +CONFIG_USB_SERIAL_KEYSPAN=m
18383 +CONFIG_USB_SERIAL_KEYSPAN_MPR=y
18384 +CONFIG_USB_SERIAL_KEYSPAN_USA28=y
18385 +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
18386 +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
18387 +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
18388 +CONFIG_USB_SERIAL_KEYSPAN_USA19=y
18389 +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
18390 +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
18391 +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
18392 +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
18393 +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
18394 +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
18395 +CONFIG_USB_SERIAL_KLSI=m
18396 +CONFIG_USB_SERIAL_KOBIL_SCT=m
18397 +CONFIG_USB_SERIAL_MCT_U232=m
18398 +CONFIG_USB_SERIAL_MOS7720=m
18399 +CONFIG_USB_SERIAL_MOS7840=m
18400 +CONFIG_USB_SERIAL_NAVMAN=m
18401 +CONFIG_USB_SERIAL_PL2303=m
18402 +# CONFIG_USB_SERIAL_OTI6858 is not set
18403 +CONFIG_USB_SERIAL_HP4X=m
18404 +CONFIG_USB_SERIAL_SAFE=m
18405 +CONFIG_USB_SERIAL_SAFE_PADDED=y
18406 +CONFIG_USB_SERIAL_SIERRAWIRELESS=m
18407 +CONFIG_USB_SERIAL_TI=m
18408 +CONFIG_USB_SERIAL_CYBERJACK=m
18409 +CONFIG_USB_SERIAL_XIRCOM=m
18410 +CONFIG_USB_SERIAL_OPTION=m
18411 +CONFIG_USB_SERIAL_OMNINET=m
18412 +# CONFIG_USB_SERIAL_DEBUG is not set
18413 +CONFIG_USB_EZUSB=y
18414 +
18415 +#
18416 +# USB Miscellaneous drivers
18417 +#
18418 +# CONFIG_USB_EMI62 is not set
18419 +# CONFIG_USB_EMI26 is not set
18420 +# CONFIG_USB_ADUTUX is not set
18421 +# CONFIG_USB_AUERSWALD is not set
18422 +# CONFIG_USB_RIO500 is not set
18423 +# CONFIG_USB_LEGOTOWER is not set
18424 +# CONFIG_USB_LCD is not set
18425 +CONFIG_USB_BERRY_CHARGE=m
18426 +# CONFIG_USB_LED is not set
18427 +# CONFIG_USB_CYPRESS_CY7C63 is not set
18428 +# CONFIG_USB_CYTHERM is not set
18429 +# CONFIG_USB_PHIDGET is not set
18430 +# CONFIG_USB_IDMOUSE is not set
18431 +# CONFIG_USB_FTDI_ELAN is not set
18432 +# CONFIG_USB_APPLEDISPLAY is not set
18433 +# CONFIG_USB_LD is not set
18434 +CONFIG_USB_TRANCEVIBRATOR=m
18435 +CONFIG_USB_IOWARRIOR=m
18436 +# CONFIG_USB_TEST is not set
18437 +
18438 +#
18439 +# USB DSL modem support
18440 +#
18441 +
18442 +#
18443 +# USB Gadget Support
18444 +#
18445 +CONFIG_USB_GADGET=y
18446 +# CONFIG_USB_GADGET_DEBUG is not set
18447 +# CONFIG_USB_GADGET_DEBUG_FILES is not set
18448 +CONFIG_USB_GADGET_SELECTED=y
18449 +# CONFIG_USB_GADGET_AMD5536UDC is not set
18450 +# CONFIG_USB_GADGET_ATMEL_USBA is not set
18451 +# CONFIG_USB_GADGET_FSL_USB2 is not set
18452 +# CONFIG_USB_GADGET_NET2280 is not set
18453 +# CONFIG_USB_GADGET_PXA2XX is not set
18454 +# CONFIG_USB_GADGET_M66592 is not set
18455 +# CONFIG_USB_GADGET_GOKU is not set
18456 +# CONFIG_USB_GADGET_LH7A40X is not set
18457 +# CONFIG_USB_GADGET_OMAP is not set
18458 +CONFIG_USB_GADGET_S3C2410=y
18459 +CONFIG_USB_S3C2410=y
18460 +# CONFIG_USB_S3C2410_DEBUG is not set
18461 +# CONFIG_USB_GADGET_AT91 is not set
18462 +# CONFIG_USB_GADGET_DUMMY_HCD is not set
18463 +# CONFIG_USB_GADGET_DUALSPEED is not set
18464 +# CONFIG_USB_ZERO is not set
18465 +CONFIG_USB_ETH=m
18466 +CONFIG_USB_ETH_RNDIS=m
18467 +CONFIG_USB_GADGETFS=m
18468 +CONFIG_USB_FILE_STORAGE=m
18469 +CONFIG_USB_G_SERIAL=m
18470 +CONFIG_USB_MIDI_GADGET=m
18471 +
18472 +#
18473 +# SDIO support
18474 +#
18475 +CONFIG_SDIO=y
18476 +CONFIG_SDIO_S3C24XX=y
18477 +CONFIG_SDIO_S3C24XX_DMA=y
18478 +CONFIG_SDIO_AR6000_WLAN=y
18479 +CONFIG_MMC=y
18480 +# CONFIG_MMC_DEBUG is not set
18481 +CONFIG_MMC_UNSAFE_RESUME=y
18482 +
18483 +#
18484 +# MMC/SD Card Drivers
18485 +#
18486 +CONFIG_MMC_BLOCK=y
18487 +CONFIG_MMC_BLOCK_BOUNCE=y
18488 +# CONFIG_SDIO_UART is not set
18489 +
18490 +#
18491 +# MMC/SD Host Controller Drivers
18492 +#
18493 +# CONFIG_MMC_SPI is not set
18494 +CONFIG_MMC_S3C=y
18495 +CONFIG_NEW_LEDS=y
18496 +CONFIG_LEDS_CLASS=y
18497 +
18498 +#
18499 +# LED drivers
18500 +#
18501 +CONFIG_LEDS_S3C24XX=m
18502 +# CONFIG_LEDS_GPIO is not set
18503 +CONFIG_LEDS_NEO1973_VIBRATOR=y
18504 +CONFIG_LEDS_NEO1973_GTA02=y
18505 +
18506 +#
18507 +# LED Triggers
18508 +#
18509 +CONFIG_LEDS_TRIGGERS=y
18510 +CONFIG_LEDS_TRIGGER_TIMER=y
18511 +# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
18512 +CONFIG_RTC_LIB=y
18513 +CONFIG_RTC_CLASS=y
18514 +CONFIG_RTC_HCTOSYS=y
18515 +CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
18516 +CONFIG_RTC_DEBUG=y
18517 +
18518 +#
18519 +# RTC interfaces
18520 +#
18521 +CONFIG_RTC_INTF_SYSFS=y
18522 +CONFIG_RTC_INTF_PROC=y
18523 +CONFIG_RTC_INTF_DEV=y
18524 +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
18525 +# CONFIG_RTC_DRV_TEST is not set
18526 +
18527 +#
18528 +# I2C RTC drivers
18529 +#
18530 +# CONFIG_RTC_DRV_DS1307 is not set
18531 +# CONFIG_RTC_DRV_DS1374 is not set
18532 +# CONFIG_RTC_DRV_DS1672 is not set
18533 +# CONFIG_RTC_DRV_MAX6900 is not set
18534 +# CONFIG_RTC_DRV_RS5C372 is not set
18535 +# CONFIG_RTC_DRV_ISL1208 is not set
18536 +# CONFIG_RTC_DRV_X1205 is not set
18537 +# CONFIG_RTC_DRV_PCF8563 is not set
18538 +# CONFIG_RTC_DRV_PCF8583 is not set
18539 +# CONFIG_RTC_DRV_M41T80 is not set
18540 +
18541 +#
18542 +# SPI RTC drivers
18543 +#
18544 +# CONFIG_RTC_DRV_RS5C348 is not set
18545 +# CONFIG_RTC_DRV_MAX6902 is not set
18546 +
18547 +#
18548 +# Platform RTC drivers
18549 +#
18550 +# CONFIG_RTC_DRV_CMOS is not set
18551 +# CONFIG_RTC_DRV_DS1553 is not set
18552 +# CONFIG_RTC_DRV_STK17TA8 is not set
18553 +# CONFIG_RTC_DRV_DS1742 is not set
18554 +# CONFIG_RTC_DRV_M48T86 is not set
18555 +# CONFIG_RTC_DRV_M48T59 is not set
18556 +# CONFIG_RTC_DRV_V3020 is not set
18557 +
18558 +#
18559 +# on-CPU RTC drivers
18560 +#
18561 +CONFIG_RTC_DRV_S3C=m
18562 +
18563 +#
18564 +# File systems
18565 +#
18566 +CONFIG_EXT2_FS=y
18567 +# CONFIG_EXT2_FS_XATTR is not set
18568 +# CONFIG_EXT2_FS_XIP is not set
18569 +CONFIG_EXT3_FS=y
18570 +# CONFIG_EXT3_FS_XATTR is not set
18571 +# CONFIG_EXT4DEV_FS is not set
18572 +CONFIG_JBD=y
18573 +# CONFIG_REISERFS_FS is not set
18574 +# CONFIG_JFS_FS is not set
18575 +CONFIG_FS_POSIX_ACL=y
18576 +# CONFIG_XFS_FS is not set
18577 +# CONFIG_GFS2_FS is not set
18578 +# CONFIG_OCFS2_FS is not set
18579 +# CONFIG_MINIX_FS is not set
18580 +CONFIG_ROMFS_FS=y
18581 +CONFIG_INOTIFY=y
18582 +CONFIG_INOTIFY_USER=y
18583 +# CONFIG_QUOTA is not set
18584 +CONFIG_DNOTIFY=y
18585 +# CONFIG_AUTOFS_FS is not set
18586 +CONFIG_AUTOFS4_FS=m
18587 +CONFIG_FUSE_FS=m
18588 +
18589 +#
18590 +# CD-ROM/DVD Filesystems
18591 +#
18592 +CONFIG_ISO9660_FS=m
18593 +CONFIG_JOLIET=y
18594 +# CONFIG_ZISOFS is not set
18595 +CONFIG_UDF_FS=m
18596 +
18597 +#
18598 +# DOS/FAT/NT Filesystems
18599 +#
18600 +CONFIG_FAT_FS=y
18601 +CONFIG_MSDOS_FS=y
18602 +CONFIG_VFAT_FS=y
18603 +CONFIG_FAT_DEFAULT_CODEPAGE=437
18604 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
18605 +# CONFIG_NTFS_FS is not set
18606 +
18607 +#
18608 +# Pseudo filesystems
18609 +#
18610 +CONFIG_PROC_FS=y
18611 +CONFIG_PROC_SYSCTL=y
18612 +CONFIG_SYSFS=y
18613 +CONFIG_TMPFS=y
18614 +# CONFIG_TMPFS_POSIX_ACL is not set
18615 +# CONFIG_HUGETLB_PAGE is not set
18616 +CONFIG_CONFIGFS_FS=m
18617 +
18618 +#
18619 +# Miscellaneous filesystems
18620 +#
18621 +# CONFIG_ADFS_FS is not set
18622 +# CONFIG_AFFS_FS is not set
18623 +# CONFIG_HFS_FS is not set
18624 +# CONFIG_HFSPLUS_FS is not set
18625 +# CONFIG_BEFS_FS is not set
18626 +# CONFIG_BFS_FS is not set
18627 +# CONFIG_EFS_FS is not set
18628 +CONFIG_YAFFS_FS=y
18629 +CONFIG_YAFFS_YAFFS1=y
18630 +CONFIG_YAFFS_9BYTE_TAGS=y
18631 +CONFIG_YAFFS_YAFFS2=y
18632 +CONFIG_YAFFS_AUTO_YAFFS2=y
18633 +# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set
18634 +CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS=10
18635 +# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set
18636 +# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set
18637 +CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
18638 +CONFIG_JFFS2_FS=y
18639 +CONFIG_JFFS2_FS_DEBUG=0
18640 +CONFIG_JFFS2_FS_WRITEBUFFER=y
18641 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
18642 +CONFIG_JFFS2_SUMMARY=y
18643 +# CONFIG_JFFS2_FS_XATTR is not set
18644 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
18645 +CONFIG_JFFS2_ZLIB=y
18646 +# CONFIG_JFFS2_LZO is not set
18647 +CONFIG_JFFS2_RTIME=y
18648 +# CONFIG_JFFS2_RUBIN is not set
18649 +CONFIG_CRAMFS=y
18650 +# CONFIG_VXFS_FS is not set
18651 +# CONFIG_HPFS_FS is not set
18652 +# CONFIG_QNX4FS_FS is not set
18653 +# CONFIG_SYSV_FS is not set
18654 +# CONFIG_UFS_FS is not set
18655 +CONFIG_NETWORK_FILESYSTEMS=y
18656 +CONFIG_NFS_FS=y
18657 +CONFIG_NFS_V3=y
18658 +# CONFIG_NFS_V3_ACL is not set
18659 +CONFIG_NFS_V4=y
18660 +# CONFIG_NFS_DIRECTIO is not set
18661 +CONFIG_NFSD=m
18662 +CONFIG_NFSD_V3=y
18663 +# CONFIG_NFSD_V3_ACL is not set
18664 +CONFIG_NFSD_V4=y
18665 +CONFIG_NFSD_TCP=y
18666 +CONFIG_ROOT_NFS=y
18667 +CONFIG_LOCKD=y
18668 +CONFIG_LOCKD_V4=y
18669 +CONFIG_EXPORTFS=m
18670 +CONFIG_NFS_COMMON=y
18671 +CONFIG_SUNRPC=y
18672 +CONFIG_SUNRPC_GSS=y
18673 +# CONFIG_SUNRPC_BIND34 is not set
18674 +CONFIG_RPCSEC_GSS_KRB5=y
18675 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
18676 +# CONFIG_SMB_FS is not set
18677 +CONFIG_CIFS=m
18678 +# CONFIG_CIFS_STATS is not set
18679 +CONFIG_CIFS_WEAK_PW_HASH=y
18680 +# CONFIG_CIFS_XATTR is not set
18681 +# CONFIG_CIFS_DEBUG2 is not set
18682 +# CONFIG_CIFS_EXPERIMENTAL is not set
18683 +# CONFIG_NCP_FS is not set
18684 +# CONFIG_CODA_FS is not set
18685 +# CONFIG_AFS_FS is not set
18686 +
18687 +#
18688 +# Partition Types
18689 +#
18690 +# CONFIG_PARTITION_ADVANCED is not set
18691 +CONFIG_MSDOS_PARTITION=y
18692 +CONFIG_NLS=y
18693 +CONFIG_NLS_DEFAULT="iso8859-1"
18694 +CONFIG_NLS_CODEPAGE_437=y
18695 +# CONFIG_NLS_CODEPAGE_737 is not set
18696 +# CONFIG_NLS_CODEPAGE_775 is not set
18697 +CONFIG_NLS_CODEPAGE_850=m
18698 +# CONFIG_NLS_CODEPAGE_852 is not set
18699 +# CONFIG_NLS_CODEPAGE_855 is not set
18700 +# CONFIG_NLS_CODEPAGE_857 is not set
18701 +# CONFIG_NLS_CODEPAGE_860 is not set
18702 +# CONFIG_NLS_CODEPAGE_861 is not set
18703 +# CONFIG_NLS_CODEPAGE_862 is not set
18704 +# CONFIG_NLS_CODEPAGE_863 is not set
18705 +# CONFIG_NLS_CODEPAGE_864 is not set
18706 +# CONFIG_NLS_CODEPAGE_865 is not set
18707 +# CONFIG_NLS_CODEPAGE_866 is not set
18708 +# CONFIG_NLS_CODEPAGE_869 is not set
18709 +CONFIG_NLS_CODEPAGE_936=m
18710 +CONFIG_NLS_CODEPAGE_950=m
18711 +# CONFIG_NLS_CODEPAGE_932 is not set
18712 +# CONFIG_NLS_CODEPAGE_949 is not set
18713 +# CONFIG_NLS_CODEPAGE_874 is not set
18714 +# CONFIG_NLS_ISO8859_8 is not set
18715 +# CONFIG_NLS_CODEPAGE_1250 is not set
18716 +# CONFIG_NLS_CODEPAGE_1251 is not set
18717 +# CONFIG_NLS_ASCII is not set
18718 +CONFIG_NLS_ISO8859_1=y
18719 +# CONFIG_NLS_ISO8859_2 is not set
18720 +# CONFIG_NLS_ISO8859_3 is not set
18721 +# CONFIG_NLS_ISO8859_4 is not set
18722 +# CONFIG_NLS_ISO8859_5 is not set
18723 +# CONFIG_NLS_ISO8859_6 is not set
18724 +# CONFIG_NLS_ISO8859_7 is not set
18725 +# CONFIG_NLS_ISO8859_9 is not set
18726 +# CONFIG_NLS_ISO8859_13 is not set
18727 +# CONFIG_NLS_ISO8859_14 is not set
18728 +# CONFIG_NLS_ISO8859_15 is not set
18729 +# CONFIG_NLS_KOI8_R is not set
18730 +# CONFIG_NLS_KOI8_U is not set
18731 +CONFIG_NLS_UTF8=m
18732 +# CONFIG_DLM is not set
18733 +CONFIG_INSTRUMENTATION=y
18734 +CONFIG_PROFILING=y
18735 +CONFIG_OPROFILE=m
18736 +# CONFIG_MARKERS is not set
18737 +
18738 +#
18739 +# Kernel hacking
18740 +#
18741 +# CONFIG_PRINTK_TIME is not set
18742 +CONFIG_ENABLE_WARN_DEPRECATED=y
18743 +CONFIG_ENABLE_MUST_CHECK=y
18744 +CONFIG_MAGIC_SYSRQ=y
18745 +# CONFIG_UNUSED_SYMBOLS is not set
18746 +# CONFIG_DEBUG_FS is not set
18747 +# CONFIG_HEADERS_CHECK is not set
18748 +CONFIG_DEBUG_KERNEL=y
18749 +# CONFIG_DEBUG_SHIRQ is not set
18750 +CONFIG_DETECT_SOFTLOCKUP=y
18751 +# CONFIG_SCHED_DEBUG is not set
18752 +# CONFIG_SCHEDSTATS is not set
18753 +CONFIG_TIMER_STATS=y
18754 +# CONFIG_DEBUG_SLAB is not set
18755 +CONFIG_DEBUG_PREEMPT=y
18756 +# CONFIG_DEBUG_RT_MUTEXES is not set
18757 +# CONFIG_RT_MUTEX_TESTER is not set
18758 +# CONFIG_DEBUG_SPINLOCK is not set
18759 +# CONFIG_DEBUG_MUTEXES is not set
18760 +# CONFIG_DEBUG_LOCK_ALLOC is not set
18761 +# CONFIG_PROVE_LOCKING is not set
18762 +# CONFIG_LOCK_STAT is not set
18763 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
18764 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
18765 +# CONFIG_DEBUG_KOBJECT is not set
18766 +CONFIG_DEBUG_BUGVERBOSE=y
18767 +CONFIG_DEBUG_INFO=y
18768 +# CONFIG_DEBUG_VM is not set
18769 +# CONFIG_DEBUG_LIST is not set
18770 +# CONFIG_DEBUG_SG is not set
18771 +CONFIG_FRAME_POINTER=y
18772 +CONFIG_FORCED_INLINING=y
18773 +# CONFIG_BOOT_PRINTK_DELAY is not set
18774 +# CONFIG_RCU_TORTURE_TEST is not set
18775 +# CONFIG_FAULT_INJECTION is not set
18776 +# CONFIG_SAMPLES is not set
18777 +# CONFIG_DEBUG_USER is not set
18778 +CONFIG_DEBUG_ERRORS=y
18779 +# CONFIG_DEBUG_LL is not set
18780 +CONFIG_DEBUG_S3C_UART=0
18781 +
18782 +#
18783 +# Security options
18784 +#
18785 +# CONFIG_KEYS is not set
18786 +# CONFIG_SECURITY is not set
18787 +# CONFIG_SECURITY_FILE_CAPABILITIES is not set
18788 +CONFIG_CRYPTO=y
18789 +CONFIG_CRYPTO_ALGAPI=y
18790 +CONFIG_CRYPTO_BLKCIPHER=y
18791 +CONFIG_CRYPTO_HASH=y
18792 +CONFIG_CRYPTO_MANAGER=y
18793 +CONFIG_CRYPTO_HMAC=y
18794 +CONFIG_CRYPTO_XCBC=m
18795 +CONFIG_CRYPTO_NULL=m
18796 +CONFIG_CRYPTO_MD4=m
18797 +CONFIG_CRYPTO_MD5=y
18798 +CONFIG_CRYPTO_SHA1=m
18799 +CONFIG_CRYPTO_SHA256=m
18800 +CONFIG_CRYPTO_SHA512=m
18801 +CONFIG_CRYPTO_WP512=m
18802 +CONFIG_CRYPTO_TGR192=m
18803 +CONFIG_CRYPTO_GF128MUL=m
18804 +CONFIG_CRYPTO_ECB=m
18805 +CONFIG_CRYPTO_CBC=y
18806 +CONFIG_CRYPTO_PCBC=m
18807 +CONFIG_CRYPTO_LRW=m
18808 +# CONFIG_CRYPTO_XTS is not set
18809 +# CONFIG_CRYPTO_CRYPTD is not set
18810 +CONFIG_CRYPTO_DES=y
18811 +CONFIG_CRYPTO_FCRYPT=m
18812 +CONFIG_CRYPTO_BLOWFISH=m
18813 +CONFIG_CRYPTO_TWOFISH=m
18814 +CONFIG_CRYPTO_TWOFISH_COMMON=m
18815 +CONFIG_CRYPTO_SERPENT=m
18816 +CONFIG_CRYPTO_AES=m
18817 +CONFIG_CRYPTO_CAST5=m
18818 +CONFIG_CRYPTO_CAST6=m
18819 +CONFIG_CRYPTO_TEA=m
18820 +CONFIG_CRYPTO_ARC4=m
18821 +CONFIG_CRYPTO_KHAZAD=m
18822 +CONFIG_CRYPTO_ANUBIS=m
18823 +# CONFIG_CRYPTO_SEED is not set
18824 +CONFIG_CRYPTO_DEFLATE=m
18825 +CONFIG_CRYPTO_MICHAEL_MIC=m
18826 +CONFIG_CRYPTO_CRC32C=m
18827 +CONFIG_CRYPTO_CAMELLIA=m
18828 +CONFIG_CRYPTO_TEST=m
18829 +# CONFIG_CRYPTO_AUTHENC is not set
18830 +CONFIG_CRYPTO_HW=y
18831 +
18832 +#
18833 +# Library routines
18834 +#
18835 +CONFIG_BITREVERSE=y
18836 +CONFIG_CRC_CCITT=m
18837 +CONFIG_CRC16=m
18838 +# CONFIG_CRC_ITU_T is not set
18839 +CONFIG_CRC32=y
18840 +# CONFIG_CRC7 is not set
18841 +CONFIG_LIBCRC32C=m
18842 +CONFIG_ZLIB_INFLATE=y
18843 +CONFIG_ZLIB_DEFLATE=y
18844 +CONFIG_TEXTSEARCH=y
18845 +CONFIG_TEXTSEARCH_KMP=m
18846 +CONFIG_TEXTSEARCH_BM=m
18847 +CONFIG_TEXTSEARCH_FSM=m
18848 +CONFIG_PLIST=y
18849 +CONFIG_HAS_IOMEM=y
18850 +CONFIG_HAS_DMA=y
18851 Index: linux-2.6.24.7/defconfig-gta02
18852 ===================================================================
18853 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
18854 +++ linux-2.6.24.7/defconfig-gta02 2008-12-11 22:46:49.000000000 +0100
18855 @@ -0,0 +1,1758 @@
18856 +#
18857 +# Automatically generated make config: don't edit
18858 +# Linux kernel version: 2.6.24
18859 +# Wed Nov 12 09:11:19 2008
18860 +#
18861 +CONFIG_ARM=y
18862 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y
18863 +CONFIG_GENERIC_GPIO=y
18864 +# CONFIG_GENERIC_TIME is not set
18865 +# CONFIG_GENERIC_CLOCKEVENTS is not set
18866 +CONFIG_MMU=y
18867 +CONFIG_NO_IOPORT=y
18868 +CONFIG_GENERIC_HARDIRQS=y
18869 +CONFIG_STACKTRACE_SUPPORT=y
18870 +CONFIG_LOCKDEP_SUPPORT=y
18871 +CONFIG_TRACE_IRQFLAGS_SUPPORT=y
18872 +CONFIG_HARDIRQS_SW_RESEND=y
18873 +CONFIG_GENERIC_IRQ_PROBE=y
18874 +CONFIG_RWSEM_GENERIC_SPINLOCK=y
18875 +# CONFIG_ARCH_HAS_ILOG2_U32 is not set
18876 +# CONFIG_ARCH_HAS_ILOG2_U64 is not set
18877 +CONFIG_GENERIC_HWEIGHT=y
18878 +CONFIG_GENERIC_CALIBRATE_DELAY=y
18879 +CONFIG_ZONE_DMA=y
18880 +CONFIG_FIQ=y
18881 +CONFIG_VECTORS_BASE=0xffff0000
18882 +CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
18883 +
18884 +#
18885 +# General setup
18886 +#
18887 +CONFIG_EXPERIMENTAL=y
18888 +CONFIG_BROKEN_ON_SMP=y
18889 +CONFIG_LOCK_KERNEL=y
18890 +CONFIG_INIT_ENV_ARG_LIMIT=32
18891 +CONFIG_LOCALVERSION=""
18892 +# CONFIG_LOCALVERSION_AUTO is not set
18893 +CONFIG_SWAP=y
18894 +CONFIG_SYSVIPC=y
18895 +CONFIG_SYSVIPC_SYSCTL=y
18896 +# CONFIG_POSIX_MQUEUE is not set
18897 +# CONFIG_BSD_PROCESS_ACCT is not set
18898 +# CONFIG_TASKSTATS is not set
18899 +# CONFIG_USER_NS is not set
18900 +# CONFIG_PID_NS is not set
18901 +# CONFIG_AUDIT is not set
18902 +CONFIG_IKCONFIG=y
18903 +CONFIG_IKCONFIG_PROC=y
18904 +CONFIG_LOG_BUF_SHIFT=14
18905 +# CONFIG_CGROUPS is not set
18906 +# CONFIG_FAIR_GROUP_SCHED is not set
18907 +# CONFIG_SYSFS_DEPRECATED is not set
18908 +# CONFIG_RELAY is not set
18909 +CONFIG_BLK_DEV_INITRD=y
18910 +CONFIG_INITRAMFS_SOURCE=""
18911 +CONFIG_CC_OPTIMIZE_FOR_SIZE=y
18912 +CONFIG_SYSCTL=y
18913 +# CONFIG_EMBEDDED is not set
18914 +CONFIG_UID16=y
18915 +CONFIG_SYSCTL_SYSCALL=y
18916 +CONFIG_KALLSYMS=y
18917 +# CONFIG_KALLSYMS_ALL is not set
18918 +# CONFIG_KALLSYMS_EXTRA_PASS is not set
18919 +CONFIG_HOTPLUG=y
18920 +CONFIG_PRINTK=y
18921 +CONFIG_BUG=y
18922 +CONFIG_ELF_CORE=y
18923 +CONFIG_BASE_FULL=y
18924 +CONFIG_FUTEX=y
18925 +CONFIG_ANON_INODES=y
18926 +CONFIG_EPOLL=y
18927 +CONFIG_SIGNALFD=y
18928 +CONFIG_EVENTFD=y
18929 +CONFIG_SHMEM=y
18930 +CONFIG_VM_EVENT_COUNTERS=y
18931 +CONFIG_SLAB=y
18932 +# CONFIG_SLUB is not set
18933 +# CONFIG_SLOB is not set
18934 +CONFIG_SLABINFO=y
18935 +CONFIG_RT_MUTEXES=y
18936 +# CONFIG_TINY_SHMEM is not set
18937 +CONFIG_BASE_SMALL=0
18938 +CONFIG_MODULES=y
18939 +CONFIG_MODULE_UNLOAD=y
18940 +CONFIG_MODULE_FORCE_UNLOAD=y
18941 +# CONFIG_MODVERSIONS is not set
18942 +# CONFIG_MODULE_SRCVERSION_ALL is not set
18943 +CONFIG_KMOD=y
18944 +CONFIG_BLOCK=y
18945 +# CONFIG_LBD is not set
18946 +# CONFIG_BLK_DEV_IO_TRACE is not set
18947 +# CONFIG_LSF is not set
18948 +# CONFIG_BLK_DEV_BSG is not set
18949 +
18950 +#
18951 +# IO Schedulers
18952 +#
18953 +CONFIG_IOSCHED_NOOP=y
18954 +CONFIG_IOSCHED_AS=m
18955 +CONFIG_IOSCHED_DEADLINE=y
18956 +CONFIG_IOSCHED_CFQ=m
18957 +# CONFIG_DEFAULT_AS is not set
18958 +CONFIG_DEFAULT_DEADLINE=y
18959 +# CONFIG_DEFAULT_CFQ is not set
18960 +# CONFIG_DEFAULT_NOOP is not set
18961 +CONFIG_DEFAULT_IOSCHED="deadline"
18962 +
18963 +#
18964 +# System Type
18965 +#
18966 +# CONFIG_ARCH_AAEC2000 is not set
18967 +# CONFIG_ARCH_INTEGRATOR is not set
18968 +# CONFIG_ARCH_REALVIEW is not set
18969 +# CONFIG_ARCH_VERSATILE is not set
18970 +# CONFIG_ARCH_AT91 is not set
18971 +# CONFIG_ARCH_CLPS7500 is not set
18972 +# CONFIG_ARCH_CLPS711X is not set
18973 +# CONFIG_ARCH_CO285 is not set
18974 +# CONFIG_ARCH_EBSA110 is not set
18975 +# CONFIG_ARCH_EP93XX is not set
18976 +# CONFIG_ARCH_FOOTBRIDGE is not set
18977 +# CONFIG_ARCH_NETX is not set
18978 +# CONFIG_ARCH_H720X is not set
18979 +# CONFIG_ARCH_IMX is not set
18980 +# CONFIG_ARCH_IOP13XX is not set
18981 +# CONFIG_ARCH_IOP32X is not set
18982 +# CONFIG_ARCH_IOP33X is not set
18983 +# CONFIG_ARCH_IXP23XX is not set
18984 +# CONFIG_ARCH_IXP2000 is not set
18985 +# CONFIG_ARCH_IXP4XX is not set
18986 +# CONFIG_ARCH_L7200 is not set
18987 +# CONFIG_ARCH_KS8695 is not set
18988 +# CONFIG_ARCH_NS9XXX is not set
18989 +# CONFIG_ARCH_MXC is not set
18990 +# CONFIG_ARCH_PNX4008 is not set
18991 +# CONFIG_ARCH_PXA is not set
18992 +# CONFIG_ARCH_RPC is not set
18993 +# CONFIG_ARCH_SA1100 is not set
18994 +CONFIG_ARCH_S3C2410=y
18995 +# CONFIG_ARCH_SHARK is not set
18996 +# CONFIG_ARCH_LH7A40X is not set
18997 +# CONFIG_ARCH_DAVINCI is not set
18998 +# CONFIG_ARCH_OMAP is not set
18999 +CONFIG_PLAT_S3C24XX=y
19000 +CONFIG_CPU_S3C244X=y
19001 +CONFIG_S3C2410_DMA=y
19002 +# CONFIG_S3C2410_DMA_DEBUG is not set
19003 +CONFIG_MACH_SMDK=y
19004 +CONFIG_MACH_NEO1973=y
19005 +CONFIG_PLAT_S3C=y
19006 +CONFIG_CPU_LLSERIAL_S3C2410=y
19007 +CONFIG_CPU_LLSERIAL_S3C2440=y
19008 +
19009 +#
19010 +# Boot options
19011 +#
19012 +# CONFIG_S3C_BOOT_WATCHDOG is not set
19013 +# CONFIG_S3C_BOOT_ERROR_RESET is not set
19014 +
19015 +#
19016 +# Power management
19017 +#
19018 +# CONFIG_S3C2410_PM_CHECK is not set
19019 +CONFIG_S3C_LOWLEVEL_UART_PORT=2
19020 +
19021 +#
19022 +# S3C2400 Machines
19023 +#
19024 +CONFIG_CPU_S3C2410=y
19025 +CONFIG_CPU_S3C2410_DMA=y
19026 +CONFIG_S3C2410_PM=y
19027 +CONFIG_S3C2410_GPIO=y
19028 +CONFIG_S3C2410_CLOCK=y
19029 +CONFIG_S3C2410_PWM=y
19030 +
19031 +#
19032 +# S3C2410 Machines
19033 +#
19034 +# CONFIG_ARCH_SMDK2410 is not set
19035 +# CONFIG_ARCH_H1940 is not set
19036 +# CONFIG_MACH_N30 is not set
19037 +# CONFIG_ARCH_BAST is not set
19038 +# CONFIG_MACH_OTOM is not set
19039 +# CONFIG_MACH_AML_M5900 is not set
19040 +# CONFIG_MACH_VR1000 is not set
19041 +CONFIG_MACH_QT2410=y
19042 +CONFIG_MACH_NEO1973_GTA01=y
19043 +
19044 +#
19045 +# S3C2412 Machines
19046 +#
19047 +# CONFIG_MACH_SMDK2413 is not set
19048 +# CONFIG_MACH_SMDK2412 is not set
19049 +# CONFIG_MACH_VSTMS is not set
19050 +CONFIG_CPU_S3C2440=y
19051 +CONFIG_S3C2440_DMA=y
19052 +CONFIG_S3C2440_C_FIQ=y
19053 +
19054 +#
19055 +# S3C2440 Machines
19056 +#
19057 +# CONFIG_MACH_ANUBIS is not set
19058 +# CONFIG_MACH_OSIRIS is not set
19059 +# CONFIG_MACH_RX3715 is not set
19060 +CONFIG_ARCH_S3C2440=y
19061 +# CONFIG_MACH_NEXCODER_2440 is not set
19062 +CONFIG_SMDK2440_CPU2440=y
19063 +CONFIG_MACH_HXD8=y
19064 +CONFIG_MACH_NEO1973_GTA02=y
19065 +# CONFIG_NEO1973_GTA02_2440 is not set
19066 +CONFIG_CPU_S3C2442=y
19067 +
19068 +#
19069 +# S3C2442 Machines
19070 +#
19071 +CONFIG_SMDK2440_CPU2442=y
19072 +
19073 +#
19074 +# S3C2443 Machines
19075 +#
19076 +# CONFIG_MACH_SMDK2443 is not set
19077 +
19078 +#
19079 +# Processor Type
19080 +#
19081 +CONFIG_CPU_32=y
19082 +CONFIG_CPU_ARM920T=y
19083 +CONFIG_CPU_32v4T=y
19084 +CONFIG_CPU_ABRT_EV4T=y
19085 +CONFIG_CPU_CACHE_V4WT=y
19086 +CONFIG_CPU_CACHE_VIVT=y
19087 +CONFIG_CPU_COPY_V4WB=y
19088 +CONFIG_CPU_TLB_V4WBI=y
19089 +CONFIG_CPU_CP15=y
19090 +CONFIG_CPU_CP15_MMU=y
19091 +
19092 +#
19093 +# Processor Features
19094 +#
19095 +CONFIG_ARM_THUMB=y
19096 +# CONFIG_CPU_ICACHE_DISABLE is not set
19097 +# CONFIG_CPU_DCACHE_DISABLE is not set
19098 +# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
19099 +# CONFIG_OUTER_CACHE is not set
19100 +
19101 +#
19102 +# Bus support
19103 +#
19104 +# CONFIG_PCI_SYSCALL is not set
19105 +# CONFIG_ARCH_SUPPORTS_MSI is not set
19106 +# CONFIG_PCCARD is not set
19107 +
19108 +#
19109 +# Kernel Features
19110 +#
19111 +# CONFIG_TICK_ONESHOT is not set
19112 +CONFIG_PREEMPT=y
19113 +CONFIG_NO_IDLE_HZ=y
19114 +CONFIG_HZ=200
19115 +CONFIG_AEABI=y
19116 +CONFIG_OABI_COMPAT=y
19117 +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
19118 +CONFIG_SELECT_MEMORY_MODEL=y
19119 +CONFIG_FLATMEM_MANUAL=y
19120 +# CONFIG_DISCONTIGMEM_MANUAL is not set
19121 +# CONFIG_SPARSEMEM_MANUAL is not set
19122 +CONFIG_FLATMEM=y
19123 +CONFIG_FLAT_NODE_MEM_MAP=y
19124 +# CONFIG_SPARSEMEM_STATIC is not set
19125 +# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
19126 +CONFIG_SPLIT_PTLOCK_CPUS=4096
19127 +# CONFIG_RESOURCES_64BIT is not set
19128 +CONFIG_ZONE_DMA_FLAG=1
19129 +CONFIG_BOUNCE=y
19130 +CONFIG_VIRT_TO_BUS=y
19131 +CONFIG_ALIGNMENT_TRAP=y
19132 +
19133 +#
19134 +# Boot options
19135 +#
19136 +CONFIG_ZBOOT_ROM_TEXT=0x0
19137 +CONFIG_ZBOOT_ROM_BSS=0x0
19138 +CONFIG_CMDLINE="unused -- bootloader passes ATAG list"
19139 +# CONFIG_XIP_KERNEL is not set
19140 +CONFIG_KEXEC=y
19141 +CONFIG_ATAGS_PROC=y
19142 +
19143 +#
19144 +# Floating point emulation
19145 +#
19146 +
19147 +#
19148 +# At least one emulation must be selected
19149 +#
19150 +CONFIG_FPE_NWFPE=y
19151 +# CONFIG_FPE_NWFPE_XP is not set
19152 +# CONFIG_FPE_FASTFPE is not set
19153 +
19154 +#
19155 +# Userspace binary formats
19156 +#
19157 +CONFIG_BINFMT_ELF=y
19158 +# CONFIG_BINFMT_AOUT is not set
19159 +# CONFIG_BINFMT_MISC is not set
19160 +
19161 +#
19162 +# Power management options
19163 +#
19164 +CONFIG_PM=y
19165 +CONFIG_PM_LEGACY=y
19166 +CONFIG_PM_DEBUG=y
19167 +# CONFIG_PM_VERBOSE is not set
19168 +CONFIG_PM_SLEEP=y
19169 +CONFIG_SUSPEND_UP_POSSIBLE=y
19170 +CONFIG_SUSPEND=y
19171 +CONFIG_APM_EMULATION=y
19172 +
19173 +#
19174 +# Networking
19175 +#
19176 +CONFIG_NET=y
19177 +
19178 +#
19179 +# Networking options
19180 +#
19181 +CONFIG_PACKET=y
19182 +CONFIG_PACKET_MMAP=y
19183 +CONFIG_UNIX=y
19184 +CONFIG_XFRM=y
19185 +# CONFIG_XFRM_USER is not set
19186 +# CONFIG_XFRM_SUB_POLICY is not set
19187 +CONFIG_XFRM_MIGRATE=y
19188 +CONFIG_NET_KEY=m
19189 +CONFIG_NET_KEY_MIGRATE=y
19190 +CONFIG_INET=y
19191 +CONFIG_IP_MULTICAST=y
19192 +CONFIG_IP_ADVANCED_ROUTER=y
19193 +CONFIG_ASK_IP_FIB_HASH=y
19194 +# CONFIG_IP_FIB_TRIE is not set
19195 +CONFIG_IP_FIB_HASH=y
19196 +CONFIG_IP_MULTIPLE_TABLES=y
19197 +# CONFIG_IP_ROUTE_MULTIPATH is not set
19198 +# CONFIG_IP_ROUTE_VERBOSE is not set
19199 +CONFIG_IP_PNP=y
19200 +# CONFIG_IP_PNP_DHCP is not set
19201 +# CONFIG_IP_PNP_BOOTP is not set
19202 +# CONFIG_IP_PNP_RARP is not set
19203 +CONFIG_NET_IPIP=m
19204 +CONFIG_NET_IPGRE=m
19205 +# CONFIG_NET_IPGRE_BROADCAST is not set
19206 +# CONFIG_IP_MROUTE is not set
19207 +# CONFIG_ARPD is not set
19208 +CONFIG_SYN_COOKIES=y
19209 +CONFIG_INET_AH=m
19210 +CONFIG_INET_ESP=m
19211 +CONFIG_INET_IPCOMP=m
19212 +CONFIG_INET_XFRM_TUNNEL=m
19213 +CONFIG_INET_TUNNEL=m
19214 +CONFIG_INET_XFRM_MODE_TRANSPORT=m
19215 +CONFIG_INET_XFRM_MODE_TUNNEL=m
19216 +CONFIG_INET_XFRM_MODE_BEET=m
19217 +# CONFIG_INET_LRO is not set
19218 +CONFIG_INET_DIAG=y
19219 +CONFIG_INET_TCP_DIAG=y
19220 +# CONFIG_TCP_CONG_ADVANCED is not set
19221 +CONFIG_TCP_CONG_CUBIC=y
19222 +CONFIG_DEFAULT_TCP_CONG="cubic"
19223 +CONFIG_TCP_MD5SIG=y
19224 +# CONFIG_IP_VS is not set
19225 +CONFIG_IPV6=m
19226 +# CONFIG_IPV6_PRIVACY is not set
19227 +# CONFIG_IPV6_ROUTER_PREF is not set
19228 +# CONFIG_IPV6_OPTIMISTIC_DAD is not set
19229 +CONFIG_INET6_AH=m
19230 +CONFIG_INET6_ESP=m
19231 +CONFIG_INET6_IPCOMP=m
19232 +# CONFIG_IPV6_MIP6 is not set
19233 +CONFIG_INET6_XFRM_TUNNEL=m
19234 +CONFIG_INET6_TUNNEL=m
19235 +CONFIG_INET6_XFRM_MODE_TRANSPORT=m
19236 +CONFIG_INET6_XFRM_MODE_TUNNEL=m
19237 +CONFIG_INET6_XFRM_MODE_BEET=m
19238 +# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
19239 +CONFIG_IPV6_SIT=m
19240 +CONFIG_IPV6_TUNNEL=m
19241 +# CONFIG_IPV6_MULTIPLE_TABLES is not set
19242 +# CONFIG_NETWORK_SECMARK is not set
19243 +CONFIG_NETFILTER=y
19244 +# CONFIG_NETFILTER_DEBUG is not set
19245 +
19246 +#
19247 +# Core Netfilter Configuration
19248 +#
19249 +CONFIG_NETFILTER_NETLINK=m
19250 +CONFIG_NETFILTER_NETLINK_QUEUE=m
19251 +CONFIG_NETFILTER_NETLINK_LOG=m
19252 +CONFIG_NF_CONNTRACK_ENABLED=m
19253 +CONFIG_NF_CONNTRACK=m
19254 +CONFIG_NF_CT_ACCT=y
19255 +CONFIG_NF_CONNTRACK_MARK=y
19256 +CONFIG_NF_CONNTRACK_EVENTS=y
19257 +CONFIG_NF_CT_PROTO_GRE=m
19258 +CONFIG_NF_CT_PROTO_SCTP=m
19259 +# CONFIG_NF_CT_PROTO_UDPLITE is not set
19260 +# CONFIG_NF_CONNTRACK_AMANDA is not set
19261 +CONFIG_NF_CONNTRACK_FTP=m
19262 +CONFIG_NF_CONNTRACK_H323=m
19263 +CONFIG_NF_CONNTRACK_IRC=m
19264 +CONFIG_NF_CONNTRACK_NETBIOS_NS=m
19265 +CONFIG_NF_CONNTRACK_PPTP=m
19266 +CONFIG_NF_CONNTRACK_SANE=m
19267 +CONFIG_NF_CONNTRACK_SIP=m
19268 +CONFIG_NF_CONNTRACK_TFTP=m
19269 +CONFIG_NF_CT_NETLINK=m
19270 +CONFIG_NETFILTER_XTABLES=m
19271 +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
19272 +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
19273 +CONFIG_NETFILTER_XT_TARGET_DSCP=m
19274 +CONFIG_NETFILTER_XT_TARGET_MARK=m
19275 +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
19276 +CONFIG_NETFILTER_XT_TARGET_NFLOG=m
19277 +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
19278 +# CONFIG_NETFILTER_XT_MATCH_COMMENT is not set
19279 +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
19280 +# CONFIG_NETFILTER_XT_MATCH_CONNLIMIT is not set
19281 +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
19282 +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
19283 +CONFIG_NETFILTER_XT_MATCH_DCCP=m
19284 +CONFIG_NETFILTER_XT_MATCH_DSCP=m
19285 +CONFIG_NETFILTER_XT_MATCH_ESP=m
19286 +CONFIG_NETFILTER_XT_MATCH_HELPER=m
19287 +CONFIG_NETFILTER_XT_MATCH_LENGTH=m
19288 +CONFIG_NETFILTER_XT_MATCH_LIMIT=m
19289 +CONFIG_NETFILTER_XT_MATCH_MAC=m
19290 +CONFIG_NETFILTER_XT_MATCH_MARK=m
19291 +CONFIG_NETFILTER_XT_MATCH_POLICY=m
19292 +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
19293 +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
19294 +CONFIG_NETFILTER_XT_MATCH_QUOTA=m
19295 +CONFIG_NETFILTER_XT_MATCH_REALM=m
19296 +CONFIG_NETFILTER_XT_MATCH_SCTP=m
19297 +CONFIG_NETFILTER_XT_MATCH_STATE=m
19298 +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
19299 +CONFIG_NETFILTER_XT_MATCH_STRING=m
19300 +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
19301 +# CONFIG_NETFILTER_XT_MATCH_TIME is not set
19302 +# CONFIG_NETFILTER_XT_MATCH_U32 is not set
19303 +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
19304 +
19305 +#
19306 +# IP: Netfilter Configuration
19307 +#
19308 +CONFIG_NF_CONNTRACK_IPV4=m
19309 +CONFIG_NF_CONNTRACK_PROC_COMPAT=y
19310 +# CONFIG_IP_NF_QUEUE is not set
19311 +CONFIG_IP_NF_IPTABLES=m
19312 +CONFIG_IP_NF_MATCH_IPRANGE=m
19313 +CONFIG_IP_NF_MATCH_TOS=m
19314 +# CONFIG_IP_NF_MATCH_RECENT is not set
19315 +CONFIG_IP_NF_MATCH_ECN=m
19316 +CONFIG_IP_NF_MATCH_AH=m
19317 +CONFIG_IP_NF_MATCH_TTL=m
19318 +CONFIG_IP_NF_MATCH_OWNER=m
19319 +CONFIG_IP_NF_MATCH_ADDRTYPE=m
19320 +CONFIG_IP_NF_FILTER=m
19321 +CONFIG_IP_NF_TARGET_REJECT=m
19322 +CONFIG_IP_NF_TARGET_LOG=m
19323 +CONFIG_IP_NF_TARGET_ULOG=m
19324 +CONFIG_NF_NAT=m
19325 +CONFIG_NF_NAT_NEEDED=y
19326 +CONFIG_IP_NF_TARGET_MASQUERADE=m
19327 +CONFIG_IP_NF_TARGET_REDIRECT=m
19328 +CONFIG_IP_NF_TARGET_NETMAP=m
19329 +CONFIG_IP_NF_TARGET_SAME=m
19330 +CONFIG_NF_NAT_SNMP_BASIC=m
19331 +CONFIG_NF_NAT_PROTO_GRE=m
19332 +CONFIG_NF_NAT_FTP=m
19333 +CONFIG_NF_NAT_IRC=m
19334 +CONFIG_NF_NAT_TFTP=m
19335 +# CONFIG_NF_NAT_AMANDA is not set
19336 +CONFIG_NF_NAT_PPTP=m
19337 +CONFIG_NF_NAT_H323=m
19338 +CONFIG_NF_NAT_SIP=m
19339 +CONFIG_IP_NF_MANGLE=m
19340 +CONFIG_IP_NF_TARGET_TOS=m
19341 +CONFIG_IP_NF_TARGET_ECN=m
19342 +CONFIG_IP_NF_TARGET_TTL=m
19343 +CONFIG_IP_NF_TARGET_CLUSTERIP=m
19344 +# CONFIG_IP_NF_RAW is not set
19345 +# CONFIG_IP_NF_ARPTABLES is not set
19346 +
19347 +#
19348 +# IPv6: Netfilter Configuration (EXPERIMENTAL)
19349 +#
19350 +CONFIG_NF_CONNTRACK_IPV6=m
19351 +# CONFIG_IP6_NF_QUEUE is not set
19352 +CONFIG_IP6_NF_IPTABLES=m
19353 +CONFIG_IP6_NF_MATCH_RT=m
19354 +CONFIG_IP6_NF_MATCH_OPTS=m
19355 +CONFIG_IP6_NF_MATCH_FRAG=m
19356 +CONFIG_IP6_NF_MATCH_HL=m
19357 +CONFIG_IP6_NF_MATCH_OWNER=m
19358 +CONFIG_IP6_NF_MATCH_IPV6HEADER=m
19359 +CONFIG_IP6_NF_MATCH_AH=m
19360 +CONFIG_IP6_NF_MATCH_MH=m
19361 +CONFIG_IP6_NF_MATCH_EUI64=m
19362 +CONFIG_IP6_NF_FILTER=m
19363 +CONFIG_IP6_NF_TARGET_LOG=m
19364 +CONFIG_IP6_NF_TARGET_REJECT=m
19365 +CONFIG_IP6_NF_MANGLE=m
19366 +CONFIG_IP6_NF_TARGET_HL=m
19367 +# CONFIG_IP6_NF_RAW is not set
19368 +# CONFIG_IP_DCCP is not set
19369 +# CONFIG_IP_SCTP is not set
19370 +# CONFIG_TIPC is not set
19371 +# CONFIG_ATM is not set
19372 +# CONFIG_BRIDGE is not set
19373 +# CONFIG_VLAN_8021Q is not set
19374 +# CONFIG_DECNET is not set
19375 +# CONFIG_LLC2 is not set
19376 +# CONFIG_IPX is not set
19377 +# CONFIG_ATALK is not set
19378 +# CONFIG_X25 is not set
19379 +# CONFIG_LAPB is not set
19380 +# CONFIG_ECONET is not set
19381 +# CONFIG_WAN_ROUTER is not set
19382 +CONFIG_NET_SCHED=y
19383 +
19384 +#
19385 +# Queueing/Scheduling
19386 +#
19387 +CONFIG_NET_SCH_CBQ=m
19388 +CONFIG_NET_SCH_HTB=m
19389 +CONFIG_NET_SCH_HFSC=m
19390 +CONFIG_NET_SCH_PRIO=m
19391 +# CONFIG_NET_SCH_RR is not set
19392 +CONFIG_NET_SCH_RED=m
19393 +CONFIG_NET_SCH_SFQ=m
19394 +CONFIG_NET_SCH_TEQL=m
19395 +CONFIG_NET_SCH_TBF=m
19396 +CONFIG_NET_SCH_GRED=m
19397 +CONFIG_NET_SCH_DSMARK=m
19398 +CONFIG_NET_SCH_NETEM=m
19399 +CONFIG_NET_SCH_INGRESS=m
19400 +
19401 +#
19402 +# Classification
19403 +#
19404 +CONFIG_NET_CLS=y
19405 +CONFIG_NET_CLS_BASIC=m
19406 +CONFIG_NET_CLS_TCINDEX=m
19407 +CONFIG_NET_CLS_ROUTE4=m
19408 +CONFIG_NET_CLS_ROUTE=y
19409 +CONFIG_NET_CLS_FW=m
19410 +CONFIG_NET_CLS_U32=m
19411 +CONFIG_CLS_U32_PERF=y
19412 +CONFIG_CLS_U32_MARK=y
19413 +CONFIG_NET_CLS_RSVP=m
19414 +CONFIG_NET_CLS_RSVP6=m
19415 +# CONFIG_NET_EMATCH is not set
19416 +# CONFIG_NET_CLS_ACT is not set
19417 +# CONFIG_NET_CLS_POLICE is not set
19418 +# CONFIG_NET_CLS_IND is not set
19419 +CONFIG_NET_SCH_FIFO=y
19420 +
19421 +#
19422 +# Network testing
19423 +#
19424 +# CONFIG_NET_PKTGEN is not set
19425 +# CONFIG_HAMRADIO is not set
19426 +# CONFIG_IRDA is not set
19427 +CONFIG_BT=m
19428 +CONFIG_BT_L2CAP=m
19429 +CONFIG_BT_SCO=m
19430 +CONFIG_BT_RFCOMM=m
19431 +CONFIG_BT_RFCOMM_TTY=y
19432 +CONFIG_BT_BNEP=m
19433 +CONFIG_BT_BNEP_MC_FILTER=y
19434 +CONFIG_BT_BNEP_PROTO_FILTER=y
19435 +CONFIG_BT_HIDP=m
19436 +
19437 +#
19438 +# Bluetooth device drivers
19439 +#
19440 +CONFIG_BT_HCIUSB=m
19441 +CONFIG_BT_HCIUSB_SCO=y
19442 +# CONFIG_BT_HCIBTSDIO is not set
19443 +# CONFIG_BT_HCIUART is not set
19444 +# CONFIG_BT_HCIBCM203X is not set
19445 +# CONFIG_BT_HCIBPA10X is not set
19446 +# CONFIG_BT_HCIBFUSB is not set
19447 +# CONFIG_BT_HCIVHCI is not set
19448 +# CONFIG_AF_RXRPC is not set
19449 +CONFIG_FIB_RULES=y
19450 +
19451 +#
19452 +# Wireless
19453 +#
19454 +# CONFIG_CFG80211 is not set
19455 +CONFIG_WIRELESS_EXT=y
19456 +# CONFIG_MAC80211 is not set
19457 +# CONFIG_IEEE80211 is not set
19458 +# CONFIG_RFKILL is not set
19459 +# CONFIG_NET_9P is not set
19460 +
19461 +#
19462 +# Device Drivers
19463 +#
19464 +
19465 +#
19466 +# Generic Driver Options
19467 +#
19468 +CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
19469 +CONFIG_STANDALONE=y
19470 +CONFIG_PREVENT_FIRMWARE_BUILD=y
19471 +CONFIG_FW_LOADER=m
19472 +# CONFIG_DEBUG_DRIVER is not set
19473 +# CONFIG_DEBUG_DEVRES is not set
19474 +# CONFIG_SYS_HYPERVISOR is not set
19475 +CONFIG_CONNECTOR=m
19476 +CONFIG_MTD=y
19477 +# CONFIG_MTD_DEBUG is not set
19478 +# CONFIG_MTD_CONCAT is not set
19479 +CONFIG_MTD_PARTITIONS=y
19480 +# CONFIG_MTD_REDBOOT_PARTS is not set
19481 +CONFIG_MTD_CMDLINE_PARTS=y
19482 +# CONFIG_MTD_AFS_PARTS is not set
19483 +
19484 +#
19485 +# User Modules And Translation Layers
19486 +#
19487 +CONFIG_MTD_CHAR=y
19488 +CONFIG_MTD_BLKDEVS=y
19489 +CONFIG_MTD_BLOCK=y
19490 +# CONFIG_FTL is not set
19491 +# CONFIG_NFTL is not set
19492 +# CONFIG_INFTL is not set
19493 +# CONFIG_RFD_FTL is not set
19494 +# CONFIG_SSFDC is not set
19495 +# CONFIG_MTD_OOPS is not set
19496 +
19497 +#
19498 +# RAM/ROM/Flash chip drivers
19499 +#
19500 +CONFIG_MTD_CFI=y
19501 +# CONFIG_MTD_JEDECPROBE is not set
19502 +CONFIG_MTD_GEN_PROBE=y
19503 +# CONFIG_MTD_CFI_ADV_OPTIONS is not set
19504 +CONFIG_MTD_MAP_BANK_WIDTH_1=y
19505 +CONFIG_MTD_MAP_BANK_WIDTH_2=y
19506 +CONFIG_MTD_MAP_BANK_WIDTH_4=y
19507 +# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
19508 +# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
19509 +# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
19510 +CONFIG_MTD_CFI_I1=y
19511 +CONFIG_MTD_CFI_I2=y
19512 +# CONFIG_MTD_CFI_I4 is not set
19513 +# CONFIG_MTD_CFI_I8 is not set
19514 +CONFIG_MTD_CFI_INTELEXT=y
19515 +# CONFIG_MTD_CFI_AMDSTD is not set
19516 +# CONFIG_MTD_CFI_STAA is not set
19517 +CONFIG_MTD_CFI_UTIL=y
19518 +# CONFIG_MTD_RAM is not set
19519 +# CONFIG_MTD_ROM is not set
19520 +CONFIG_MTD_ABSENT=y
19521 +
19522 +#
19523 +# Mapping drivers for chip access
19524 +#
19525 +# CONFIG_MTD_COMPLEX_MAPPINGS is not set
19526 +CONFIG_MTD_PHYSMAP=y
19527 +CONFIG_MTD_PHYSMAP_START=0x8000000
19528 +CONFIG_MTD_PHYSMAP_LEN=0
19529 +CONFIG_MTD_PHYSMAP_BANKWIDTH=2
19530 +# CONFIG_MTD_ARM_INTEGRATOR is not set
19531 +# CONFIG_MTD_PLATRAM is not set
19532 +
19533 +#
19534 +# Self-contained MTD device drivers
19535 +#
19536 +# CONFIG_MTD_DATAFLASH is not set
19537 +# CONFIG_MTD_M25P80 is not set
19538 +# CONFIG_MTD_SLRAM is not set
19539 +# CONFIG_MTD_PHRAM is not set
19540 +# CONFIG_MTD_MTDRAM is not set
19541 +# CONFIG_MTD_BLOCK2MTD is not set
19542 +
19543 +#
19544 +# Disk-On-Chip Device Drivers
19545 +#
19546 +# CONFIG_MTD_DOC2000 is not set
19547 +# CONFIG_MTD_DOC2001 is not set
19548 +# CONFIG_MTD_DOC2001PLUS is not set
19549 +CONFIG_MTD_NAND=y
19550 +CONFIG_MTD_NAND_VERIFY_WRITE=y
19551 +# CONFIG_MTD_NAND_ECC_SMC is not set
19552 +# CONFIG_MTD_NAND_MUSEUM_IDS is not set
19553 +CONFIG_MTD_NAND_IDS=y
19554 +CONFIG_MTD_NAND_S3C2410=y
19555 +# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
19556 +CONFIG_MTD_NAND_S3C2410_HWECC=y
19557 +# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
19558 +# CONFIG_MTD_NAND_DISKONCHIP is not set
19559 +# CONFIG_MTD_NAND_NANDSIM is not set
19560 +# CONFIG_MTD_NAND_PLATFORM is not set
19561 +# CONFIG_MTD_ALAUDA is not set
19562 +# CONFIG_MTD_ONENAND is not set
19563 +
19564 +#
19565 +# UBI - Unsorted block images
19566 +#
19567 +# CONFIG_MTD_UBI is not set
19568 +# CONFIG_PARPORT is not set
19569 +CONFIG_PNP=y
19570 +CONFIG_PNP_DEBUG=y
19571 +
19572 +#
19573 +# Protocols
19574 +#
19575 +# CONFIG_PNPACPI is not set
19576 +CONFIG_BLK_DEV=y
19577 +# CONFIG_BLK_DEV_COW_COMMON is not set
19578 +CONFIG_BLK_DEV_LOOP=m
19579 +# CONFIG_BLK_DEV_CRYPTOLOOP is not set
19580 +# CONFIG_BLK_DEV_NBD is not set
19581 +CONFIG_BLK_DEV_UB=m
19582 +CONFIG_BLK_DEV_RAM=y
19583 +CONFIG_BLK_DEV_RAM_COUNT=16
19584 +CONFIG_BLK_DEV_RAM_SIZE=4096
19585 +CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
19586 +# CONFIG_CDROM_PKTCDVD is not set
19587 +# CONFIG_ATA_OVER_ETH is not set
19588 +CONFIG_MISC_DEVICES=y
19589 +# CONFIG_EEPROM_93CX6 is not set
19590 +# CONFIG_IDE is not set
19591 +
19592 +#
19593 +# SCSI device support
19594 +#
19595 +# CONFIG_RAID_ATTRS is not set
19596 +CONFIG_SCSI=m
19597 +CONFIG_SCSI_DMA=y
19598 +# CONFIG_SCSI_TGT is not set
19599 +# CONFIG_SCSI_NETLINK is not set
19600 +CONFIG_SCSI_PROC_FS=y
19601 +
19602 +#
19603 +# SCSI support type (disk, tape, CD-ROM)
19604 +#
19605 +CONFIG_BLK_DEV_SD=m
19606 +# CONFIG_CHR_DEV_ST is not set
19607 +# CONFIG_CHR_DEV_OSST is not set
19608 +CONFIG_BLK_DEV_SR=m
19609 +# CONFIG_BLK_DEV_SR_VENDOR is not set
19610 +CONFIG_CHR_DEV_SG=m
19611 +# CONFIG_CHR_DEV_SCH is not set
19612 +
19613 +#
19614 +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
19615 +#
19616 +# CONFIG_SCSI_MULTI_LUN is not set
19617 +# CONFIG_SCSI_CONSTANTS is not set
19618 +# CONFIG_SCSI_LOGGING is not set
19619 +CONFIG_SCSI_SCAN_ASYNC=y
19620 +CONFIG_SCSI_WAIT_SCAN=m
19621 +
19622 +#
19623 +# SCSI Transports
19624 +#
19625 +# CONFIG_SCSI_SPI_ATTRS is not set
19626 +# CONFIG_SCSI_FC_ATTRS is not set
19627 +# CONFIG_SCSI_ISCSI_ATTRS is not set
19628 +# CONFIG_SCSI_SAS_LIBSAS is not set
19629 +# CONFIG_SCSI_SRP_ATTRS is not set
19630 +CONFIG_SCSI_LOWLEVEL=y
19631 +# CONFIG_ISCSI_TCP is not set
19632 +# CONFIG_SCSI_DEBUG is not set
19633 +# CONFIG_ATA is not set
19634 +# CONFIG_MD is not set
19635 +CONFIG_NETDEVICES=y
19636 +# CONFIG_NETDEVICES_MULTIQUEUE is not set
19637 +# CONFIG_DUMMY is not set
19638 +# CONFIG_BONDING is not set
19639 +# CONFIG_MACVLAN is not set
19640 +# CONFIG_EQUALIZER is not set
19641 +CONFIG_TUN=m
19642 +# CONFIG_VETH is not set
19643 +# CONFIG_NET_SB1000 is not set
19644 +# CONFIG_PHYLIB is not set
19645 +CONFIG_NET_ETHERNET=y
19646 +CONFIG_MII=y
19647 +# CONFIG_AX88796 is not set
19648 +# CONFIG_SMC91X is not set
19649 +# CONFIG_DM9000 is not set
19650 +# CONFIG_IBM_NEW_EMAC_ZMII is not set
19651 +# CONFIG_IBM_NEW_EMAC_RGMII is not set
19652 +# CONFIG_IBM_NEW_EMAC_TAH is not set
19653 +# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
19654 +CONFIG_NET_PCI=y
19655 +# CONFIG_B44 is not set
19656 +CONFIG_CS89x0=m
19657 +# CONFIG_NETDEV_1000 is not set
19658 +# CONFIG_NETDEV_10000 is not set
19659 +
19660 +#
19661 +# Wireless LAN
19662 +#
19663 +# CONFIG_WLAN_PRE80211 is not set
19664 +# CONFIG_WLAN_80211 is not set
19665 +
19666 +#
19667 +# USB Network Adapters
19668 +#
19669 +CONFIG_USB_CATC=m
19670 +CONFIG_USB_KAWETH=m
19671 +CONFIG_USB_PEGASUS=m
19672 +CONFIG_USB_RTL8150=m
19673 +CONFIG_USB_USBNET=y
19674 +CONFIG_USB_NET_AX8817X=m
19675 +CONFIG_USB_NET_CDCETHER=m
19676 +CONFIG_USB_NET_DM9601=m
19677 +CONFIG_USB_NET_GL620A=m
19678 +CONFIG_USB_NET_NET1080=m
19679 +CONFIG_USB_NET_PLUSB=m
19680 +CONFIG_USB_NET_MCS7830=m
19681 +CONFIG_USB_NET_RNDIS_HOST=m
19682 +CONFIG_USB_NET_CDC_SUBSET=m
19683 +CONFIG_USB_ALI_M5632=y
19684 +CONFIG_USB_AN2720=y
19685 +CONFIG_USB_BELKIN=y
19686 +CONFIG_USB_ARMLINUX=y
19687 +CONFIG_USB_EPSON2888=y
19688 +CONFIG_USB_KC2190=y
19689 +CONFIG_USB_NET_ZAURUS=m
19690 +# CONFIG_WAN is not set
19691 +CONFIG_PPP=m
19692 +CONFIG_PPP_MULTILINK=y
19693 +CONFIG_PPP_FILTER=y
19694 +CONFIG_PPP_ASYNC=m
19695 +CONFIG_PPP_SYNC_TTY=m
19696 +CONFIG_PPP_DEFLATE=m
19697 +CONFIG_PPP_BSDCOMP=m
19698 +CONFIG_PPP_MPPE=m
19699 +# CONFIG_PPPOE is not set
19700 +# CONFIG_PPPOL2TP is not set
19701 +# CONFIG_SLIP is not set
19702 +CONFIG_SLHC=m
19703 +# CONFIG_SHAPER is not set
19704 +# CONFIG_NETCONSOLE is not set
19705 +# CONFIG_NETPOLL is not set
19706 +# CONFIG_NET_POLL_CONTROLLER is not set
19707 +# CONFIG_ISDN is not set
19708 +
19709 +#
19710 +# Input device support
19711 +#
19712 +CONFIG_INPUT=y
19713 +# CONFIG_INPUT_FF_MEMLESS is not set
19714 +# CONFIG_INPUT_POLLDEV is not set
19715 +
19716 +#
19717 +# Userland interfaces
19718 +#
19719 +CONFIG_INPUT_MOUSEDEV=y
19720 +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
19721 +CONFIG_INPUT_MOUSEDEV_SCREEN_X=480
19722 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=640
19723 +# CONFIG_INPUT_JOYDEV is not set
19724 +CONFIG_INPUT_EVDEV=y
19725 +# CONFIG_INPUT_EVBUG is not set
19726 +
19727 +#
19728 +# Input Device Drivers
19729 +#
19730 +CONFIG_INPUT_KEYBOARD=y
19731 +# CONFIG_KEYBOARD_ATKBD is not set
19732 +# CONFIG_KEYBOARD_SUNKBD is not set
19733 +# CONFIG_KEYBOARD_LKKBD is not set
19734 +# CONFIG_KEYBOARD_XTKBD is not set
19735 +# CONFIG_KEYBOARD_NEWTON is not set
19736 +CONFIG_KEYBOARD_STOWAWAY=m
19737 +CONFIG_KEYBOARD_GPIO=m
19738 +CONFIG_KEYBOARD_NEO1973=y
19739 +CONFIG_KEYBOARD_QT2410=y
19740 +CONFIG_INPUT_MOUSE=y
19741 +# CONFIG_MOUSE_PS2 is not set
19742 +# CONFIG_MOUSE_SERIAL is not set
19743 +# CONFIG_MOUSE_APPLETOUCH is not set
19744 +# CONFIG_MOUSE_VSXXXAA is not set
19745 +# CONFIG_MOUSE_GPIO is not set
19746 +# CONFIG_INPUT_JOYSTICK is not set
19747 +# CONFIG_INPUT_TABLET is not set
19748 +CONFIG_INPUT_TOUCHSCREEN=y
19749 +# CONFIG_TOUCHSCREEN_ADS7846 is not set
19750 +# CONFIG_TOUCHSCREEN_FUJITSU is not set
19751 +CONFIG_TOUCHSCREEN_S3C2410=y
19752 +# CONFIG_TOUCHSCREEN_S3C2410_DEBUG is not set
19753 +# CONFIG_TOUCHSCREEN_GUNZE is not set
19754 +# CONFIG_TOUCHSCREEN_ELO is not set
19755 +# CONFIG_TOUCHSCREEN_MTOUCH is not set
19756 +# CONFIG_TOUCHSCREEN_MK712 is not set
19757 +# CONFIG_TOUCHSCREEN_PENMOUNT is not set
19758 +# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
19759 +# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
19760 +# CONFIG_TOUCHSCREEN_UCB1400 is not set
19761 +# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
19762 +CONFIG_INPUT_MISC=y
19763 +# CONFIG_INPUT_ATI_REMOTE is not set
19764 +# CONFIG_INPUT_ATI_REMOTE2 is not set
19765 +# CONFIG_INPUT_KEYSPAN_REMOTE is not set
19766 +# CONFIG_INPUT_POWERMATE is not set
19767 +# CONFIG_INPUT_YEALINK is not set
19768 +CONFIG_INPUT_UINPUT=m
19769 +CONFIG_INPUT_LIS302DL=y
19770 +
19771 +#
19772 +# Hardware I/O ports
19773 +#
19774 +CONFIG_SERIO=y
19775 +# CONFIG_SERIO_SERPORT is not set
19776 +# CONFIG_SERIO_RAW is not set
19777 +# CONFIG_GAMEPORT is not set
19778 +
19779 +#
19780 +# Character devices
19781 +#
19782 +CONFIG_VT=y
19783 +CONFIG_VT_CONSOLE=y
19784 +CONFIG_NR_TTY_DEVICES=4
19785 +CONFIG_HW_CONSOLE=y
19786 +CONFIG_VT_HW_CONSOLE_BINDING=y
19787 +# CONFIG_SERIAL_NONSTANDARD is not set
19788 +
19789 +#
19790 +# Serial drivers
19791 +#
19792 +# CONFIG_SERIAL_8250 is not set
19793 +
19794 +#
19795 +# Non-8250 serial port support
19796 +#
19797 +CONFIG_SERIAL_S3C2410=y
19798 +CONFIG_SERIAL_S3C2410_CONSOLE=y
19799 +CONFIG_SERIAL_CORE=y
19800 +CONFIG_SERIAL_CORE_CONSOLE=y
19801 +CONFIG_UNIX98_PTYS=y
19802 +# CONFIG_LEGACY_PTYS is not set
19803 +# CONFIG_IPMI_HANDLER is not set
19804 +# CONFIG_HW_RANDOM is not set
19805 +# CONFIG_NVRAM is not set
19806 +# CONFIG_R3964 is not set
19807 +# CONFIG_RAW_DRIVER is not set
19808 +# CONFIG_TCG_TPM is not set
19809 +CONFIG_I2C=y
19810 +CONFIG_I2C_BOARDINFO=y
19811 +CONFIG_I2C_CHARDEV=y
19812 +
19813 +#
19814 +# I2C Algorithms
19815 +#
19816 +# CONFIG_I2C_ALGOBIT is not set
19817 +# CONFIG_I2C_ALGOPCF is not set
19818 +# CONFIG_I2C_ALGOPCA is not set
19819 +
19820 +#
19821 +# I2C Hardware Bus support
19822 +#
19823 +# CONFIG_I2C_GPIO is not set
19824 +# CONFIG_I2C_OCORES is not set
19825 +# CONFIG_I2C_PARPORT_LIGHT is not set
19826 +CONFIG_I2C_S3C2410=y
19827 +# CONFIG_I2C_SIMTEC is not set
19828 +# CONFIG_I2C_TAOS_EVM is not set
19829 +# CONFIG_I2C_STUB is not set
19830 +# CONFIG_I2C_TINY_USB is not set
19831 +
19832 +#
19833 +# Miscellaneous I2C Chip support
19834 +#
19835 +# CONFIG_SENSORS_DS1337 is not set
19836 +# CONFIG_SENSORS_DS1374 is not set
19837 +# CONFIG_DS1682 is not set
19838 +# CONFIG_SENSORS_EEPROM is not set
19839 +CONFIG_SENSORS_PCF50606=y
19840 +CONFIG_SENSORS_PCF50633=y
19841 +# CONFIG_SENSORS_PCF8574 is not set
19842 +# CONFIG_SENSORS_PCA9539 is not set
19843 +# CONFIG_SENSORS_PCF8591 is not set
19844 +# CONFIG_SENSORS_MAX6875 is not set
19845 +# CONFIG_SENSORS_TSL2550 is not set
19846 +CONFIG_SENSORS_TSL256X=m
19847 +# CONFIG_PCA9632 is not set
19848 +# CONFIG_I2C_DEBUG_CORE is not set
19849 +# CONFIG_I2C_DEBUG_ALGO is not set
19850 +# CONFIG_I2C_DEBUG_BUS is not set
19851 +# CONFIG_I2C_DEBUG_CHIP is not set
19852 +
19853 +#
19854 +# SPI support
19855 +#
19856 +CONFIG_SPI=y
19857 +# CONFIG_SPI_DEBUG is not set
19858 +CONFIG_SPI_MASTER=y
19859 +
19860 +#
19861 +# SPI Master Controller Drivers
19862 +#
19863 +CONFIG_SPI_BITBANG=y
19864 +CONFIG_SPI_S3C24XX=y
19865 +CONFIG_SPI_S3C24XX_GPIO=y
19866 +
19867 +#
19868 +# SPI Protocol Masters
19869 +#
19870 +# CONFIG_SPI_AT25 is not set
19871 +# CONFIG_SPI_SPIDEV is not set
19872 +# CONFIG_SPI_TLE62X0 is not set
19873 +# CONFIG_W1 is not set
19874 +CONFIG_POWER_SUPPLY=y
19875 +# CONFIG_POWER_SUPPLY_DEBUG is not set
19876 +# CONFIG_PDA_POWER is not set
19877 +CONFIG_APM_POWER=y
19878 +# CONFIG_BATTERY_DS2760 is not set
19879 +# CONFIG_BATTERY_GTA01 is not set
19880 +CONFIG_BATTERY_BQ27000_HDQ=y
19881 +CONFIG_GTA02_HDQ=y
19882 +# CONFIG_HWMON is not set
19883 +CONFIG_WATCHDOG=y
19884 +# CONFIG_WATCHDOG_NOWAYOUT is not set
19885 +
19886 +#
19887 +# Watchdog Device Drivers
19888 +#
19889 +# CONFIG_SOFT_WATCHDOG is not set
19890 +CONFIG_S3C2410_WATCHDOG=m
19891 +
19892 +#
19893 +# USB-based Watchdog Cards
19894 +#
19895 +# CONFIG_USBPCWATCHDOG is not set
19896 +
19897 +#
19898 +# Sonics Silicon Backplane
19899 +#
19900 +CONFIG_SSB_POSSIBLE=y
19901 +# CONFIG_SSB is not set
19902 +
19903 +#
19904 +# Multifunction device drivers
19905 +#
19906 +# CONFIG_MFD_SM501 is not set
19907 +CONFIG_MFD_GLAMO=y
19908 +CONFIG_MFD_GLAMO_FB=y
19909 +CONFIG_MFD_GLAMO_SPI_GPIO=y
19910 +CONFIG_MFD_GLAMO_SPI_FB=y
19911 +CONFIG_MFD_GLAMO_MCI=y
19912 +
19913 +#
19914 +# Multimedia devices
19915 +#
19916 +# CONFIG_VIDEO_DEV is not set
19917 +# CONFIG_DVB_CORE is not set
19918 +CONFIG_DAB=y
19919 +# CONFIG_USB_DABUSB is not set
19920 +
19921 +#
19922 +# Graphics support
19923 +#
19924 +# CONFIG_VGASTATE is not set
19925 +# CONFIG_VIDEO_OUTPUT_CONTROL is not set
19926 +CONFIG_FB=y
19927 +# CONFIG_FIRMWARE_EDID is not set
19928 +# CONFIG_FB_DDC is not set
19929 +CONFIG_FB_CFB_FILLRECT=y
19930 +CONFIG_FB_CFB_COPYAREA=y
19931 +CONFIG_FB_CFB_IMAGEBLIT=y
19932 +# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
19933 +# CONFIG_FB_SYS_FILLRECT is not set
19934 +# CONFIG_FB_SYS_COPYAREA is not set
19935 +# CONFIG_FB_SYS_IMAGEBLIT is not set
19936 +# CONFIG_FB_SYS_FOPS is not set
19937 +CONFIG_FB_DEFERRED_IO=y
19938 +# CONFIG_FB_SVGALIB is not set
19939 +# CONFIG_FB_MACMODES is not set
19940 +# CONFIG_FB_BACKLIGHT is not set
19941 +# CONFIG_FB_MODE_HELPERS is not set
19942 +# CONFIG_FB_TILEBLITTING is not set
19943 +
19944 +#
19945 +# Frame buffer hardware drivers
19946 +#
19947 +# CONFIG_FB_UVESA is not set
19948 +# CONFIG_FB_S1D13XXX is not set
19949 +CONFIG_FB_S3C2410=y
19950 +# CONFIG_FB_S3C2410_DEBUG is not set
19951 +# CONFIG_FB_VIRTUAL is not set
19952 +CONFIG_BACKLIGHT_LCD_SUPPORT=y
19953 +CONFIG_LCD_CLASS_DEVICE=y
19954 +# CONFIG_LCD_LTV350QV is not set
19955 +CONFIG_BACKLIGHT_CLASS_DEVICE=y
19956 +# CONFIG_BACKLIGHT_CORGI is not set
19957 +CONFIG_BACKLIGHT_GTA01=y
19958 +
19959 +#
19960 +# Display device support
19961 +#
19962 +# CONFIG_DISPLAY_SUPPORT is not set
19963 +CONFIG_DISPLAY_JBT6K74=y
19964 +
19965 +#
19966 +# Console display driver support
19967 +#
19968 +# CONFIG_VGA_CONSOLE is not set
19969 +CONFIG_DUMMY_CONSOLE=y
19970 +CONFIG_FRAMEBUFFER_CONSOLE=y
19971 +# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
19972 +# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
19973 +CONFIG_FONTS=y
19974 +# CONFIG_FONT_8x8 is not set
19975 +# CONFIG_FONT_8x16 is not set
19976 +CONFIG_FONT_6x11=y
19977 +# CONFIG_FONT_7x14 is not set
19978 +# CONFIG_FONT_PEARL_8x8 is not set
19979 +# CONFIG_FONT_ACORN_8x8 is not set
19980 +# CONFIG_FONT_MINI_4x6 is not set
19981 +# CONFIG_FONT_SUN8x16 is not set
19982 +# CONFIG_FONT_SUN12x22 is not set
19983 +# CONFIG_FONT_10x18 is not set
19984 +# CONFIG_LOGO is not set
19985 +
19986 +#
19987 +# Sound
19988 +#
19989 +CONFIG_SOUND=y
19990 +
19991 +#
19992 +# Advanced Linux Sound Architecture
19993 +#
19994 +CONFIG_SND=m
19995 +CONFIG_SND_TIMER=m
19996 +CONFIG_SND_PCM=m
19997 +CONFIG_SND_RAWMIDI=m
19998 +# CONFIG_SND_SEQUENCER is not set
19999 +CONFIG_SND_OSSEMUL=y
20000 +CONFIG_SND_MIXER_OSS=m
20001 +CONFIG_SND_PCM_OSS=m
20002 +CONFIG_SND_PCM_OSS_PLUGINS=y
20003 +# CONFIG_SND_DYNAMIC_MINORS is not set
20004 +CONFIG_SND_SUPPORT_OLD_API=y
20005 +CONFIG_SND_VERBOSE_PROCFS=y
20006 +# CONFIG_SND_VERBOSE_PRINTK is not set
20007 +# CONFIG_SND_DEBUG is not set
20008 +
20009 +#
20010 +# Generic devices
20011 +#
20012 +# CONFIG_SND_DUMMY is not set
20013 +# CONFIG_SND_MTPAV is not set
20014 +# CONFIG_SND_SERIAL_U16550 is not set
20015 +# CONFIG_SND_MPU401 is not set
20016 +
20017 +#
20018 +# ALSA ARM devices
20019 +#
20020 +
20021 +#
20022 +# SPI devices
20023 +#
20024 +
20025 +#
20026 +# USB devices
20027 +#
20028 +# CONFIG_SND_USB_AUDIO is not set
20029 +# CONFIG_SND_USB_CAIAQ is not set
20030 +
20031 +#
20032 +# System on Chip audio support
20033 +#
20034 +CONFIG_SND_SOC=m
20035 +CONFIG_SND_S3C24XX_SOC=m
20036 +CONFIG_SND_S3C24XX_SOC_I2S=m
20037 +CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753=m
20038 +# CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753_DEBUG is not set
20039 +CONFIG_SND_S3C24XX_SOC_NEO1973_GTA02_WM8753=m
20040 +
20041 +#
20042 +# SoC Audio support for SuperH
20043 +#
20044 +CONFIG_SND_SOC_WM8753=m
20045 +
20046 +#
20047 +# Open Sound System
20048 +#
20049 +# CONFIG_SOUND_PRIME is not set
20050 +CONFIG_HID_SUPPORT=y
20051 +CONFIG_HID=y
20052 +# CONFIG_HID_DEBUG is not set
20053 +# CONFIG_HIDRAW is not set
20054 +
20055 +#
20056 +# USB Input Devices
20057 +#
20058 +CONFIG_USB_HID=y
20059 +# CONFIG_USB_HIDINPUT_POWERBOOK is not set
20060 +# CONFIG_HID_FF is not set
20061 +CONFIG_USB_HIDDEV=y
20062 +CONFIG_USB_SUPPORT=y
20063 +CONFIG_USB_ARCH_HAS_HCD=y
20064 +CONFIG_USB_ARCH_HAS_OHCI=y
20065 +# CONFIG_USB_ARCH_HAS_EHCI is not set
20066 +CONFIG_USB=y
20067 +# CONFIG_USB_DEBUG is not set
20068 +
20069 +#
20070 +# Miscellaneous USB options
20071 +#
20072 +CONFIG_USB_DEVICEFS=y
20073 +CONFIG_USB_DEVICE_CLASS=y
20074 +# CONFIG_USB_DYNAMIC_MINORS is not set
20075 +CONFIG_USB_SUSPEND=y
20076 +# CONFIG_USB_PERSIST is not set
20077 +# CONFIG_USB_OTG is not set
20078 +
20079 +#
20080 +# USB Host Controller Drivers
20081 +#
20082 +# CONFIG_USB_ISP116X_HCD is not set
20083 +CONFIG_USB_OHCI_HCD=m
20084 +# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
20085 +# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
20086 +CONFIG_USB_OHCI_LITTLE_ENDIAN=y
20087 +# CONFIG_USB_SL811_HCD is not set
20088 +# CONFIG_USB_R8A66597_HCD is not set
20089 +
20090 +#
20091 +# USB Device Class drivers
20092 +#
20093 +CONFIG_USB_ACM=m
20094 +CONFIG_USB_PRINTER=m
20095 +
20096 +#
20097 +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
20098 +#
20099 +
20100 +#
20101 +# may also be needed; see USB_STORAGE Help for more information
20102 +#
20103 +CONFIG_USB_STORAGE=m
20104 +# CONFIG_USB_STORAGE_DEBUG is not set
20105 +CONFIG_USB_STORAGE_DATAFAB=y
20106 +CONFIG_USB_STORAGE_FREECOM=y
20107 +# CONFIG_USB_STORAGE_ISD200 is not set
20108 +CONFIG_USB_STORAGE_DPCM=y
20109 +CONFIG_USB_STORAGE_USBAT=y
20110 +CONFIG_USB_STORAGE_SDDR09=y
20111 +CONFIG_USB_STORAGE_SDDR55=y
20112 +CONFIG_USB_STORAGE_JUMPSHOT=y
20113 +CONFIG_USB_STORAGE_ALAUDA=y
20114 +CONFIG_USB_STORAGE_KARMA=y
20115 +CONFIG_USB_LIBUSUAL=y
20116 +
20117 +#
20118 +# USB Imaging devices
20119 +#
20120 +# CONFIG_USB_MDC800 is not set
20121 +# CONFIG_USB_MICROTEK is not set
20122 +CONFIG_USB_MON=y
20123 +
20124 +#
20125 +# USB port drivers
20126 +#
20127 +
20128 +#
20129 +# USB Serial Converter support
20130 +#
20131 +CONFIG_USB_SERIAL=m
20132 +CONFIG_USB_SERIAL_GENERIC=y
20133 +CONFIG_USB_SERIAL_AIRCABLE=m
20134 +CONFIG_USB_SERIAL_AIRPRIME=m
20135 +CONFIG_USB_SERIAL_ARK3116=m
20136 +CONFIG_USB_SERIAL_BELKIN=m
20137 +# CONFIG_USB_SERIAL_CH341 is not set
20138 +CONFIG_USB_SERIAL_WHITEHEAT=m
20139 +CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
20140 +CONFIG_USB_SERIAL_CP2101=m
20141 +CONFIG_USB_SERIAL_CYPRESS_M8=m
20142 +CONFIG_USB_SERIAL_EMPEG=m
20143 +CONFIG_USB_SERIAL_FTDI_SIO=m
20144 +CONFIG_USB_SERIAL_FUNSOFT=m
20145 +CONFIG_USB_SERIAL_VISOR=m
20146 +CONFIG_USB_SERIAL_IPAQ=m
20147 +CONFIG_USB_SERIAL_IR=m
20148 +CONFIG_USB_SERIAL_EDGEPORT=m
20149 +CONFIG_USB_SERIAL_EDGEPORT_TI=m
20150 +CONFIG_USB_SERIAL_GARMIN=m
20151 +CONFIG_USB_SERIAL_IPW=m
20152 +CONFIG_USB_SERIAL_KEYSPAN_PDA=m
20153 +CONFIG_USB_SERIAL_KEYSPAN=m
20154 +CONFIG_USB_SERIAL_KEYSPAN_MPR=y
20155 +CONFIG_USB_SERIAL_KEYSPAN_USA28=y
20156 +CONFIG_USB_SERIAL_KEYSPAN_USA28X=y
20157 +CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y
20158 +CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y
20159 +CONFIG_USB_SERIAL_KEYSPAN_USA19=y
20160 +CONFIG_USB_SERIAL_KEYSPAN_USA18X=y
20161 +CONFIG_USB_SERIAL_KEYSPAN_USA19W=y
20162 +CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y
20163 +CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y
20164 +CONFIG_USB_SERIAL_KEYSPAN_USA49W=y
20165 +CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y
20166 +CONFIG_USB_SERIAL_KLSI=m
20167 +CONFIG_USB_SERIAL_KOBIL_SCT=m
20168 +CONFIG_USB_SERIAL_MCT_U232=m
20169 +CONFIG_USB_SERIAL_MOS7720=m
20170 +CONFIG_USB_SERIAL_MOS7840=m
20171 +CONFIG_USB_SERIAL_NAVMAN=m
20172 +CONFIG_USB_SERIAL_PL2303=m
20173 +# CONFIG_USB_SERIAL_OTI6858 is not set
20174 +CONFIG_USB_SERIAL_HP4X=m
20175 +CONFIG_USB_SERIAL_SAFE=m
20176 +CONFIG_USB_SERIAL_SAFE_PADDED=y
20177 +CONFIG_USB_SERIAL_SIERRAWIRELESS=m
20178 +CONFIG_USB_SERIAL_TI=m
20179 +CONFIG_USB_SERIAL_CYBERJACK=m
20180 +CONFIG_USB_SERIAL_XIRCOM=m
20181 +CONFIG_USB_SERIAL_OPTION=m
20182 +CONFIG_USB_SERIAL_OMNINET=m
20183 +# CONFIG_USB_SERIAL_DEBUG is not set
20184 +CONFIG_USB_EZUSB=y
20185 +
20186 +#
20187 +# USB Miscellaneous drivers
20188 +#
20189 +# CONFIG_USB_EMI62 is not set
20190 +# CONFIG_USB_EMI26 is not set
20191 +# CONFIG_USB_ADUTUX is not set
20192 +# CONFIG_USB_AUERSWALD is not set
20193 +# CONFIG_USB_RIO500 is not set
20194 +# CONFIG_USB_LEGOTOWER is not set
20195 +# CONFIG_USB_LCD is not set
20196 +CONFIG_USB_BERRY_CHARGE=m
20197 +# CONFIG_USB_LED is not set
20198 +# CONFIG_USB_CYPRESS_CY7C63 is not set
20199 +# CONFIG_USB_CYTHERM is not set
20200 +# CONFIG_USB_PHIDGET is not set
20201 +# CONFIG_USB_IDMOUSE is not set
20202 +# CONFIG_USB_FTDI_ELAN is not set
20203 +# CONFIG_USB_APPLEDISPLAY is not set
20204 +# CONFIG_USB_LD is not set
20205 +CONFIG_USB_TRANCEVIBRATOR=m
20206 +CONFIG_USB_IOWARRIOR=m
20207 +# CONFIG_USB_TEST is not set
20208 +
20209 +#
20210 +# USB DSL modem support
20211 +#
20212 +
20213 +#
20214 +# USB Gadget Support
20215 +#
20216 +CONFIG_USB_GADGET=y
20217 +# CONFIG_USB_GADGET_DEBUG is not set
20218 +# CONFIG_USB_GADGET_DEBUG_FILES is not set
20219 +CONFIG_USB_GADGET_SELECTED=y
20220 +# CONFIG_USB_GADGET_AMD5536UDC is not set
20221 +# CONFIG_USB_GADGET_ATMEL_USBA is not set
20222 +# CONFIG_USB_GADGET_FSL_USB2 is not set
20223 +# CONFIG_USB_GADGET_NET2280 is not set
20224 +# CONFIG_USB_GADGET_PXA2XX is not set
20225 +# CONFIG_USB_GADGET_M66592 is not set
20226 +# CONFIG_USB_GADGET_GOKU is not set
20227 +# CONFIG_USB_GADGET_LH7A40X is not set
20228 +# CONFIG_USB_GADGET_OMAP is not set
20229 +CONFIG_USB_GADGET_S3C2410=y
20230 +CONFIG_USB_S3C2410=y
20231 +# CONFIG_USB_S3C2410_DEBUG is not set
20232 +# CONFIG_USB_GADGET_AT91 is not set
20233 +# CONFIG_USB_GADGET_DUMMY_HCD is not set
20234 +# CONFIG_USB_GADGET_DUALSPEED is not set
20235 +# CONFIG_USB_ZERO is not set
20236 +CONFIG_USB_ETH=m
20237 +CONFIG_USB_ETH_RNDIS=y
20238 +CONFIG_USB_GADGETFS=m
20239 +CONFIG_USB_FILE_STORAGE=m
20240 +# CONFIG_USB_FILE_STORAGE_TEST is not set
20241 +CONFIG_USB_G_SERIAL=m
20242 +CONFIG_USB_MIDI_GADGET=m
20243 +
20244 +#
20245 +# SDIO support
20246 +#
20247 +CONFIG_SDIO=y
20248 +CONFIG_SDIO_S3C24XX=y
20249 +CONFIG_SDIO_S3C24XX_DMA=y
20250 +CONFIG_SDIO_AR6000_WLAN=y
20251 +CONFIG_MMC=y
20252 +# CONFIG_MMC_DEBUG is not set
20253 +CONFIG_MMC_UNSAFE_RESUME=y
20254 +
20255 +#
20256 +# MMC/SD Card Drivers
20257 +#
20258 +CONFIG_MMC_BLOCK=y
20259 +CONFIG_MMC_BLOCK_BOUNCE=y
20260 +# CONFIG_SDIO_UART is not set
20261 +
20262 +#
20263 +# MMC/SD Host Controller Drivers
20264 +#
20265 +# CONFIG_MMC_SPI is not set
20266 +CONFIG_MMC_S3C=y
20267 +CONFIG_NEW_LEDS=y
20268 +CONFIG_LEDS_CLASS=y
20269 +
20270 +#
20271 +# LED drivers
20272 +#
20273 +CONFIG_LEDS_S3C24XX=m
20274 +# CONFIG_LEDS_GPIO is not set
20275 +CONFIG_LEDS_NEO1973_VIBRATOR=y
20276 +CONFIG_LEDS_NEO1973_GTA02=y
20277 +
20278 +#
20279 +# LED Triggers
20280 +#
20281 +CONFIG_LEDS_TRIGGERS=y
20282 +CONFIG_LEDS_TRIGGER_TIMER=y
20283 +# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
20284 +CONFIG_RTC_LIB=y
20285 +CONFIG_RTC_CLASS=y
20286 +CONFIG_RTC_HCTOSYS=y
20287 +CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
20288 +CONFIG_RTC_DEBUG=y
20289 +
20290 +#
20291 +# RTC interfaces
20292 +#
20293 +CONFIG_RTC_INTF_SYSFS=y
20294 +CONFIG_RTC_INTF_PROC=y
20295 +CONFIG_RTC_INTF_DEV=y
20296 +# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
20297 +# CONFIG_RTC_DRV_TEST is not set
20298 +
20299 +#
20300 +# I2C RTC drivers
20301 +#
20302 +# CONFIG_RTC_DRV_DS1307 is not set
20303 +# CONFIG_RTC_DRV_DS1374 is not set
20304 +# CONFIG_RTC_DRV_DS1672 is not set
20305 +# CONFIG_RTC_DRV_MAX6900 is not set
20306 +# CONFIG_RTC_DRV_RS5C372 is not set
20307 +# CONFIG_RTC_DRV_ISL1208 is not set
20308 +# CONFIG_RTC_DRV_X1205 is not set
20309 +# CONFIG_RTC_DRV_PCF8563 is not set
20310 +# CONFIG_RTC_DRV_PCF8583 is not set
20311 +# CONFIG_RTC_DRV_M41T80 is not set
20312 +
20313 +#
20314 +# SPI RTC drivers
20315 +#
20316 +# CONFIG_RTC_DRV_RS5C348 is not set
20317 +# CONFIG_RTC_DRV_MAX6902 is not set
20318 +
20319 +#
20320 +# Platform RTC drivers
20321 +#
20322 +# CONFIG_RTC_DRV_CMOS is not set
20323 +# CONFIG_RTC_DRV_DS1553 is not set
20324 +# CONFIG_RTC_DRV_STK17TA8 is not set
20325 +# CONFIG_RTC_DRV_DS1742 is not set
20326 +# CONFIG_RTC_DRV_M48T86 is not set
20327 +# CONFIG_RTC_DRV_M48T59 is not set
20328 +# CONFIG_RTC_DRV_V3020 is not set
20329 +
20330 +#
20331 +# on-CPU RTC drivers
20332 +#
20333 +CONFIG_RTC_DRV_S3C=m
20334 +
20335 +#
20336 +# File systems
20337 +#
20338 +CONFIG_EXT2_FS=y
20339 +# CONFIG_EXT2_FS_XATTR is not set
20340 +# CONFIG_EXT2_FS_XIP is not set
20341 +CONFIG_EXT3_FS=y
20342 +# CONFIG_EXT3_FS_XATTR is not set
20343 +# CONFIG_EXT4DEV_FS is not set
20344 +CONFIG_JBD=y
20345 +# CONFIG_REISERFS_FS is not set
20346 +# CONFIG_JFS_FS is not set
20347 +CONFIG_FS_POSIX_ACL=y
20348 +# CONFIG_XFS_FS is not set
20349 +# CONFIG_GFS2_FS is not set
20350 +# CONFIG_OCFS2_FS is not set
20351 +# CONFIG_MINIX_FS is not set
20352 +CONFIG_ROMFS_FS=y
20353 +CONFIG_INOTIFY=y
20354 +CONFIG_INOTIFY_USER=y
20355 +# CONFIG_QUOTA is not set
20356 +CONFIG_DNOTIFY=y
20357 +# CONFIG_AUTOFS_FS is not set
20358 +CONFIG_AUTOFS4_FS=m
20359 +CONFIG_FUSE_FS=m
20360 +
20361 +#
20362 +# CD-ROM/DVD Filesystems
20363 +#
20364 +CONFIG_ISO9660_FS=m
20365 +CONFIG_JOLIET=y
20366 +# CONFIG_ZISOFS is not set
20367 +CONFIG_UDF_FS=m
20368 +CONFIG_UDF_NLS=y
20369 +
20370 +#
20371 +# DOS/FAT/NT Filesystems
20372 +#
20373 +CONFIG_FAT_FS=y
20374 +CONFIG_MSDOS_FS=y
20375 +CONFIG_VFAT_FS=y
20376 +CONFIG_FAT_DEFAULT_CODEPAGE=437
20377 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
20378 +# CONFIG_NTFS_FS is not set
20379 +
20380 +#
20381 +# Pseudo filesystems
20382 +#
20383 +CONFIG_PROC_FS=y
20384 +CONFIG_PROC_SYSCTL=y
20385 +CONFIG_SYSFS=y
20386 +CONFIG_TMPFS=y
20387 +# CONFIG_TMPFS_POSIX_ACL is not set
20388 +# CONFIG_HUGETLB_PAGE is not set
20389 +CONFIG_CONFIGFS_FS=m
20390 +
20391 +#
20392 +# Miscellaneous filesystems
20393 +#
20394 +# CONFIG_ADFS_FS is not set
20395 +# CONFIG_AFFS_FS is not set
20396 +# CONFIG_HFS_FS is not set
20397 +# CONFIG_HFSPLUS_FS is not set
20398 +# CONFIG_BEFS_FS is not set
20399 +# CONFIG_BFS_FS is not set
20400 +# CONFIG_EFS_FS is not set
20401 +CONFIG_JFFS2_FS=y
20402 +CONFIG_JFFS2_FS_DEBUG=0
20403 +CONFIG_JFFS2_FS_WRITEBUFFER=y
20404 +# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
20405 +CONFIG_JFFS2_SUMMARY=y
20406 +# CONFIG_JFFS2_FS_XATTR is not set
20407 +# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
20408 +CONFIG_JFFS2_ZLIB=y
20409 +# CONFIG_JFFS2_LZO is not set
20410 +CONFIG_JFFS2_RTIME=y
20411 +# CONFIG_JFFS2_RUBIN is not set
20412 +CONFIG_CRAMFS=y
20413 +# CONFIG_VXFS_FS is not set
20414 +# CONFIG_HPFS_FS is not set
20415 +# CONFIG_QNX4FS_FS is not set
20416 +# CONFIG_SYSV_FS is not set
20417 +# CONFIG_UFS_FS is not set
20418 +CONFIG_NETWORK_FILESYSTEMS=y
20419 +CONFIG_NFS_FS=y
20420 +CONFIG_NFS_V3=y
20421 +# CONFIG_NFS_V3_ACL is not set
20422 +CONFIG_NFS_V4=y
20423 +# CONFIG_NFS_DIRECTIO is not set
20424 +CONFIG_NFSD=m
20425 +CONFIG_NFSD_V3=y
20426 +# CONFIG_NFSD_V3_ACL is not set
20427 +CONFIG_NFSD_V4=y
20428 +CONFIG_NFSD_TCP=y
20429 +CONFIG_ROOT_NFS=y
20430 +CONFIG_LOCKD=y
20431 +CONFIG_LOCKD_V4=y
20432 +CONFIG_EXPORTFS=m
20433 +CONFIG_NFS_COMMON=y
20434 +CONFIG_SUNRPC=y
20435 +CONFIG_SUNRPC_GSS=y
20436 +# CONFIG_SUNRPC_BIND34 is not set
20437 +CONFIG_RPCSEC_GSS_KRB5=y
20438 +# CONFIG_RPCSEC_GSS_SPKM3 is not set
20439 +# CONFIG_SMB_FS is not set
20440 +CONFIG_CIFS=m
20441 +# CONFIG_CIFS_STATS is not set
20442 +CONFIG_CIFS_WEAK_PW_HASH=y
20443 +# CONFIG_CIFS_XATTR is not set
20444 +# CONFIG_CIFS_DEBUG2 is not set
20445 +# CONFIG_CIFS_EXPERIMENTAL is not set
20446 +# CONFIG_NCP_FS is not set
20447 +# CONFIG_CODA_FS is not set
20448 +# CONFIG_AFS_FS is not set
20449 +
20450 +#
20451 +# Partition Types
20452 +#
20453 +# CONFIG_PARTITION_ADVANCED is not set
20454 +CONFIG_MSDOS_PARTITION=y
20455 +CONFIG_NLS=y
20456 +CONFIG_NLS_DEFAULT="iso8859-1"
20457 +CONFIG_NLS_CODEPAGE_437=y
20458 +# CONFIG_NLS_CODEPAGE_737 is not set
20459 +# CONFIG_NLS_CODEPAGE_775 is not set
20460 +CONFIG_NLS_CODEPAGE_850=m
20461 +# CONFIG_NLS_CODEPAGE_852 is not set
20462 +# CONFIG_NLS_CODEPAGE_855 is not set
20463 +# CONFIG_NLS_CODEPAGE_857 is not set
20464 +# CONFIG_NLS_CODEPAGE_860 is not set
20465 +# CONFIG_NLS_CODEPAGE_861 is not set
20466 +# CONFIG_NLS_CODEPAGE_862 is not set
20467 +# CONFIG_NLS_CODEPAGE_863 is not set
20468 +# CONFIG_NLS_CODEPAGE_864 is not set
20469 +# CONFIG_NLS_CODEPAGE_865 is not set
20470 +# CONFIG_NLS_CODEPAGE_866 is not set
20471 +# CONFIG_NLS_CODEPAGE_869 is not set
20472 +CONFIG_NLS_CODEPAGE_936=m
20473 +CONFIG_NLS_CODEPAGE_950=m
20474 +# CONFIG_NLS_CODEPAGE_932 is not set
20475 +# CONFIG_NLS_CODEPAGE_949 is not set
20476 +# CONFIG_NLS_CODEPAGE_874 is not set
20477 +# CONFIG_NLS_ISO8859_8 is not set
20478 +# CONFIG_NLS_CODEPAGE_1250 is not set
20479 +# CONFIG_NLS_CODEPAGE_1251 is not set
20480 +# CONFIG_NLS_ASCII is not set
20481 +CONFIG_NLS_ISO8859_1=y
20482 +# CONFIG_NLS_ISO8859_2 is not set
20483 +# CONFIG_NLS_ISO8859_3 is not set
20484 +# CONFIG_NLS_ISO8859_4 is not set
20485 +# CONFIG_NLS_ISO8859_5 is not set
20486 +# CONFIG_NLS_ISO8859_6 is not set
20487 +# CONFIG_NLS_ISO8859_7 is not set
20488 +# CONFIG_NLS_ISO8859_9 is not set
20489 +# CONFIG_NLS_ISO8859_13 is not set
20490 +# CONFIG_NLS_ISO8859_14 is not set
20491 +# CONFIG_NLS_ISO8859_15 is not set
20492 +# CONFIG_NLS_KOI8_R is not set
20493 +# CONFIG_NLS_KOI8_U is not set
20494 +CONFIG_NLS_UTF8=m
20495 +# CONFIG_DLM is not set
20496 +CONFIG_INSTRUMENTATION=y
20497 +CONFIG_PROFILING=y
20498 +CONFIG_OPROFILE=m
20499 +# CONFIG_MARKERS is not set
20500 +
20501 +#
20502 +# Kernel hacking
20503 +#
20504 +# CONFIG_PRINTK_TIME is not set
20505 +CONFIG_ENABLE_WARN_DEPRECATED=y
20506 +CONFIG_ENABLE_MUST_CHECK=y
20507 +CONFIG_MAGIC_SYSRQ=y
20508 +# CONFIG_UNUSED_SYMBOLS is not set
20509 +# CONFIG_DEBUG_FS is not set
20510 +# CONFIG_HEADERS_CHECK is not set
20511 +CONFIG_DEBUG_KERNEL=y
20512 +# CONFIG_DEBUG_SHIRQ is not set
20513 +CONFIG_DETECT_SOFTLOCKUP=y
20514 +# CONFIG_SCHED_DEBUG is not set
20515 +# CONFIG_SCHEDSTATS is not set
20516 +CONFIG_TIMER_STATS=y
20517 +# CONFIG_DEBUG_SLAB is not set
20518 +CONFIG_DEBUG_PREEMPT=y
20519 +# CONFIG_DEBUG_RT_MUTEXES is not set
20520 +# CONFIG_RT_MUTEX_TESTER is not set
20521 +# CONFIG_DEBUG_SPINLOCK is not set
20522 +# CONFIG_DEBUG_MUTEXES is not set
20523 +# CONFIG_DEBUG_LOCK_ALLOC is not set
20524 +# CONFIG_PROVE_LOCKING is not set
20525 +# CONFIG_LOCK_STAT is not set
20526 +# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
20527 +# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
20528 +# CONFIG_DEBUG_KOBJECT is not set
20529 +CONFIG_DEBUG_BUGVERBOSE=y
20530 +CONFIG_DEBUG_INFO=y
20531 +# CONFIG_DEBUG_VM is not set
20532 +# CONFIG_DEBUG_LIST is not set
20533 +# CONFIG_DEBUG_SG is not set
20534 +CONFIG_FRAME_POINTER=y
20535 +CONFIG_FORCED_INLINING=y
20536 +# CONFIG_BOOT_PRINTK_DELAY is not set
20537 +# CONFIG_RCU_TORTURE_TEST is not set
20538 +# CONFIG_FAULT_INJECTION is not set
20539 +# CONFIG_SAMPLES is not set
20540 +# CONFIG_DEBUG_USER is not set
20541 +CONFIG_DEBUG_ERRORS=y
20542 +# CONFIG_DEBUG_LL is not set
20543 +CONFIG_DEBUG_S3C_UART=2
20544 +
20545 +#
20546 +# Security options
20547 +#
20548 +# CONFIG_KEYS is not set
20549 +# CONFIG_SECURITY is not set
20550 +# CONFIG_SECURITY_FILE_CAPABILITIES is not set
20551 +CONFIG_CRYPTO=y
20552 +CONFIG_CRYPTO_ALGAPI=y
20553 +CONFIG_CRYPTO_BLKCIPHER=y
20554 +CONFIG_CRYPTO_HASH=y
20555 +CONFIG_CRYPTO_MANAGER=y
20556 +CONFIG_CRYPTO_HMAC=y
20557 +CONFIG_CRYPTO_XCBC=m
20558 +CONFIG_CRYPTO_NULL=m
20559 +CONFIG_CRYPTO_MD4=m
20560 +CONFIG_CRYPTO_MD5=y
20561 +CONFIG_CRYPTO_SHA1=m
20562 +CONFIG_CRYPTO_SHA256=m
20563 +CONFIG_CRYPTO_SHA512=m
20564 +CONFIG_CRYPTO_WP512=m
20565 +CONFIG_CRYPTO_TGR192=m
20566 +CONFIG_CRYPTO_GF128MUL=m
20567 +CONFIG_CRYPTO_ECB=m
20568 +CONFIG_CRYPTO_CBC=y
20569 +CONFIG_CRYPTO_PCBC=m
20570 +CONFIG_CRYPTO_LRW=m
20571 +# CONFIG_CRYPTO_XTS is not set
20572 +# CONFIG_CRYPTO_CRYPTD is not set
20573 +CONFIG_CRYPTO_DES=y
20574 +CONFIG_CRYPTO_FCRYPT=m
20575 +CONFIG_CRYPTO_BLOWFISH=m
20576 +CONFIG_CRYPTO_TWOFISH=m
20577 +CONFIG_CRYPTO_TWOFISH_COMMON=m
20578 +CONFIG_CRYPTO_SERPENT=m
20579 +CONFIG_CRYPTO_AES=m
20580 +CONFIG_CRYPTO_CAST5=m
20581 +CONFIG_CRYPTO_CAST6=m
20582 +CONFIG_CRYPTO_TEA=m
20583 +CONFIG_CRYPTO_ARC4=m
20584 +CONFIG_CRYPTO_KHAZAD=m
20585 +CONFIG_CRYPTO_ANUBIS=m
20586 +# CONFIG_CRYPTO_SEED is not set
20587 +CONFIG_CRYPTO_DEFLATE=m
20588 +CONFIG_CRYPTO_MICHAEL_MIC=m
20589 +CONFIG_CRYPTO_CRC32C=m
20590 +CONFIG_CRYPTO_CAMELLIA=m
20591 +CONFIG_CRYPTO_TEST=m
20592 +# CONFIG_CRYPTO_AUTHENC is not set
20593 +CONFIG_CRYPTO_HW=y
20594 +
20595 +#
20596 +# Library routines
20597 +#
20598 +CONFIG_BITREVERSE=y
20599 +CONFIG_CRC_CCITT=m
20600 +CONFIG_CRC16=m
20601 +# CONFIG_CRC_ITU_T is not set
20602 +CONFIG_CRC32=y
20603 +# CONFIG_CRC7 is not set
20604 +CONFIG_LIBCRC32C=m
20605 +CONFIG_ZLIB_INFLATE=y
20606 +CONFIG_ZLIB_DEFLATE=y
20607 +CONFIG_TEXTSEARCH=y
20608 +CONFIG_TEXTSEARCH_KMP=m
20609 +CONFIG_TEXTSEARCH_BM=m
20610 +CONFIG_TEXTSEARCH_FSM=m
20611 +CONFIG_PLIST=y
20612 +CONFIG_HAS_IOMEM=y
20613 +CONFIG_HAS_DMA=y
20614 Index: linux-2.6.24.7/dfu-kern
20615 ===================================================================
20616 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
20617 +++ linux-2.6.24.7/dfu-kern 2008-12-11 22:46:49.000000000 +0100
20618 @@ -0,0 +1,9 @@
20619 +#!/bin/bash
20620 +../../dfu-util/src/dfu-util -a 3 -d 0x1d50:0x5119 -D uImage.bin
20621 +if [ $? -eq 1 ] ; then
20622 +../../dfu-util/src/dfu-util -a 3 -d 0x1d50:0x5120 -D uImage.bin
20623 +../../dfu-util/src/dfu-util -a 3 -d 0x1d50:0x5119 -D uImage.bin
20624 +
20625 +fi
20626 +
20627 +
20628 Index: linux-2.6.24.7/Documentation/arm/Samsung-S3C24XX/NAND.txt
20629 ===================================================================
20630 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
20631 +++ linux-2.6.24.7/Documentation/arm/Samsung-S3C24XX/NAND.txt 2008-12-11 22:46:49.000000000 +0100
20632 @@ -0,0 +1,30 @@
20633 + S3C24XX NAND Support
20634 + ====================
20635 +
20636 +Introduction
20637 +------------
20638 +
20639 +Small Page NAND
20640 +---------------
20641 +
20642 +The driver uses a 512 byte (1 page) ECC code for this setup. The
20643 +ECC code is not directly compatible with the default kernel ECC
20644 +code, so the driver enforces its own OOB layout and ECC parameters
20645 +
20646 +Large Page NAND
20647 +---------------
20648 +
20649 +The driver is capable of handling NAND flash with a 2KiB page
20650 +size, with support for hardware ECC generation and correction.
20651 +
20652 +Unlike the 512byte page mode, the driver generates ECC data for
20653 +each 256 byte block in an 2KiB page. This means that more than
20654 +one error in a page can be rectified. It also means that the
20655 +OOB layout remains the default kernel layout for these flashes.
20656 +
20657 +
20658 +Document Author
20659 +---------------
20660 +
20661 +Ben Dooks, Copyright 2007 Simtec Electronics
20662 +
20663 Index: linux-2.6.24.7/Documentation/arm/Samsung-S3C24XX/Overview.txt
20664 ===================================================================
20665 --- linux-2.6.24.7.orig/Documentation/arm/Samsung-S3C24XX/Overview.txt 2008-12-11 22:46:07.000000000 +0100
20666 +++ linux-2.6.24.7/Documentation/arm/Samsung-S3C24XX/Overview.txt 2008-12-11 22:46:49.000000000 +0100
20667 @@ -156,6 +156,8 @@ NAND
20668 controller. If there are any problems the latest linux-mtd
20669 code can be found from http://www.linux-mtd.infradead.org/
20670
20671 + For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt
20672 +
20673
20674 Serial
20675 ------
20676 Index: linux-2.6.24.7/drivers/base/core.c
20677 ===================================================================
20678 --- linux-2.6.24.7.orig/drivers/base/core.c 2008-12-11 22:46:07.000000000 +0100
20679 +++ linux-2.6.24.7/drivers/base/core.c 2008-12-11 22:46:49.000000000 +0100
20680 @@ -42,6 +42,11 @@ int (*platform_notify_remove)(struct dev
20681 */
20682 const char *dev_driver_string(struct device *dev)
20683 {
20684 + if (!dev) {
20685 + printk(KERN_ERR"Null dev to dev_driver_string\n");
20686 + dump_stack();
20687 + return "*NULL*";
20688 + }
20689 return dev->driver ? dev->driver->name :
20690 (dev->bus ? dev->bus->name :
20691 (dev->class ? dev->class->name : ""));
20692 Index: linux-2.6.24.7/drivers/base/power/main.c
20693 ===================================================================
20694 --- linux-2.6.24.7.orig/drivers/base/power/main.c 2008-12-11 22:46:07.000000000 +0100
20695 +++ linux-2.6.24.7/drivers/base/power/main.c 2008-12-11 22:46:49.000000000 +0100
20696 @@ -40,9 +40,9 @@ int (*platform_enable_wakeup)(struct dev
20697
20698 void device_pm_add(struct device *dev)
20699 {
20700 - pr_debug("PM: Adding info for %s:%s\n",
20701 + /* pr_debug("PM: Adding info for %s:%s\n",
20702 dev->bus ? dev->bus->name : "No Bus",
20703 - kobject_name(&dev->kobj));
20704 + kobject_name(&dev->kobj)); */
20705 mutex_lock(&dpm_list_mtx);
20706 list_add_tail(&dev->power.entry, &dpm_active);
20707 mutex_unlock(&dpm_list_mtx);
20708 Index: linux-2.6.24.7/drivers/char/Kconfig
20709 ===================================================================
20710 --- linux-2.6.24.7.orig/drivers/char/Kconfig 2008-12-11 22:46:09.000000000 +0100
20711 +++ linux-2.6.24.7/drivers/char/Kconfig 2008-12-11 22:46:49.000000000 +0100
20712 @@ -58,6 +58,18 @@ config VT_CONSOLE
20713
20714 If unsure, say Y.
20715
20716 +config NR_TTY_DEVICES
20717 + int "Maximum tty device number"
20718 + depends on VT
20719 + default 63
20720 + ---help---
20721 + This is the highest numbered device created in /dev. You will actually have
20722 + NR_TTY_DEVICES+1 devices in /dev. The default is 63, which will result in
20723 + 64 /dev entries. The lowest number you can set is 11, anything below that,
20724 + and it will default to 11. 63 is also the upper limit so we don't overrun
20725 + the serial consoles.
20726 +
20727 +
20728 config HW_CONSOLE
20729 bool
20730 depends on VT && !S390 && !UML
20731 Index: linux-2.6.24.7/drivers/i2c/busses/i2c-s3c2410.c
20732 ===================================================================
20733 --- linux-2.6.24.7.orig/drivers/i2c/busses/i2c-s3c2410.c 2008-12-11 22:46:07.000000000 +0100
20734 +++ linux-2.6.24.7/drivers/i2c/busses/i2c-s3c2410.c 2008-12-11 22:46:49.000000000 +0100
20735 @@ -71,6 +71,8 @@ struct s3c24xx_i2c {
20736 struct resource *irq;
20737 struct resource *ioarea;
20738 struct i2c_adapter adap;
20739 +
20740 + int suspended;
20741 };
20742
20743 /* default platform data to use if not supplied in the platform_device
20744 @@ -156,6 +158,14 @@ static inline void s3c24xx_i2c_disable_i
20745 unsigned long tmp;
20746
20747 tmp = readl(i2c->regs + S3C2410_IICCON);
20748 +
20749 +/* S3c2442 datasheet
20750 + *
20751 + * If the IICCON[5]=0, IICCON[4] does not operate correctly.
20752 + * So, It is recommended that you should set IICCON[5]=1,
20753 + * although you does not use the IIC interrupt.
20754 + */
20755 +
20756 writel(tmp & ~S3C2410_IICCON_IRQEN, i2c->regs + S3C2410_IICCON);
20757 }
20758
20759 @@ -282,7 +292,7 @@ static int i2s_s3c_irq_nextbyte(struct s
20760
20761 case STATE_STOP:
20762 dev_err(i2c->dev, "%s: called in STATE_STOP\n", __FUNCTION__);
20763 - s3c24xx_i2c_disable_irq(i2c);
20764 + s3c24xx_i2c_disable_irq(i2c);
20765 goto out_ack;
20766
20767 case STATE_START:
20768 @@ -502,6 +512,15 @@ static int s3c24xx_i2c_doxfer(struct s3c
20769 unsigned long timeout;
20770 int ret;
20771
20772 + if (i2c->suspended) {
20773 + dev_err(i2c->dev,
20774 + "Hey I am still asleep (suspended: %d), retry later\n",
20775 + i2c->suspended);
20776 + dump_stack();
20777 + ret = -EAGAIN;
20778 + goto out;
20779 + }
20780 +
20781 ret = s3c24xx_i2c_set_master(i2c);
20782 if (ret != 0) {
20783 dev_err(i2c->dev, "cannot get bus (error %d)\n", ret);
20784 @@ -886,12 +905,25 @@ static int s3c24xx_i2c_remove(struct pla
20785 }
20786
20787 #ifdef CONFIG_PM
20788 -static int s3c24xx_i2c_resume(struct platform_device *dev)
20789 +
20790 +static int s3c24xx_i2c_suspend(struct platform_device *dev, pm_message_t state)
20791 {
20792 struct s3c24xx_i2c *i2c = platform_get_drvdata(dev);
20793
20794 if (i2c != NULL)
20795 + i2c->suspended++;
20796 +
20797 + return 0;
20798 +}
20799 +
20800 +static int s3c24xx_i2c_resume(struct platform_device *dev)
20801 +{
20802 + struct s3c24xx_i2c *i2c = platform_get_drvdata(dev);
20803 +
20804 + if (i2c != NULL) {
20805 s3c24xx_i2c_init(i2c);
20806 + i2c->suspended--;
20807 + }
20808
20809 return 0;
20810 }
20811 @@ -905,6 +937,7 @@ static int s3c24xx_i2c_resume(struct pla
20812 static struct platform_driver s3c2410_i2c_driver = {
20813 .probe = s3c24xx_i2c_probe,
20814 .remove = s3c24xx_i2c_remove,
20815 + .suspend = s3c24xx_i2c_suspend,
20816 .resume = s3c24xx_i2c_resume,
20817 .driver = {
20818 .owner = THIS_MODULE,
20819 @@ -915,6 +948,7 @@ static struct platform_driver s3c2410_i2
20820 static struct platform_driver s3c2440_i2c_driver = {
20821 .probe = s3c24xx_i2c_probe,
20822 .remove = s3c24xx_i2c_remove,
20823 + .suspend = s3c24xx_i2c_suspend,
20824 .resume = s3c24xx_i2c_resume,
20825 .driver = {
20826 .owner = THIS_MODULE,
20827 Index: linux-2.6.24.7/drivers/i2c/chips/Kconfig
20828 ===================================================================
20829 --- linux-2.6.24.7.orig/drivers/i2c/chips/Kconfig 2008-12-11 22:46:07.000000000 +0100
20830 +++ linux-2.6.24.7/drivers/i2c/chips/Kconfig 2008-12-11 22:46:49.000000000 +0100
20831 @@ -51,6 +51,26 @@ config SENSORS_EEPROM
20832 This driver can also be built as a module. If so, the module
20833 will be called eeprom.
20834
20835 +config SENSORS_PCF50606
20836 + tristate "Philips/NXP PCF50606"
20837 + depends on I2C
20838 + help
20839 + If you say yes here you get support for Philips/NXP PCF50606
20840 + PMU (Power Management Unit) chips.
20841 +
20842 + This driver can also be built as a module. If so, the module
20843 + will be called pcf50606.
20844 +
20845 +config SENSORS_PCF50633
20846 + tristate "Philips PCF50633"
20847 + depends on I2C
20848 + help
20849 + If you say yes here you get support for Philips PCF50633
20850 + PMU (Power Management Unit) chips.
20851 +
20852 + This driver can also be built as a module. If so, the module
20853 + will be called pcf50633.
20854 +
20855 config SENSORS_PCF8574
20856 tristate "Philips PCF8574 and PCF8574A"
20857 depends on EXPERIMENTAL
20858 @@ -163,4 +183,23 @@ config MENELAUS
20859 and other features that are often used in portable devices like
20860 cell phones and PDAs.
20861
20862 +config SENSORS_TSL256X
20863 + tristate "Texas TSL256X Ambient Light Sensor"
20864 + depends on I2C
20865 + help
20866 + If you say yes here you get support for the Texas TSL256X
20867 + ambient light sensor chip.
20868 +
20869 + This driver can also be built as a module. If so, the module
20870 + will be called tsl256x.
20871 +
20872 +config PCA9632
20873 + tristate "Philips/NXP PCA9632 low power LED driver"
20874 + depends on I2C
20875 + help
20876 + If you say yes here you get support for the Philips/NXP PCA9632
20877 + LED driver.
20878 +
20879 + This driver can also be built as a module. If so, the module
20880 + will be called pca9632.
20881 endmenu
20882 Index: linux-2.6.24.7/drivers/i2c/chips/Makefile
20883 ===================================================================
20884 --- linux-2.6.24.7.orig/drivers/i2c/chips/Makefile 2008-12-11 22:46:07.000000000 +0100
20885 +++ linux-2.6.24.7/drivers/i2c/chips/Makefile 2008-12-11 22:46:49.000000000 +0100
20886 @@ -9,12 +9,16 @@ obj-$(CONFIG_SENSORS_EEPROM) += eeprom.o
20887 obj-$(CONFIG_SENSORS_MAX6875) += max6875.o
20888 obj-$(CONFIG_SENSORS_M41T00) += m41t00.o
20889 obj-$(CONFIG_SENSORS_PCA9539) += pca9539.o
20890 +obj-$(CONFIG_SENSORS_PCF50606) += pcf50606.o
20891 +obj-$(CONFIG_SENSORS_PCF50633) += pcf50633.o
20892 obj-$(CONFIG_SENSORS_PCF8574) += pcf8574.o
20893 obj-$(CONFIG_SENSORS_PCF8591) += pcf8591.o
20894 obj-$(CONFIG_ISP1301_OMAP) += isp1301_omap.o
20895 obj-$(CONFIG_TPS65010) += tps65010.o
20896 obj-$(CONFIG_MENELAUS) += menelaus.o
20897 obj-$(CONFIG_SENSORS_TSL2550) += tsl2550.o
20898 +obj-$(CONFIG_SENSORS_TSL256X) += tsl256x.o
20899 +obj-$(CONFIG_PCA9632) += pca9632.o
20900
20901 ifeq ($(CONFIG_I2C_DEBUG_CHIP),y)
20902 EXTRA_CFLAGS += -DDEBUG
20903 Index: linux-2.6.24.7/drivers/i2c/chips/pca9632.c
20904 ===================================================================
20905 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
20906 +++ linux-2.6.24.7/drivers/i2c/chips/pca9632.c 2008-12-11 22:46:49.000000000 +0100
20907 @@ -0,0 +1,551 @@
20908 +/*
20909 + * Philips/NXP PCA9632 low power LED driver.
20910 + * Copyright (C) 2008 Matt Hsu <matt_hsu@openmoko.org>
20911 + *
20912 + * low_level implementation are based on pcf50606 driver
20913 + *
20914 + * This program is free software; you can redistribute it and/or modify
20915 + * it under the terms of the GNU General Public License as published by
20916 + * the Free Software Foundation; version 2 of the License.
20917 + *
20918 + * TODO:
20919 + * - attach ledclass??
20920 + * - add platform data
20921 + *
20922 + */
20923 +
20924 +#include <linux/module.h>
20925 +#include <linux/init.h>
20926 +#include <linux/i2c.h>
20927 +#include <linux/platform_device.h>
20928 +
20929 +#include "pca9632.h"
20930 +
20931 +/* Addresses to scan */
20932 +static unsigned short normal_i2c[] = { 0x62, I2C_CLIENT_END };
20933 +
20934 +/* Insmod parameters */
20935 +I2C_CLIENT_INSMOD_1(pca9632);
20936 +
20937 +enum pca9632_pwr_state {
20938 + PCA9632_NORMAL,
20939 + PCA9632_SLEEP,
20940 +};
20941 +
20942 +enum pca9632_led_output {
20943 + PCA9632_OFF,
20944 + PCA9632_ON,
20945 + PCA9632_CTRL_BY_PWM,
20946 + PCA9632_CTRL_BY_PWM_GRPPWM,
20947 +};
20948 +
20949 +static const char *led_output_name[] = {
20950 + [PCA9632_OFF] = "off",
20951 + [PCA9632_ON] = "fully-on",
20952 + [PCA9632_CTRL_BY_PWM] = "ctrl-by-pwm",
20953 + [PCA9632_CTRL_BY_PWM_GRPPWM] = "ctrl-by-pwm-grppwm",
20954 +};
20955 +
20956 +struct pca9632_data {
20957 + struct i2c_client client;
20958 + struct mutex lock;
20959 +};
20960 +
20961 +static struct i2c_driver pca9632_driver;
20962 +static struct platform_device *pca9632_pdev;
20963 +
20964 +static int pca9632_attach_adapter(struct i2c_adapter *adapter);
20965 +static int pca9632_detach_client(struct i2c_client *client);
20966 +
20967 +static int __reg_write(struct pca9632_data *pca, u_int8_t reg, u_int8_t val)
20968 +{
20969 + return i2c_smbus_write_byte_data(&pca->client, reg, val);
20970 +}
20971 +
20972 +static int reg_write(struct pca9632_data *pca, u_int8_t reg, u_int8_t val)
20973 +{
20974 + int ret;
20975 +
20976 + mutex_lock(&pca->lock);
20977 + ret = __reg_write(pca, reg, val);
20978 + mutex_unlock(&pca->lock);
20979 +
20980 + return ret;
20981 +}
20982 +
20983 +static int32_t __reg_read(struct pca9632_data *pca, u_int8_t reg)
20984 +{
20985 + int32_t ret;
20986 +
20987 + ret = i2c_smbus_read_byte_data(&pca->client, reg);
20988 +
20989 + return ret;
20990 +}
20991 +
20992 +static u_int8_t reg_read(struct pca9632_data *pca, u_int8_t reg)
20993 +{
20994 + int32_t ret;
20995 +
20996 + mutex_lock(&pca->lock);
20997 + ret = __reg_read(pca, reg);
20998 + mutex_unlock(&pca->lock);
20999 +
21000 + return ret & 0xff;
21001 +}
21002 +
21003 +static int reg_set_bit_mask(struct pca9632_data *pca,
21004 + u_int8_t reg, u_int8_t mask, u_int8_t val)
21005 +{
21006 + int ret;
21007 + u_int8_t tmp;
21008 +
21009 + val &= mask;
21010 +
21011 + mutex_lock(&pca->lock);
21012 +
21013 + tmp = __reg_read(pca, reg);
21014 + tmp &= ~mask;
21015 + tmp |= val;
21016 + ret = __reg_write(pca, reg, tmp);
21017 +
21018 + mutex_unlock(&pca->lock);
21019 +
21020 + return ret;
21021 +}
21022 +
21023 +static inline int calc_dc(uint8_t idc)
21024 +{
21025 + return (idc * 100) / 256;
21026 +}
21027 +
21028 +/*
21029 + * Software reset
21030 + */
21031 +static int software_rst(struct i2c_adapter *adapter)
21032 +{
21033 + u8 buf[] = { 0xa5, 0x5a };
21034 +
21035 + struct i2c_msg msg[] = {
21036 + {
21037 + .addr = 0x3,
21038 + .flags = 0,
21039 + .buf = &buf,
21040 + .len = sizeof(buf)
21041 + }
21042 + };
21043 +
21044 + return i2c_transfer(adapter, msg, 1);
21045 +}
21046 +
21047 +/*
21048 + * Group dmblnk control
21049 + */
21050 +static void config_group_dmblnk(struct pca9632_data *pca, int group_dmblnk_mode)
21051 +{
21052 + reg_set_bit_mask(pca, PCA9632_REG_MODE2, 0x20,
21053 + group_dmblnk_mode << PCA9632_DMBLNK_SHIFT);
21054 +}
21055 +
21056 +static int get_group_dmblnk(struct pca9632_data *pca)
21057 +{
21058 + return reg_read(pca, PCA9632_REG_MODE2) >> PCA9632_DMBLNK_SHIFT;
21059 +}
21060 +
21061 +static ssize_t show_group_dmblnk(struct device *dev, struct device_attribute
21062 + *attr, char *buf)
21063 +{
21064 + struct i2c_client *client = to_i2c_client(dev);
21065 + struct pca9632_data *pca = i2c_get_clientdata(client);
21066 +
21067 + if (get_group_dmblnk(pca))
21068 + return sprintf(buf, "blinking\n");
21069 + else
21070 + return sprintf(buf, "dimming\n");
21071 +}
21072 +
21073 +static ssize_t set_group_dmblnk(struct device *dev, struct device_attribute
21074 + *attr, const char *buf, size_t count)
21075 +{
21076 + struct i2c_client *client = to_i2c_client(dev);
21077 + struct pca9632_data *pca = i2c_get_clientdata(client);
21078 + unsigned int mode = simple_strtoul(buf, NULL, 10);
21079 +
21080 + if (mode)
21081 + dev_info(&pca->client.dev, "blinking\n");
21082 + else
21083 + dev_info(&pca->client.dev, "dimming\n");
21084 +
21085 + config_group_dmblnk(pca, mode);
21086 +
21087 + return count;
21088 +}
21089 +
21090 +static DEVICE_ATTR(group_dmblnk, S_IRUGO | S_IWUSR, show_group_dmblnk,
21091 + set_group_dmblnk);
21092 +
21093 +static int reg_id_by_name(const char *name)
21094 +{
21095 + int reg_id = -1;
21096 +
21097 + if (!strncmp(name, "led0", 4))
21098 + reg_id = PCA9632_REG_PWM0;
21099 + else if (!strncmp(name, "led1", 4))
21100 + reg_id = PCA9632_REG_PWM1;
21101 + else if (!strncmp(name, "led2", 4))
21102 + reg_id = PCA9632_REG_PWM2;
21103 + else if (!strncmp(name, "led3", 4))
21104 + reg_id = PCA9632_REG_PWM3;
21105 +
21106 + return reg_id;
21107 +}
21108 +
21109 +static int get_led_output(struct pca9632_data *pca, int ldrx)
21110 +{
21111 + u_int8_t led_state;
21112 +
21113 + ldrx = ldrx - 2;
21114 + led_state = reg_read(pca, PCA9632_REG_LEDOUT);
21115 + led_state = (led_state >> (2 * ldrx)) & 0x03;
21116 +
21117 + return led_state;
21118 +}
21119 +
21120 +static void config_led_output(struct pca9632_data *pca, int ldrx,
21121 + enum pca9632_led_output led_output)
21122 +{
21123 + u_int8_t mask;
21124 + int tmp;
21125 +
21126 + ldrx = ldrx - 2;
21127 + mask = 0x03 << (2 * ldrx);
21128 + tmp = reg_set_bit_mask(pca, PCA9632_REG_LEDOUT,
21129 + mask, led_output << (2 * ldrx));
21130 +}
21131 +
21132 +/*
21133 + * Individual brightness control
21134 + */
21135 +static ssize_t show_brightness(struct device *dev, struct device_attribute
21136 + *attr, char *buf)
21137 +{
21138 + struct i2c_client *client = to_i2c_client(dev);
21139 + struct pca9632_data *pca = i2c_get_clientdata(client);
21140 + int ldrx;
21141 +
21142 + ldrx = reg_id_by_name(attr->attr.name);
21143 +
21144 + switch (get_led_output(pca, ldrx)) {
21145 +
21146 + case PCA9632_OFF:
21147 + case PCA9632_ON:
21148 + return sprintf(buf, "%s",
21149 + led_output_name[get_led_output(pca, ldrx)]);
21150 +
21151 + case PCA9632_CTRL_BY_PWM:
21152 + return sprintf(buf, "%d%% \n", calc_dc(reg_read(pca, ldrx)));
21153 +
21154 + case PCA9632_CTRL_BY_PWM_GRPPWM:
21155 + /* check group dmblnk */
21156 + if (get_group_dmblnk(pca))
21157 + return sprintf(buf, "%d%% \n",
21158 + calc_dc(reg_read(pca, ldrx)));
21159 + return sprintf(buf, "%d%% \n",
21160 + calc_dc((reg_read(pca, ldrx) & 0xfc)));
21161 + default:
21162 + break;
21163 + }
21164 +
21165 + return sprintf(buf, "invalid argument\n");
21166 +}
21167 +
21168 +static ssize_t set_brightness(struct device *dev, struct device_attribute *attr,
21169 + const char *buf, size_t count)
21170 +{
21171 + struct i2c_client *client = to_i2c_client(dev);
21172 + struct pca9632_data *pca = i2c_get_clientdata(client);
21173 + unsigned int pwm = simple_strtoul(buf, NULL, 10);
21174 + int ldrx;
21175 +
21176 + ldrx = reg_id_by_name(attr->attr.name);
21177 + reg_set_bit_mask(pca, ldrx, 0xff, pwm);
21178 +
21179 + return count;
21180 +}
21181 +
21182 +static
21183 +DEVICE_ATTR(led0_pwm, S_IRUGO | S_IWUSR, show_brightness, set_brightness);
21184 +static
21185 +DEVICE_ATTR(led1_pwm, S_IRUGO | S_IWUSR, show_brightness, set_brightness);
21186 +static
21187 +DEVICE_ATTR(led2_pwm, S_IRUGO | S_IWUSR, show_brightness, set_brightness);
21188 +static
21189 +DEVICE_ATTR(led3_pwm, S_IRUGO | S_IWUSR, show_brightness, set_brightness);
21190 +
21191 +/*
21192 + * Group frequency control
21193 + */
21194 +static ssize_t show_group_freq(struct device *dev, struct device_attribute
21195 + *attr, char *buf)
21196 +{
21197 + uint32_t period;
21198 + struct i2c_client *client = to_i2c_client(dev);
21199 + struct pca9632_data *pca = i2c_get_clientdata(client);
21200 +
21201 + period = ((reg_read(pca, PCA9632_REG_GRPFREQ) + 1) * 1000) / 24;
21202 +
21203 + return sprintf(buf, "%d ms\n", period);
21204 +}
21205 +
21206 +static ssize_t set_group_freq(struct device *dev, struct device_attribute *attr,
21207 + const char *buf, size_t count)
21208 +{
21209 + struct i2c_client *client = to_i2c_client(dev);
21210 + struct pca9632_data *pca = i2c_get_clientdata(client);
21211 +
21212 + unsigned int freq = simple_strtoul(buf, NULL, 10);
21213 + reg_write(pca, PCA9632_REG_GRPFREQ, freq);
21214 + return count;
21215 +}
21216 +
21217 +static
21218 +DEVICE_ATTR(group_freq, S_IRUGO | S_IWUSR, show_group_freq, set_group_freq);
21219 +
21220 +/*
21221 + * Group duty cycle tonrol*
21222 + */
21223 +static ssize_t show_group_dc(struct device *dev, struct device_attribute *attr,
21224 + char *buf)
21225 +{
21226 + struct i2c_client *client = to_i2c_client(dev);
21227 + struct pca9632_data *pca = i2c_get_clientdata(client);
21228 +
21229 + if (get_group_dmblnk(pca)) {
21230 +
21231 + if (reg_read(pca, PCA9632_REG_GRPFREQ) <= 0x03)
21232 + return sprintf(buf, "%d%% \n",
21233 + calc_dc(reg_read(pca, PCA9632_REG_GRPPWM) & 0xfc));
21234 +
21235 + return sprintf(buf, "%d%% \n", calc_dc(reg_read(pca,
21236 + PCA9632_REG_GRPPWM)));
21237 + }
21238 +
21239 + return sprintf(buf, "%d%% \n", calc_dc(reg_read(pca,
21240 + PCA9632_REG_GRPPWM) & 0xf0));
21241 +}
21242 +
21243 +static ssize_t set_group_dc(struct device *dev, struct device_attribute *attr,
21244 + const char *buf, size_t count)
21245 +{
21246 + struct i2c_client *client = to_i2c_client(dev);
21247 + struct pca9632_data *pca = i2c_get_clientdata(client);
21248 +
21249 + unsigned int dc = simple_strtoul(buf, NULL, 10);
21250 +
21251 + reg_set_bit_mask(pca, PCA9632_REG_GRPPWM, 0xff, dc);
21252 +
21253 + return count;
21254 +}
21255 +
21256 +static DEVICE_ATTR(group_dc, S_IRUGO | S_IWUSR, show_group_dc, set_group_dc);
21257 +
21258 +/*
21259 + * LED driver output
21260 + */
21261 +static ssize_t show_led_output(struct device *dev, struct device_attribute
21262 + *attr, char *buf)
21263 +{
21264 + struct i2c_client *client = to_i2c_client(dev);
21265 + struct pca9632_data *pca = i2c_get_clientdata(client);
21266 + int ldrx;
21267 +
21268 + ldrx = reg_id_by_name(attr->attr.name);
21269 +
21270 + return sprintf(buf, "%s \n",
21271 + led_output_name[get_led_output(pca, ldrx)]);
21272 +
21273 +}
21274 +static ssize_t set_led_output(struct device *dev, struct device_attribute *attr,
21275 + const char *buf, size_t count)
21276 +{
21277 + struct i2c_client *client = to_i2c_client(dev);
21278 + struct pca9632_data *pca = i2c_get_clientdata(client);
21279 + enum pca9632_led_output led_output;
21280 + int ldrx;
21281 +
21282 + led_output = simple_strtoul(buf, NULL, 10);
21283 + ldrx = reg_id_by_name(attr->attr.name);
21284 + config_led_output(pca, ldrx, led_output);
21285 +
21286 + return count;
21287 +}
21288 +
21289 +static
21290 +DEVICE_ATTR(led0_output, S_IRUGO | S_IWUSR, show_led_output, set_led_output);
21291 +static
21292 +DEVICE_ATTR(led1_output, S_IRUGO | S_IWUSR, show_led_output, set_led_output);
21293 +static
21294 +DEVICE_ATTR(led2_output, S_IRUGO | S_IWUSR, show_led_output, set_led_output);
21295 +static
21296 +DEVICE_ATTR(led3_output, S_IRUGO | S_IWUSR, show_led_output, set_led_output);
21297 +
21298 +static struct attribute *pca_sysfs_entries[] = {
21299 + &dev_attr_group_dmblnk.attr,
21300 + &dev_attr_led0_pwm.attr,
21301 + &dev_attr_led1_pwm.attr,
21302 + &dev_attr_led2_pwm.attr,
21303 + &dev_attr_led3_pwm.attr,
21304 + &dev_attr_group_dc.attr,
21305 + &dev_attr_group_freq.attr,
21306 + &dev_attr_led0_output.attr,
21307 + &dev_attr_led1_output.attr,
21308 + &dev_attr_led2_output.attr,
21309 + &dev_attr_led3_output.attr,
21310 + NULL
21311 +};
21312 +
21313 +static struct attribute_group pca_attr_group = {
21314 + .name = NULL, /* put in device directory */
21315 + .attrs = pca_sysfs_entries,
21316 +};
21317 +
21318 +#ifdef CONFIG_PM
21319 +static int pca9632_suspend(struct device *dev, pm_message_t state)
21320 +{
21321 + /* FIXME: Not implemented */
21322 + return 0;
21323 +}
21324 +
21325 +static int pca9632_resume(struct device *dev)
21326 +{
21327 + /* FIXME: Not implemented */
21328 + return 0;
21329 +}
21330 +#else
21331 +#define pca9632_suspend NULL
21332 +#define pca9632_resume NULL
21333 +#endif
21334 +
21335 +static struct i2c_driver pca9632_driver = {
21336 + .driver = {
21337 + .name = "pca9632",
21338 + .suspend = pca9632_suspend,
21339 + .resume = pca9632_resume,
21340 + },
21341 + .id = I2C_DRIVERID_PCA9632,
21342 + .attach_adapter = pca9632_attach_adapter,
21343 + .detach_client = pca9632_detach_client,
21344 +};
21345 +
21346 +static int pca9632_detect(struct i2c_adapter *adapter, int address, int kind)
21347 +{
21348 + struct i2c_client *new_client;
21349 + struct pca9632_data *pca;
21350 + int err;
21351 +
21352 + pca = kzalloc(sizeof(struct pca9632_data), GFP_KERNEL);
21353 + if (!pca)
21354 + return -ENOMEM;
21355 +
21356 + mutex_init(&pca->lock);
21357 +
21358 + new_client = &pca->client;
21359 + i2c_set_clientdata(new_client, pca);
21360 + new_client->addr = address;
21361 + new_client->adapter = adapter;
21362 + new_client->driver = &pca9632_driver;
21363 + new_client->flags = 0;
21364 +
21365 + strlcpy(new_client->name, "pca9632", I2C_NAME_SIZE);
21366 +
21367 + /* register with i2c core */
21368 + err = i2c_attach_client(new_client);
21369 + if (err)
21370 + goto exit_kfree;
21371 +
21372 + err = sysfs_create_group(&new_client->dev.kobj, &pca_attr_group);
21373 + if (err)
21374 + goto exit_detach;
21375 +
21376 + /* software reset */
21377 + if (!software_rst(adapter))
21378 + dev_info(&pca->client.dev, "pca9632 sw-rst done\n");
21379 +
21380 + /* enter normal mode */
21381 + reg_set_bit_mask(pca, PCA9632_REG_MODE1, 0x10, PCA9632_NORMAL);
21382 +
21383 + return 0;
21384 +
21385 +exit_detach:
21386 + i2c_detach_client(new_client);
21387 +exit_kfree:
21388 + kfree(pca);
21389 +
21390 + return err;
21391 +}
21392 +
21393 +static int pca9632_attach_adapter(struct i2c_adapter *adapter)
21394 +{
21395 + return i2c_probe(adapter, &addr_data, pca9632_detect);
21396 +}
21397 +
21398 +static int pca9632_detach_client(struct i2c_client *client)
21399 +{
21400 + int err;
21401 +
21402 + sysfs_remove_group(&client->dev.kobj, &pca_attr_group);
21403 + err = i2c_detach_client(client);
21404 +
21405 + if (err)
21406 + return err;
21407 +
21408 + kfree(i2c_get_clientdata(client));
21409 +
21410 + return 0;
21411 +}
21412 +
21413 +static int __init pca9632_plat_probe(struct platform_device *pdev)
21414 +{
21415 + /* FIXME: platform data should be attached here */
21416 + pca9632_pdev = pdev;
21417 +
21418 + return 0;
21419 +}
21420 +
21421 +static int pca9632_plat_remove(struct platform_device *pdev)
21422 +{
21423 + return 0;
21424 +}
21425 +
21426 +static struct platform_driver pca9632_plat_driver = {
21427 + .probe = pca9632_plat_probe,
21428 + .remove = pca9632_plat_remove,
21429 + .driver = {
21430 + .owner = THIS_MODULE,
21431 + .name = "pca9632",
21432 + },
21433 +};
21434 +
21435 +static int __init pca9632_init(void)
21436 +{
21437 + int rc;
21438 +
21439 + rc = platform_driver_register(&pca9632_plat_driver);
21440 + if (!rc)
21441 + i2c_add_driver(&pca9632_driver);
21442 +
21443 + return rc;
21444 +}
21445 +
21446 +static void __exit pca9632_exit(void)
21447 +{
21448 + i2c_del_driver(&pca9632_driver);
21449 +
21450 + platform_driver_unregister(&pca9632_plat_driver);
21451 +}
21452 +
21453 +MODULE_AUTHOR("Matt Hsu <matt_hsu@openmoko.org>");
21454 +MODULE_DESCRIPTION("NXP PCA9632 driver");
21455 +MODULE_LICENSE("GPL");
21456 +
21457 +module_init(pca9632_init);
21458 +module_exit(pca9632_exit);
21459 Index: linux-2.6.24.7/drivers/i2c/chips/pca9632.h
21460 ===================================================================
21461 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
21462 +++ linux-2.6.24.7/drivers/i2c/chips/pca9632.h 2008-12-11 22:46:49.000000000 +0100
21463 @@ -0,0 +1,24 @@
21464 +#ifndef _PCA9632_H
21465 +#define _PCA9632_H
21466 +
21467 +
21468 +enum pca9632_regs{
21469 +
21470 + PCA9632_REG_MODE1 = 0x00,
21471 + PCA9632_REG_MODE2 = 0x01,
21472 + PCA9632_REG_PWM0 = 0x02,
21473 + PCA9632_REG_PWM1 = 0x03,
21474 + PCA9632_REG_PWM2 = 0x04,
21475 + PCA9632_REG_PWM3 = 0x05,
21476 + PCA9632_REG_GRPPWM = 0x06,
21477 + PCA9632_REG_GRPFREQ = 0x07,
21478 + PCA9632_REG_LEDOUT = 0x08,
21479 + PCA9632_REG_SUBADDR1 = 0x09,
21480 + PCA9632_REG_SUBADDR2 = 0x0a,
21481 + PCA9632_REG_SUBADDR3 = 0x0b,
21482 + PCA9632_REG_ALLCALLADR1 = 0x0c,
21483 +};
21484 +
21485 +#define PCA9632_DMBLNK_SHIFT 5
21486 +
21487 +#endif /* _PCA9632_H */
21488 Index: linux-2.6.24.7/drivers/i2c/chips/pcf50606.c
21489 ===================================================================
21490 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
21491 +++ linux-2.6.24.7/drivers/i2c/chips/pcf50606.c 2008-12-11 22:46:49.000000000 +0100
21492 @@ -0,0 +1,2289 @@
21493 +/* Philips/NXP PCF50606 Power Management Unit (PMU) driver
21494 + *
21495 + * (C) 2006-2007 by Openmoko, Inc.
21496 + * Authors: Harald Welte <laforge@openmoko.org>,
21497 + * Matt Hsu <matt@openmoko.org>
21498 + * All rights reserved.
21499 + *
21500 + * This program is free software; you can redistribute it and/or
21501 + * modify it under the terms of the GNU General Public License as
21502 + * published by the Free Software Foundation; either version 2 of
21503 + * the License, or (at your option) any later version.
21504 + *
21505 + * This program is distributed in the hope that it will be useful,
21506 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
21507 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21508 + * GNU General Public License for more details.
21509 + *
21510 + * You should have received a copy of the GNU General Public License
21511 + * along with this program; if not, write to the Free Software
21512 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21513 + * MA 02111-1307 USA
21514 + *
21515 + * This driver is a monster ;) It provides the following features
21516 + * - voltage control for a dozen different voltage domains
21517 + * - charging control for main and backup battery
21518 + * - rtc / alarm
21519 + * - watchdog
21520 + * - adc driver (hw_sensors like)
21521 + * - pwm driver
21522 + * - backlight
21523 + *
21524 + */
21525 +
21526 +#include <linux/module.h>
21527 +#include <linux/init.h>
21528 +#include <linux/i2c.h>
21529 +#include <linux/types.h>
21530 +#include <linux/interrupt.h>
21531 +#include <linux/irq.h>
21532 +#include <linux/workqueue.h>
21533 +#include <linux/delay.h>
21534 +#include <linux/rtc.h>
21535 +#include <linux/bcd.h>
21536 +#include <linux/watchdog.h>
21537 +#include <linux/miscdevice.h>
21538 +#include <linux/input.h>
21539 +#include <linux/fb.h>
21540 +#include <linux/backlight.h>
21541 +#include <linux/sched.h>
21542 +#include <linux/platform_device.h>
21543 +#include <linux/pcf50606.h>
21544 +#include <linux/apm-emulation.h>
21545 +#include <linux/power_supply.h>
21546 +
21547 +#include <asm/mach-types.h>
21548 +#include <asm/arch/gta01.h>
21549 +
21550 +#include "pcf50606.h"
21551 +
21552 +/* we use dev_dbg() throughout the code, but sometimes don't want to
21553 + * write an entire line of debug related information. This DEBUGPC
21554 + * macro is a continuation for dev_dbg() */
21555 +#ifdef DEBUG
21556 +#define DEBUGPC(x, args ...) printk(x, ## args)
21557 +#else
21558 +#define DEBUGPC(x, args ...)
21559 +#endif
21560 +
21561 +/***********************************************************************
21562 + * Static data / structures
21563 + ***********************************************************************/
21564 +
21565 +static unsigned short normal_i2c[] = { 0x08, I2C_CLIENT_END };
21566 +
21567 +I2C_CLIENT_INSMOD_1(pcf50606);
21568 +
21569 +#define PCF50606_B_CHG_FAST 0 /* Charger Fast allowed */
21570 +#define PCF50606_B_CHG_PRESENT 1 /* Charger present */
21571 +#define PCF50606_B_CHG_FOK 2 /* Fast OK for battery */
21572 +#define PCF50606_B_CHG_ERR 3 /* Charger Error */
21573 +#define PCF50606_B_CHG_PROT 4 /* Charger Protection */
21574 +#define PCF50606_B_CHG_READY 5 /* Charging completed */
21575 +
21576 +#define PCF50606_F_CHG_FAST (1<<PCF50606_B_CHG_FAST)
21577 +#define PCF50606_F_CHG_PRESENT (1<<PCF50606_B_CHG_PRESENT)
21578 +#define PCF50606_F_CHG_FOK (1<<PCF50606_B_CHG_FOK)
21579 +#define PCF50606_F_CHG_ERR (1<<PCF50606_B_CHG_ERR)
21580 +#define PCF50606_F_CHG_PROT (1<<PCF50606_B_CHG_PROT)
21581 +#define PCF50606_F_CHG_READY (1<<PCF50606_B_CHG_READY)
21582 +#define PCF50606_F_CHG_MASK 0x000000fc
21583 +
21584 +#define PCF50606_F_PWR_PRESSED 0x00000100
21585 +#define PCF50606_F_RTC_SECOND 0x00000200
21586 +
21587 +enum close_state {
21588 + CLOSE_STATE_NOT,
21589 + CLOSE_STATE_ALLOW = 0x2342,
21590 +};
21591 +
21592 +enum pcf50606_suspend_states {
21593 + PCF50606_SS_RUNNING,
21594 + PCF50606_SS_STARTING_SUSPEND,
21595 + PCF50606_SS_COMPLETED_SUSPEND,
21596 + PCF50606_SS_RESUMING_BUT_NOT_US_YET,
21597 + PCF50606_SS_STARTING_RESUME,
21598 + PCF50606_SS_COMPLETED_RESUME,
21599 +};
21600 +
21601 +struct pcf50606_data {
21602 + struct i2c_client client;
21603 + struct pcf50606_platform_data *pdata;
21604 + struct backlight_device *backlight;
21605 + struct mutex lock;
21606 + unsigned int flags;
21607 + unsigned int working;
21608 + struct mutex working_lock;
21609 + struct work_struct work;
21610 + struct rtc_device *rtc;
21611 + struct input_dev *input_dev;
21612 + int allow_close;
21613 + int onkey_seconds;
21614 + int irq;
21615 + int coldplug_done;
21616 + int suppress_onkey_events;
21617 + enum pcf50606_suspend_states suspend_state;
21618 +#ifdef CONFIG_PM
21619 + struct {
21620 + u_int8_t dcdc1, dcdc2;
21621 + u_int8_t dcdec1;
21622 + u_int8_t dcudc1;
21623 + u_int8_t ioregc;
21624 + u_int8_t d1regc1;
21625 + u_int8_t d2regc1;
21626 + u_int8_t d3regc1;
21627 + u_int8_t lpregc1;
21628 + u_int8_t adcc1, adcc2;
21629 + u_int8_t pwmc1;
21630 + u_int8_t int1m, int2m, int3m;
21631 + } standby_regs;
21632 +#endif
21633 +};
21634 +
21635 +static struct i2c_driver pcf50606_driver;
21636 +
21637 +/* This global is set by the pcf50606 driver to the correct callback
21638 + * for the gta01 battery driver. */
21639 +int (*pmu_bat_get_property)(struct power_supply *, enum power_supply_property,
21640 + union power_supply_propval *);
21641 +EXPORT_SYMBOL(pmu_bat_get_property);
21642 +
21643 +/* This is an ugly construct on how to access the (currently single/global)
21644 + * pcf50606 handle from other code in the kernel. I didn't really come up with
21645 + * a more decent method of dynamically resolving this */
21646 +struct pcf50606_data *pcf50606_global;
21647 +EXPORT_SYMBOL_GPL(pcf50606_global);
21648 +
21649 +static struct platform_device *pcf50606_pdev;
21650 +
21651 +/* This is a 10k, B=3370 NTC Thermistor -10..79 centigrade */
21652 +/* Table entries are offset by +0.5C so a properly rounded value is generated */
21653 +static const u_int16_t ntc_table_10k_3370B[] = {
21654 + /* -10 */
21655 + 43888, 41819, 39862, 38010, 36257, 34596, 33024, 31534, 30121, 28781,
21656 + 27510, 26304, 25159, 24071, 23038, 22056, 21122, 20234, 19390, 18586,
21657 + 17821, 17093, 16399, 15738, 15107, 14506, 13933, 13387, 12865, 12367,
21658 + 11891, 11437, 11003, 10588, 10192, 9813, 9450, 9103, 8771, 8453,
21659 + 8149, 7857, 7578, 7310, 7054, 6808, 6572, 6346, 6129, 5920,
21660 + 5720, 5528, 5344, 5167, 4996, 4833, 4675, 4524, 4379, 4239,
21661 + 4104, 3975, 3850, 3730, 3614, 3503, 3396, 3292, 3193, 3097,
21662 + 3004, 2915, 2829, 2745, 2665, 2588, 2513, 2441, 2371, 2304,
21663 + 2239, 2176, 2116, 2057, 2000, 1945, 1892, 1841, 1791, 1743,
21664 +};
21665 +
21666 +
21667 +/***********************************************************************
21668 + * Low-Level routines
21669 + ***********************************************************************/
21670 +
21671 +static inline int __reg_write(struct pcf50606_data *pcf, u_int8_t reg,
21672 + u_int8_t val)
21673 +{
21674 + if (pcf->suspend_state == PCF50606_SS_COMPLETED_SUSPEND) {
21675 + dev_err(&pcf->client.dev, "__reg_write while suspended.\n");
21676 + dump_stack();
21677 + }
21678 + return i2c_smbus_write_byte_data(&pcf->client, reg, val);
21679 +}
21680 +
21681 +static int reg_write(struct pcf50606_data *pcf, u_int8_t reg, u_int8_t val)
21682 +{
21683 + int ret;
21684 +
21685 + mutex_lock(&pcf->lock);
21686 + ret = __reg_write(pcf, reg, val);
21687 + mutex_unlock(&pcf->lock);
21688 +
21689 + return ret;
21690 +}
21691 +
21692 +static inline int32_t __reg_read(struct pcf50606_data *pcf, u_int8_t reg)
21693 +{
21694 + int32_t ret;
21695 +
21696 + if (pcf->suspend_state == PCF50606_SS_COMPLETED_SUSPEND) {
21697 + dev_err(&pcf->client.dev, "__reg_read while suspended.\n");
21698 + dump_stack();
21699 + }
21700 + ret = i2c_smbus_read_byte_data(&pcf->client, reg);
21701 +
21702 + return ret;
21703 +}
21704 +
21705 +static u_int8_t reg_read(struct pcf50606_data *pcf, u_int8_t reg)
21706 +{
21707 + int32_t ret;
21708 +
21709 + mutex_lock(&pcf->lock);
21710 + ret = __reg_read(pcf, reg);
21711 + mutex_unlock(&pcf->lock);
21712 +
21713 + return ret & 0xff;
21714 +}
21715 +
21716 +static int reg_set_bit_mask(struct pcf50606_data *pcf,
21717 + u_int8_t reg, u_int8_t mask, u_int8_t val)
21718 +{
21719 + int ret;
21720 + u_int8_t tmp;
21721 +
21722 + val &= mask;
21723 +
21724 + mutex_lock(&pcf->lock);
21725 +
21726 + tmp = __reg_read(pcf, reg);
21727 + tmp &= ~mask;
21728 + tmp |= val;
21729 + ret = __reg_write(pcf, reg, tmp);
21730 +
21731 + mutex_unlock(&pcf->lock);
21732 +
21733 + return ret;
21734 +}
21735 +
21736 +static int reg_clear_bits(struct pcf50606_data *pcf, u_int8_t reg, u_int8_t val)
21737 +{
21738 + int ret;
21739 + u_int8_t tmp;
21740 +
21741 + mutex_lock(&pcf->lock);
21742 +
21743 + tmp = __reg_read(pcf, reg);
21744 + tmp &= ~val;
21745 + ret = __reg_write(pcf, reg, tmp);
21746 +
21747 + mutex_unlock(&pcf->lock);
21748 +
21749 + return ret;
21750 +}
21751 +
21752 +/* synchronously read one ADC channel (busy-wait for result to be complete) */
21753 +static u_int16_t adc_read(struct pcf50606_data *pcf, int channel,
21754 + u_int16_t *data2)
21755 +{
21756 + u_int8_t adcs2, adcs1;
21757 + u_int16_t ret;
21758 +
21759 + dev_dbg(&pcf->client.dev, "entering (pcf=%p, channel=%u, data2=%p)\n",
21760 + pcf, channel, data2);
21761 +
21762 + channel &= PCF50606_ADCC2_ADCMUX_MASK;
21763 +
21764 + mutex_lock(&pcf->lock);
21765 +
21766 + /* start ADC conversion of selected channel */
21767 + __reg_write(pcf, PCF50606_REG_ADCC2, channel |
21768 + PCF50606_ADCC2_ADCSTART | PCF50606_ADCC2_RES_10BIT);
21769 +
21770 + do {
21771 + adcs2 = __reg_read(pcf, PCF50606_REG_ADCS2);
21772 + } while (!(adcs2 & PCF50606_ADCS2_ADCRDY));
21773 +
21774 + adcs1 = __reg_read(pcf, PCF50606_REG_ADCS1);
21775 + ret = (adcs1 << 2) | (adcs2 & 0x03);
21776 +
21777 + if (data2) {
21778 + adcs1 = __reg_read(pcf, PCF50606_REG_ADCS3);
21779 + *data2 = (adcs1 << 2) | ((adcs2 & 0x0c) >> 2);
21780 + }
21781 +
21782 + mutex_unlock(&pcf->lock);
21783 +
21784 + dev_dbg(&pcf->client.dev, "returning %u %u\n", ret,
21785 + data2 ? *data2 : 0);
21786 +
21787 + return ret;
21788 +}
21789 +
21790 +/***********************************************************************
21791 + * Voltage / ADC
21792 + ***********************************************************************/
21793 +
21794 +static u_int8_t dcudc_voltage(unsigned int millivolts)
21795 +{
21796 + if (millivolts < 900)
21797 + return 0;
21798 + if (millivolts > 5500)
21799 + return 0x1f;
21800 + if (millivolts <= 3300) {
21801 + millivolts -= 900;
21802 + return millivolts/300;
21803 + }
21804 + if (millivolts < 4000)
21805 + return 0x0f;
21806 + else {
21807 + millivolts -= 4000;
21808 + return millivolts/100;
21809 + }
21810 +}
21811 +
21812 +static unsigned int dcudc_2voltage(u_int8_t bits)
21813 +{
21814 + bits &= 0x1f;
21815 + if (bits < 0x08)
21816 + return 900 + bits * 300;
21817 + else if (bits < 0x10)
21818 + return 3300;
21819 + else
21820 + return 4000 + bits * 100;
21821 +}
21822 +
21823 +static u_int8_t dcdec_voltage(unsigned int millivolts)
21824 +{
21825 + if (millivolts < 900)
21826 + return 0;
21827 + else if (millivolts > 3300)
21828 + return 0x0f;
21829 +
21830 + millivolts -= 900;
21831 + return millivolts/300;
21832 +}
21833 +
21834 +static unsigned int dcdec_2voltage(u_int8_t bits)
21835 +{
21836 + bits &= 0x0f;
21837 + return 900 + bits*300;
21838 +}
21839 +
21840 +static u_int8_t dcdc_voltage(unsigned int millivolts)
21841 +{
21842 + if (millivolts < 900)
21843 + return 0;
21844 + else if (millivolts > 3600)
21845 + return 0x1f;
21846 +
21847 + if (millivolts < 1500) {
21848 + millivolts -= 900;
21849 + return millivolts/25;
21850 + } else {
21851 + millivolts -= 1500;
21852 + return 0x18 + millivolts/300;
21853 + }
21854 +}
21855 +
21856 +static unsigned int dcdc_2voltage(u_int8_t bits)
21857 +{
21858 + bits &= 0x1f;
21859 + if ((bits & 0x18) == 0x18)
21860 + return 1500 + ((bits & 0x7) * 300);
21861 + else
21862 + return 900 + (bits * 25);
21863 +}
21864 +
21865 +static u_int8_t dx_voltage(unsigned int millivolts)
21866 +{
21867 + if (millivolts < 900)
21868 + return 0;
21869 + else if (millivolts > 3300)
21870 + return 0x18;
21871 +
21872 + millivolts -= 900;
21873 + return millivolts/100;
21874 +}
21875 +
21876 +static unsigned int dx_2voltage(u_int8_t bits)
21877 +{
21878 + bits &= 0x1f;
21879 + return 900 + (bits * 100);
21880 +}
21881 +
21882 +static const u_int8_t regulator_registers[__NUM_PCF50606_REGULATORS] = {
21883 + [PCF50606_REGULATOR_DCD] = PCF50606_REG_DCDC1,
21884 + [PCF50606_REGULATOR_DCDE] = PCF50606_REG_DCDEC1,
21885 + [PCF50606_REGULATOR_DCUD] = PCF50606_REG_DCUDC1,
21886 + [PCF50606_REGULATOR_D1REG] = PCF50606_REG_D1REGC1,
21887 + [PCF50606_REGULATOR_D2REG] = PCF50606_REG_D2REGC1,
21888 + [PCF50606_REGULATOR_D3REG] = PCF50606_REG_D3REGC1,
21889 + [PCF50606_REGULATOR_LPREG] = PCF50606_REG_LPREGC1,
21890 + [PCF50606_REGULATOR_IOREG] = PCF50606_REG_IOREGC,
21891 +};
21892 +
21893 +int pcf50606_onoff_set(struct pcf50606_data *pcf,
21894 + enum pcf50606_regulator_id reg, int on)
21895 +{
21896 + u_int8_t addr;
21897 +
21898 + if (reg >= __NUM_PCF50606_REGULATORS)
21899 + return -EINVAL;
21900 +
21901 + /* IOREG cannot be powered off since it powers the PMU I2C */
21902 + if (reg == PCF50606_REGULATOR_IOREG)
21903 + return -EIO;
21904 +
21905 + addr = regulator_registers[reg];
21906 +
21907 + if (on == 0)
21908 + reg_set_bit_mask(pcf, addr, 0xe0, 0x00);
21909 + else
21910 + reg_set_bit_mask(pcf, addr, 0xe0, 0xe0);
21911 +
21912 + return 0;
21913 +}
21914 +EXPORT_SYMBOL_GPL(pcf50606_onoff_set);
21915 +
21916 +int pcf50606_onoff_get(struct pcf50606_data *pcf,
21917 + enum pcf50606_regulator_id reg)
21918 +{
21919 + u_int8_t val, addr;
21920 +
21921 + if (reg >= __NUM_PCF50606_REGULATORS)
21922 + return -EINVAL;
21923 +
21924 + addr = regulator_registers[reg];
21925 + val = (reg_read(pcf, addr) & 0xe0) >> 5;
21926 +
21927 + /* PWREN1 = 1, PWREN2 = 1, see table 16 of datasheet */
21928 + switch (val) {
21929 + case 0:
21930 + case 5:
21931 + return 0;
21932 + default:
21933 + return 1;
21934 + }
21935 +}
21936 +EXPORT_SYMBOL_GPL(pcf50606_onoff_get);
21937 +
21938 +int pcf50606_voltage_set(struct pcf50606_data *pcf,
21939 + enum pcf50606_regulator_id reg,
21940 + unsigned int millivolts)
21941 +{
21942 + u_int8_t volt_bits;
21943 + u_int8_t regnr;
21944 + int rc;
21945 +
21946 + dev_dbg(&pcf->client.dev, "pcf=%p, reg=%d, mvolts=%d\n", pcf, reg,
21947 + millivolts);
21948 +
21949 + if (reg >= __NUM_PCF50606_REGULATORS)
21950 + return -EINVAL;
21951 +
21952 + if (millivolts > pcf->pdata->rails[reg].voltage.max)
21953 + return -EINVAL;
21954 +
21955 + switch (reg) {
21956 + case PCF50606_REGULATOR_DCD:
21957 + volt_bits = dcdc_voltage(millivolts);
21958 + rc = reg_set_bit_mask(pcf, PCF50606_REG_DCDC1, 0x1f,
21959 + volt_bits);
21960 + break;
21961 + case PCF50606_REGULATOR_DCDE:
21962 + volt_bits = dcdec_voltage(millivolts);
21963 + rc = reg_set_bit_mask(pcf, PCF50606_REG_DCDEC1, 0x0f,
21964 + volt_bits);
21965 + break;
21966 + case PCF50606_REGULATOR_DCUD:
21967 + volt_bits = dcudc_voltage(millivolts);
21968 + rc = reg_set_bit_mask(pcf, PCF50606_REG_DCUDC1, 0x1f,
21969 + volt_bits);
21970 + break;
21971 + case PCF50606_REGULATOR_D1REG:
21972 + case PCF50606_REGULATOR_D2REG:
21973 + case PCF50606_REGULATOR_D3REG:
21974 + regnr = PCF50606_REG_D1REGC1 + (reg - PCF50606_REGULATOR_D1REG);
21975 + volt_bits = dx_voltage(millivolts);
21976 + rc = reg_set_bit_mask(pcf, regnr, 0x1f, volt_bits);
21977 + break;
21978 + case PCF50606_REGULATOR_LPREG:
21979 + volt_bits = dx_voltage(millivolts);
21980 + rc = reg_set_bit_mask(pcf, PCF50606_REG_LPREGC1, 0x1f,
21981 + volt_bits);
21982 + break;
21983 + case PCF50606_REGULATOR_IOREG:
21984 + if (millivolts < 1800)
21985 + return -EINVAL;
21986 + volt_bits = dx_voltage(millivolts);
21987 + rc = reg_set_bit_mask(pcf, PCF50606_REG_IOREGC, 0x1f,
21988 + volt_bits);
21989 + break;
21990 + default:
21991 + return -EINVAL;
21992 + }
21993 +
21994 + return rc;
21995 +}
21996 +EXPORT_SYMBOL_GPL(pcf50606_voltage_set);
21997 +
21998 +unsigned int pcf50606_voltage_get(struct pcf50606_data *pcf,
21999 + enum pcf50606_regulator_id reg)
22000 +{
22001 + u_int8_t volt_bits;
22002 + u_int8_t regnr;
22003 + unsigned int rc = 0;
22004 +
22005 + if (reg >= __NUM_PCF50606_REGULATORS)
22006 + return -EINVAL;
22007 +
22008 + switch (reg) {
22009 + case PCF50606_REGULATOR_DCD:
22010 + volt_bits = reg_read(pcf, PCF50606_REG_DCDC1) & 0x1f;
22011 + rc = dcdc_2voltage(volt_bits);
22012 + break;
22013 + case PCF50606_REGULATOR_DCDE:
22014 + volt_bits = reg_read(pcf, PCF50606_REG_DCDEC1) & 0x0f;
22015 + rc = dcdec_2voltage(volt_bits);
22016 + break;
22017 + case PCF50606_REGULATOR_DCUD:
22018 + volt_bits = reg_read(pcf, PCF50606_REG_DCUDC1) & 0x1f;
22019 + rc = dcudc_2voltage(volt_bits);
22020 + break;
22021 + case PCF50606_REGULATOR_D1REG:
22022 + case PCF50606_REGULATOR_D2REG:
22023 + case PCF50606_REGULATOR_D3REG:
22024 + regnr = PCF50606_REG_D1REGC1 + (reg - PCF50606_REGULATOR_D1REG);
22025 + volt_bits = reg_read(pcf, regnr) & 0x1f;
22026 + if (volt_bits > 0x18)
22027 + volt_bits = 0x18;
22028 + rc = dx_2voltage(volt_bits);
22029 + break;
22030 + case PCF50606_REGULATOR_LPREG:
22031 + volt_bits = reg_read(pcf, PCF50606_REG_LPREGC1) & 0x1f;
22032 + if (volt_bits > 0x18)
22033 + volt_bits = 0x18;
22034 + rc = dx_2voltage(volt_bits);
22035 + break;
22036 + case PCF50606_REGULATOR_IOREG:
22037 + volt_bits = reg_read(pcf, PCF50606_REG_IOREGC) & 0x1f;
22038 + if (volt_bits > 0x18)
22039 + volt_bits = 0x18;
22040 + rc = dx_2voltage(volt_bits);
22041 + break;
22042 + default:
22043 + return -EINVAL;
22044 + }
22045 +
22046 + return rc;
22047 +}
22048 +EXPORT_SYMBOL_GPL(pcf50606_voltage_get);
22049 +
22050 +/* go into 'STANDBY' mode, i.e. power off the main CPU and peripherals */
22051 +void pcf50606_go_standby(void)
22052 +{
22053 + reg_write(pcf50606_global, PCF50606_REG_OOCC1,
22054 + PCF50606_OOCC1_GOSTDBY);
22055 +}
22056 +EXPORT_SYMBOL_GPL(pcf50606_go_standby);
22057 +
22058 +void pcf50606_gpo0_set(struct pcf50606_data *pcf, int on)
22059 +{
22060 + u_int8_t val;
22061 +
22062 + if (on)
22063 + val = 0x07;
22064 + else
22065 + val = 0x0f;
22066 +
22067 + reg_set_bit_mask(pcf, PCF50606_REG_GPOC1, 0x0f, val);
22068 +}
22069 +EXPORT_SYMBOL_GPL(pcf50606_gpo0_set);
22070 +
22071 +int pcf50606_gpo0_get(struct pcf50606_data *pcf)
22072 +{
22073 + u_int8_t reg = reg_read(pcf, PCF50606_REG_GPOC1) & 0x0f;
22074 +
22075 + if (reg == 0x07 || reg == 0x08)
22076 + return 1;
22077 +
22078 + return 0;
22079 +}
22080 +EXPORT_SYMBOL_GPL(pcf50606_gpo0_get);
22081 +
22082 +static void pcf50606_work(struct work_struct *work)
22083 +{
22084 + struct pcf50606_data *pcf =
22085 + container_of(work, struct pcf50606_data, work);
22086 + u_int8_t pcfirq[3];
22087 + int ret;
22088 +
22089 + mutex_lock(&pcf->working_lock);
22090 + pcf->working = 1;
22091 +
22092 + /* sanity */
22093 + if (!&pcf->client.dev)
22094 + goto bail;
22095 +
22096 + /*
22097 + * if we are presently suspending, we are not in a position to deal
22098 + * with pcf50606 interrupts at all.
22099 + *
22100 + * Because we didn't clear the int pending registers, there will be
22101 + * no edge / interrupt waiting for us when we wake. But it is OK
22102 + * because at the end of our resume, we call this workqueue function
22103 + * gratuitously, clearing the pending register and re-enabling
22104 + * servicing this interrupt.
22105 + */
22106 +
22107 + if ((pcf->suspend_state == PCF50606_SS_STARTING_SUSPEND) ||
22108 + (pcf->suspend_state == PCF50606_SS_COMPLETED_SUSPEND))
22109 + goto bail;
22110 +
22111 + /*
22112 + * If we are inside suspend -> resume completion time we don't attempt
22113 + * service until we have fully resumed. Although we could talk to the
22114 + * device as soon as I2C is up, the regs in the device which we might
22115 + * choose to modify as part of the service action have not been
22116 + * reloaded with their pre-suspend states yet. Therefore we will
22117 + * defer our service if we are called like that until our resume has
22118 + * completed.
22119 + *
22120 + * This shouldn't happen any more because we disable servicing this
22121 + * interrupt in suspend and don't re-enable it until resume is
22122 + * completed.
22123 + */
22124 +
22125 + if (pcf->suspend_state &&
22126 + (pcf->suspend_state != PCF50606_SS_COMPLETED_RESUME))
22127 + goto reschedule;
22128 +
22129 + /* this is the case early in resume! Sanity check! */
22130 + if (i2c_get_clientdata(&pcf->client) == NULL)
22131 + goto reschedule;
22132 +
22133 + /*
22134 + * p35 pcf50606 datasheet rev 2.2:
22135 + * ''The system controller shall read all interrupt registers in
22136 + * one I2C read action''
22137 + * because if you don't INT# gets stuck asserted forever after a
22138 + * while
22139 + */
22140 + ret = i2c_smbus_read_i2c_block_data(&pcf->client, PCF50606_REG_INT1,
22141 + sizeof(pcfirq), pcfirq);
22142 + if (ret != sizeof(pcfirq)) {
22143 + DEBUGPC("Oh crap PMU IRQ register read failed %d\n", ret);
22144 + /*
22145 + * it shouldn't fail, we no longer attempt to use
22146 + * I2C while it can be suspended. But we don't have
22147 + * much option but to retry if if it ever did fail,
22148 + * because if we don't service the interrupt to clear
22149 + * it, we will never see another PMU interrupt edge.
22150 + */
22151 + goto reschedule;
22152 + }
22153 +
22154 + /* hey did we just resume? (because we don't get here unless we are
22155 + * running normally or the first call after resumption)
22156 + *
22157 + * pcf50606 resume is really really over now then.
22158 + */
22159 + if (pcf->suspend_state != PCF50606_SS_RUNNING) {
22160 + pcf->suspend_state = PCF50606_SS_RUNNING;
22161 +
22162 + /* peek at the IRQ reason, if power button then set a flag
22163 + * so that we do not signal the event to userspace
22164 + */
22165 + if (pcfirq[0] & (PCF50606_INT1_ONKEYF | PCF50606_INT1_ONKEYR)) {
22166 + pcf->suppress_onkey_events = 1;
22167 + dev_dbg(&pcf->client.dev,
22168 + "Wake by ONKEY, suppressing ONKEY events");
22169 + } else {
22170 + pcf->suppress_onkey_events = 0;
22171 + }
22172 + }
22173 +
22174 + if (!pcf->coldplug_done) {
22175 + DEBUGPC("PMU Coldplug init\n");
22176 +
22177 + /* we used SECOND to kick ourselves started -- turn it off */
22178 + pcfirq[0] &= ~PCF50606_INT1_SECOND;
22179 + reg_set_bit_mask(pcf, PCF50606_REG_INT1M, PCF50606_INT1_SECOND,
22180 + PCF50606_INT1_SECOND);
22181 +
22182 + /* coldplug the USB if present */
22183 + if (__reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON) {
22184 + /* Charger inserted */
22185 + DEBUGPC("COLD CHGINS ");
22186 + input_report_key(pcf->input_dev, KEY_BATTERY, 1);
22187 + apm_queue_event(APM_POWER_STATUS_CHANGE);
22188 + pcf->flags |= PCF50606_F_CHG_PRESENT;
22189 + if (pcf->pdata->cb)
22190 + pcf->pdata->cb(&pcf->client.dev,
22191 + PCF50606_FEAT_MBC,
22192 + PMU_EVT_INSERT);
22193 + }
22194 +
22195 + pcf->coldplug_done = 1;
22196 + }
22197 +
22198 +
22199 + dev_dbg(&pcf->client.dev, "INT1=0x%02x INT2=0x%02x INT3=0x%02x:",
22200 + pcfirq[0], pcfirq[1], pcfirq[2]);
22201 +
22202 + if (pcfirq[0] & PCF50606_INT1_ONKEYF) {
22203 + /* ONKEY falling edge (start of button press) */
22204 + pcf->flags |= PCF50606_F_PWR_PRESSED;
22205 + if (!pcf->suppress_onkey_events) {
22206 + DEBUGPC("ONKEYF ");
22207 + input_report_key(pcf->input_dev, KEY_POWER, 1);
22208 + } else {
22209 + DEBUGPC("ONKEYF(unreported) ");
22210 + }
22211 + }
22212 + if (pcfirq[0] & PCF50606_INT1_ONKEY1S) {
22213 + /* ONKEY pressed for more than 1 second */
22214 + pcf->onkey_seconds = 0;
22215 + DEBUGPC("ONKEY1S ");
22216 + /* Tell PMU we are taking care of this */
22217 + reg_set_bit_mask(pcf, PCF50606_REG_OOCC1,
22218 + PCF50606_OOCC1_TOTRST,
22219 + PCF50606_OOCC1_TOTRST);
22220 + /* enable SECOND interrupt (hz tick) */
22221 + reg_clear_bits(pcf, PCF50606_REG_INT1M, PCF50606_INT1_SECOND);
22222 + }
22223 + if (pcfirq[0] & PCF50606_INT1_ONKEYR) {
22224 + /* ONKEY rising edge (end of button press) */
22225 + pcf->flags &= ~PCF50606_F_PWR_PRESSED;
22226 + pcf->onkey_seconds = -1;
22227 + if (!pcf->suppress_onkey_events) {
22228 + DEBUGPC("ONKEYR ");
22229 + input_report_key(pcf->input_dev, KEY_POWER, 0);
22230 + } else {
22231 + DEBUGPC("ONKEYR(suppressed) ");
22232 + /* don't suppress any more power button events */
22233 + pcf->suppress_onkey_events = 0;
22234 + }
22235 + /* disable SECOND interrupt in case RTC didn't
22236 + * request it */
22237 + if (!(pcf->flags & PCF50606_F_RTC_SECOND))
22238 + reg_set_bit_mask(pcf, PCF50606_REG_INT1M,
22239 + PCF50606_INT1_SECOND,
22240 + PCF50606_INT1_SECOND);
22241 + }
22242 + if (pcfirq[0] & PCF50606_INT1_EXTONR) {
22243 + DEBUGPC("EXTONR ");
22244 + input_report_key(pcf->input_dev, KEY_POWER2, 1);
22245 + }
22246 + if (pcfirq[0] & PCF50606_INT1_EXTONF) {
22247 + DEBUGPC("EXTONF ");
22248 + input_report_key(pcf->input_dev, KEY_POWER2, 0);
22249 + }
22250 + if (pcfirq[0] & PCF50606_INT1_SECOND) {
22251 + DEBUGPC("SECOND ");
22252 + if (pcf->flags & PCF50606_F_RTC_SECOND)
22253 + rtc_update_irq(pcf->rtc, 1,
22254 + RTC_PF | RTC_IRQF);
22255 +
22256 + if (pcf->onkey_seconds >= 0 &&
22257 + pcf->flags & PCF50606_F_PWR_PRESSED) {
22258 + DEBUGPC("ONKEY_SECONDS(%u, OOCC1=0x%02x) ",
22259 + pcf->onkey_seconds,
22260 + reg_read(pcf, PCF50606_REG_OOCC1));
22261 + pcf->onkey_seconds++;
22262 + if (pcf->onkey_seconds >=
22263 + pcf->pdata->onkey_seconds_required) {
22264 + /* Ask init to do 'ctrlaltdel' */
22265 + /*
22266 + * currently Linux reacts badly to issuing a
22267 + * signal to PID #1 before init is started.
22268 + * What happens is that the next kernel thread
22269 + * to start, which is the JFFS2 Garbage
22270 + * collector in our case, gets the signal
22271 + * instead and proceeds to fail to fork --
22272 + * which is very bad. Therefore we confirm
22273 + * PID #1 exists before issuing the signal
22274 + */
22275 + if (find_task_by_pid(1)) {
22276 + kill_proc(1, SIGINT, 1);
22277 + DEBUGPC("SIGINT(init) ");
22278 + }
22279 + /* FIXME: what to do if userspace doesn't
22280 + * shut down? Do we want to force it? */
22281 + }
22282 + }
22283 + }
22284 + if (pcfirq[0] & PCF50606_INT1_ALARM) {
22285 + DEBUGPC("ALARM ");
22286 + if (pcf->pdata->used_features & PCF50606_FEAT_RTC)
22287 + rtc_update_irq(pcf->rtc, 1,
22288 + RTC_AF | RTC_IRQF);
22289 + }
22290 +
22291 + if (pcfirq[1] & PCF50606_INT2_CHGINS) {
22292 + /* Charger inserted */
22293 + DEBUGPC("CHGINS ");
22294 + input_report_key(pcf->input_dev, KEY_BATTERY, 1);
22295 + apm_queue_event(APM_POWER_STATUS_CHANGE);
22296 + pcf->flags |= PCF50606_F_CHG_PRESENT;
22297 + if (pcf->pdata->cb)
22298 + pcf->pdata->cb(&pcf->client.dev,
22299 + PCF50606_FEAT_MBC, PMU_EVT_INSERT);
22300 + /* FIXME: how to signal this to userspace */
22301 + }
22302 + if (pcfirq[1] & PCF50606_INT2_CHGRM) {
22303 + /* Charger removed */
22304 + DEBUGPC("CHGRM ");
22305 + input_report_key(pcf->input_dev, KEY_BATTERY, 0);
22306 + apm_queue_event(APM_POWER_STATUS_CHANGE);
22307 + pcf->flags &= ~(PCF50606_F_CHG_MASK|PCF50606_F_CHG_PRESENT);
22308 + if (pcf->pdata->cb)
22309 + pcf->pdata->cb(&pcf->client.dev,
22310 + PCF50606_FEAT_MBC, PMU_EVT_INSERT);
22311 + /* FIXME: how signal this to userspace */
22312 + }
22313 + if (pcfirq[1] & PCF50606_INT2_CHGFOK) {
22314 + /* Battery ready for fast charging */
22315 + DEBUGPC("CHGFOK ");
22316 + pcf->flags |= PCF50606_F_CHG_FOK;
22317 + /* FIXME: how to signal this to userspace */
22318 + }
22319 + if (pcfirq[1] & PCF50606_INT2_CHGERR) {
22320 + /* Error in charge mode */
22321 + DEBUGPC("CHGERR ");
22322 + pcf->flags |= PCF50606_F_CHG_ERR;
22323 + pcf->flags &= ~(PCF50606_F_CHG_FOK|PCF50606_F_CHG_READY);
22324 + /* FIXME: how to signal this to userspace */
22325 + }
22326 + if (pcfirq[1] & PCF50606_INT2_CHGFRDY) {
22327 + /* Fast charge completed */
22328 + DEBUGPC("CHGFRDY ");
22329 + pcf->flags |= PCF50606_F_CHG_READY;
22330 + pcf->flags &= ~PCF50606_F_CHG_FOK;
22331 + /* FIXME: how to signal this to userspace */
22332 + }
22333 + if (pcfirq[1] & PCF50606_INT2_CHGPROT) {
22334 + /* Charging protection interrupt */
22335 + DEBUGPC("CHGPROT ");
22336 + pcf->flags &= ~(PCF50606_F_CHG_FOK|PCF50606_F_CHG_READY);
22337 + /* FIXME: signal this to userspace */
22338 + }
22339 + if (pcfirq[1] & PCF50606_INT2_CHGWD10S) {
22340 + /* Charger watchdog will expire in 10 seconds */
22341 + DEBUGPC("CHGWD10S ");
22342 + reg_set_bit_mask(pcf, PCF50606_REG_OOCC1,
22343 + PCF50606_OOCC1_WDTRST,
22344 + PCF50606_OOCC1_WDTRST);
22345 + }
22346 + if (pcfirq[1] & PCF50606_INT2_CHGWDEXP) {
22347 + /* Charger watchdog expires */
22348 + DEBUGPC("CHGWDEXP ");
22349 + /* FIXME: how to signal this to userspace */
22350 + }
22351 +
22352 + if (pcfirq[2] & PCF50606_INT3_ADCRDY) {
22353 + /* ADC result ready */
22354 + DEBUGPC("ADCRDY ");
22355 + }
22356 + if (pcfirq[2] & PCF50606_INT3_ACDINS) {
22357 + /* Accessory insertion detected */
22358 + DEBUGPC("ACDINS ");
22359 + if (pcf->pdata->cb)
22360 + pcf->pdata->cb(&pcf->client.dev,
22361 + PCF50606_FEAT_ACD, PMU_EVT_INSERT);
22362 + }
22363 + if (pcfirq[2] & PCF50606_INT3_ACDREM) {
22364 + /* Accessory removal detected */
22365 + DEBUGPC("ACDREM ");
22366 + if (pcf->pdata->cb)
22367 + pcf->pdata->cb(&pcf->client.dev,
22368 + PCF50606_FEAT_ACD, PMU_EVT_REMOVE);
22369 + }
22370 + /* FIXME: TSCPRES */
22371 + if (pcfirq[2] & PCF50606_INT3_LOWBAT) {
22372 + if (__reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON) {
22373 + /*
22374 + * hey no need to freak out, we have some kind of
22375 + * valid charger power
22376 + */
22377 + DEBUGPC("(NO)BAT ");
22378 + } else {
22379 + /* Really low battery voltage, we have 8 seconds left */
22380 + DEBUGPC("LOWBAT ");
22381 + /*
22382 + * currently Linux reacts badly to issuing a signal to
22383 + * PID #1 before init is started. What happens is that
22384 + * the next kernel thread to start, which is the JFFS2
22385 + * Garbage collector in our case, gets the signal
22386 + * instead and proceeds to fail to fork -- which is
22387 + * very bad. Therefore we confirm PID #1 exists
22388 + * before issuing SPIGPWR
22389 + */
22390 + if (find_task_by_pid(1)) {
22391 + apm_queue_event(APM_LOW_BATTERY);
22392 + DEBUGPC("SIGPWR(init) ");
22393 + kill_proc(1, SIGPWR, 1);
22394 + } else
22395 + /*
22396 + * well, our situation is like this: we do not
22397 + * have any external power, we have a low
22398 + * battery and since PID #1 doesn't exist yet,
22399 + * we are early in the boot, likely before
22400 + * rootfs mount. We should just call it a day
22401 + */
22402 + apm_queue_event(APM_CRITICAL_SUSPEND);
22403 + }
22404 + /* Tell PMU we are taking care of this */
22405 + reg_set_bit_mask(pcf, PCF50606_REG_OOCC1,
22406 + PCF50606_OOCC1_TOTRST,
22407 + PCF50606_OOCC1_TOTRST);
22408 + }
22409 + if (pcfirq[2] & PCF50606_INT3_HIGHTMP) {
22410 + /* High temperature */
22411 + DEBUGPC("HIGHTMP ");
22412 + apm_queue_event(APM_CRITICAL_SUSPEND);
22413 + }
22414 +
22415 + DEBUGPC("\n");
22416 +
22417 +bail:
22418 + pcf->working = 0;
22419 + input_sync(pcf->input_dev);
22420 + put_device(&pcf->client.dev);
22421 + mutex_unlock(&pcf->working_lock);
22422 +
22423 + return;
22424 +
22425 +reschedule:
22426 +
22427 + if ((pcf->suspend_state != PCF50606_SS_STARTING_SUSPEND) &&
22428 + (pcf->suspend_state != PCF50606_SS_COMPLETED_SUSPEND)) {
22429 + msleep(10);
22430 + dev_info(&pcf->client.dev, "rescheduling interrupt service\n");
22431 + }
22432 + if (!schedule_work(&pcf->work))
22433 + dev_err(&pcf->client.dev, "int service reschedule failed\n");
22434 +
22435 + /* we don't put the device here, hold it for next time */
22436 + mutex_unlock(&pcf->working_lock);
22437 +}
22438 +
22439 +static irqreturn_t pcf50606_irq(int irq, void *_pcf)
22440 +{
22441 + struct pcf50606_data *pcf = _pcf;
22442 +
22443 + dev_dbg(&pcf->client.dev, "entering(irq=%u, pcf=%p): scheduling work\n",
22444 + irq, _pcf);
22445 + get_device(&pcf->client.dev);
22446 + if (!schedule_work(&pcf->work) && !pcf->working)
22447 + dev_err(&pcf->client.dev, "pcf irq work already queued.\n");
22448 +
22449 + return IRQ_HANDLED;
22450 +}
22451 +
22452 +static u_int16_t adc_to_batt_millivolts(u_int16_t adc)
22453 +{
22454 + u_int16_t mvolts;
22455 +
22456 + mvolts = (adc * 6000) / 1024;
22457 +
22458 + return mvolts;
22459 +}
22460 +
22461 +#define BATTVOLT_SCALE_START 2800
22462 +#define BATTVOLT_SCALE_END 4200
22463 +#define BATTVOLT_SCALE_DIVIDER ((BATTVOLT_SCALE_END - BATTVOLT_SCALE_START)/100)
22464 +
22465 +static u_int8_t battvolt_scale(u_int16_t battvolt)
22466 +{
22467 + /* FIXME: this linear scale is completely bogus */
22468 + u_int16_t battvolt_relative = battvolt - BATTVOLT_SCALE_START;
22469 + unsigned int percent = battvolt_relative / BATTVOLT_SCALE_DIVIDER;
22470 +
22471 + return percent;
22472 +}
22473 +
22474 +u_int16_t pcf50606_battvolt(struct pcf50606_data *pcf)
22475 +{
22476 + u_int16_t adc;
22477 + adc = adc_read(pcf, PCF50606_ADCMUX_BATVOLT_RES, NULL);
22478 +
22479 + return adc_to_batt_millivolts(adc);
22480 +}
22481 +EXPORT_SYMBOL_GPL(pcf50606_battvolt);
22482 +
22483 +static ssize_t show_battvolt(struct device *dev, struct device_attribute *attr,
22484 + char *buf)
22485 +{
22486 + struct i2c_client *client = to_i2c_client(dev);
22487 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22488 +
22489 + return sprintf(buf, "%u\n", pcf50606_battvolt(pcf));
22490 +}
22491 +static DEVICE_ATTR(battvolt, S_IRUGO | S_IWUSR, show_battvolt, NULL);
22492 +
22493 +static int reg_id_by_name(const char *name)
22494 +{
22495 + int reg_id;
22496 +
22497 + if (!strcmp(name, "voltage_dcd"))
22498 + reg_id = PCF50606_REGULATOR_DCD;
22499 + else if (!strcmp(name, "voltage_dcde"))
22500 + reg_id = PCF50606_REGULATOR_DCDE;
22501 + else if (!strcmp(name, "voltage_dcud"))
22502 + reg_id = PCF50606_REGULATOR_DCUD;
22503 + else if (!strcmp(name, "voltage_d1reg"))
22504 + reg_id = PCF50606_REGULATOR_D1REG;
22505 + else if (!strcmp(name, "voltage_d2reg"))
22506 + reg_id = PCF50606_REGULATOR_D2REG;
22507 + else if (!strcmp(name, "voltage_d3reg"))
22508 + reg_id = PCF50606_REGULATOR_D3REG;
22509 + else if (!strcmp(name, "voltage_lpreg"))
22510 + reg_id = PCF50606_REGULATOR_LPREG;
22511 + else if (!strcmp(name, "voltage_ioreg"))
22512 + reg_id = PCF50606_REGULATOR_IOREG;
22513 + else
22514 + reg_id = -1;
22515 +
22516 + return reg_id;
22517 +}
22518 +
22519 +static ssize_t show_vreg(struct device *dev, struct device_attribute *attr,
22520 + char *buf)
22521 +{
22522 + struct i2c_client *client = to_i2c_client(dev);
22523 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22524 + unsigned int reg_id;
22525 +
22526 + reg_id = reg_id_by_name(attr->attr.name);
22527 + if (reg_id < 0)
22528 + return 0;
22529 +
22530 + if (pcf50606_onoff_get(pcf, reg_id) > 0)
22531 + return sprintf(buf, "%u\n", pcf50606_voltage_get(pcf, reg_id));
22532 + else
22533 + return strlcpy(buf, "0\n", PAGE_SIZE);
22534 +}
22535 +
22536 +static ssize_t set_vreg(struct device *dev, struct device_attribute *attr,
22537 + const char *buf, size_t count)
22538 +{
22539 + struct i2c_client *client = to_i2c_client(dev);
22540 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22541 + unsigned long mvolts = simple_strtoul(buf, NULL, 10);
22542 + unsigned int reg_id;
22543 +
22544 + reg_id = reg_id_by_name(attr->attr.name);
22545 + if (reg_id < 0)
22546 + return -EIO;
22547 +
22548 + dev_dbg(dev, "attempting to set %s(%d) to %lu mvolts\n",
22549 + attr->attr.name, reg_id, mvolts);
22550 +
22551 + if (mvolts == 0) {
22552 + pcf50606_onoff_set(pcf, reg_id, 0);
22553 + } else {
22554 + if (pcf50606_voltage_set(pcf, reg_id, mvolts) < 0) {
22555 + dev_warn(dev, "refusing to set %s(%d) to %lu mvolts "
22556 + "(max=%u)\n", attr->attr.name, reg_id, mvolts,
22557 + pcf->pdata->rails[reg_id].voltage.max);
22558 + return -EINVAL;
22559 + }
22560 + pcf50606_onoff_set(pcf, reg_id, 1);
22561 + }
22562 +
22563 + return count;
22564 +}
22565 +
22566 +static DEVICE_ATTR(voltage_dcd, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
22567 +static DEVICE_ATTR(voltage_dcde, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
22568 +static DEVICE_ATTR(voltage_dcud, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
22569 +static DEVICE_ATTR(voltage_d1reg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
22570 +static DEVICE_ATTR(voltage_d2reg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
22571 +static DEVICE_ATTR(voltage_d3reg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
22572 +static DEVICE_ATTR(voltage_lpreg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
22573 +static DEVICE_ATTR(voltage_ioreg, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
22574 +
22575 +/***********************************************************************
22576 + * Charger Control
22577 + ***********************************************************************/
22578 +
22579 +/* Enable/disable fast charging (500mA in the GTA01) */
22580 +void pcf50606_charge_fast(struct pcf50606_data *pcf, int on)
22581 +{
22582 + if (!(pcf->pdata->used_features & PCF50606_FEAT_MBC))
22583 + return;
22584 +
22585 + if (on) {
22586 + /* We can allow PCF to automatically charge
22587 + * using Ifast */
22588 + pcf->flags |= PCF50606_F_CHG_FAST;
22589 + reg_set_bit_mask(pcf, PCF50606_REG_MBCC1,
22590 + PCF50606_MBCC1_AUTOFST,
22591 + PCF50606_MBCC1_AUTOFST);
22592 + } else {
22593 + pcf->flags &= ~PCF50606_F_CHG_FAST;
22594 + /* disable automatic fast-charge */
22595 + reg_clear_bits(pcf, PCF50606_REG_MBCC1,
22596 + PCF50606_MBCC1_AUTOFST);
22597 + /* switch to idle mode to abort existing charge
22598 + * process */
22599 + reg_set_bit_mask(pcf, PCF50606_REG_MBCC1,
22600 + PCF50606_MBCC1_CHGMOD_MASK,
22601 + PCF50606_MBCC1_CHGMOD_IDLE);
22602 + }
22603 +}
22604 +EXPORT_SYMBOL_GPL(pcf50606_charge_fast);
22605 +
22606 +static inline u_int16_t adc_to_rntc(struct pcf50606_data *pcf, u_int16_t adc)
22607 +{
22608 + u_int32_t r_ntc = (adc * (u_int32_t)pcf->pdata->r_fix_batt)
22609 + / (1023 - adc);
22610 +
22611 + return r_ntc;
22612 +}
22613 +
22614 +static inline int16_t rntc_to_temp(u_int16_t rntc)
22615 +{
22616 + int i;
22617 +
22618 + for (i = 0; i < ARRAY_SIZE(ntc_table_10k_3370B); i++) {
22619 + if (rntc > ntc_table_10k_3370B[i])
22620 + return i - 10; /* First element is -10 */
22621 + }
22622 + return -99; /* Below our range */
22623 +}
22624 +
22625 +static ssize_t show_battemp(struct device *dev, struct device_attribute *attr,
22626 + char *buf)
22627 +{
22628 + struct i2c_client *client = to_i2c_client(dev);
22629 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22630 + u_int16_t adc;
22631 +
22632 + adc = adc_read(pcf, PCF50606_ADCMUX_BATTEMP, NULL);
22633 +
22634 + return sprintf(buf, "%d\n", rntc_to_temp(adc_to_rntc(pcf, adc)));
22635 +}
22636 +static DEVICE_ATTR(battemp, S_IRUGO | S_IWUSR, show_battemp, NULL);
22637 +
22638 +static inline int16_t adc_to_chg_milliamps(struct pcf50606_data *pcf,
22639 + u_int16_t adc_adcin1,
22640 + u_int16_t adc_batvolt)
22641 +{
22642 + int32_t res = (adc_adcin1 - adc_batvolt) * 2400;
22643 + return (res * 1000) / (pcf->pdata->r_sense_milli * 1024);
22644 +}
22645 +
22646 +static ssize_t show_chgcur(struct device *dev, struct device_attribute *attr,
22647 + char *buf)
22648 +{
22649 + struct i2c_client *client = to_i2c_client(dev);
22650 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22651 + u_int16_t adc_batvolt, adc_adcin1;
22652 + int16_t ma;
22653 +
22654 + adc_batvolt = adc_read(pcf, PCF50606_ADCMUX_BATVOLT_ADCIN1,
22655 + &adc_adcin1);
22656 + ma = adc_to_chg_milliamps(pcf, adc_adcin1, adc_batvolt);
22657 +
22658 + return sprintf(buf, "%d\n", ma);
22659 +}
22660 +static DEVICE_ATTR(chgcur, S_IRUGO | S_IWUSR, show_chgcur, NULL);
22661 +
22662 +static const char *chgmode_names[] = {
22663 + [PCF50606_MBCC1_CHGMOD_QUAL] = "qualification",
22664 + [PCF50606_MBCC1_CHGMOD_PRE] = "pre",
22665 + [PCF50606_MBCC1_CHGMOD_TRICKLE] = "trickle",
22666 + [PCF50606_MBCC1_CHGMOD_FAST_CCCV] = "fast_cccv",
22667 + [PCF50606_MBCC1_CHGMOD_FAST_NOCC] = "fast_nocc",
22668 + [PCF50606_MBCC1_CHGMOD_FAST_NOCV] = "fast_nocv",
22669 + [PCF50606_MBCC1_CHGMOD_FAST_SW] = "fast_switch",
22670 + [PCF50606_MBCC1_CHGMOD_IDLE] = "idle",
22671 +};
22672 +
22673 +static ssize_t show_chgmode(struct device *dev, struct device_attribute *attr,
22674 + char *buf)
22675 +{
22676 + struct i2c_client *client = to_i2c_client(dev);
22677 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22678 + u_int8_t mbcc1 = reg_read(pcf, PCF50606_REG_MBCC1);
22679 + u_int8_t chgmod = (mbcc1 & PCF50606_MBCC1_CHGMOD_MASK);
22680 +
22681 + return sprintf(buf, "%s\n", chgmode_names[chgmod]);
22682 +}
22683 +
22684 +static ssize_t set_chgmode(struct device *dev, struct device_attribute *attr,
22685 + const char *buf, size_t count)
22686 +{
22687 + struct i2c_client *client = to_i2c_client(dev);
22688 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22689 + u_int8_t mbcc1 = reg_read(pcf, PCF50606_REG_MBCC1);
22690 +
22691 + mbcc1 &= ~PCF50606_MBCC1_CHGMOD_MASK;
22692 +
22693 + if (!strcmp(buf, "qualification"))
22694 + mbcc1 |= PCF50606_MBCC1_CHGMOD_QUAL;
22695 + else if (!strcmp(buf, "pre"))
22696 + mbcc1 |= PCF50606_MBCC1_CHGMOD_PRE;
22697 + else if (!strcmp(buf, "trickle"))
22698 + mbcc1 |= PCF50606_MBCC1_CHGMOD_TRICKLE;
22699 + else if (!strcmp(buf, "fast_cccv"))
22700 + mbcc1 |= PCF50606_MBCC1_CHGMOD_FAST_CCCV;
22701 + /* We don't allow the other fast modes for security reasons */
22702 + else if (!strcmp(buf, "idle"))
22703 + mbcc1 |= PCF50606_MBCC1_CHGMOD_IDLE;
22704 + else
22705 + return -EINVAL;
22706 +
22707 + reg_write(pcf, PCF50606_REG_MBCC1, mbcc1);
22708 +
22709 + return count;
22710 +}
22711 +
22712 +static DEVICE_ATTR(chgmode, S_IRUGO | S_IWUSR, show_chgmode, set_chgmode);
22713 +
22714 +static const char *chgstate_names[] = {
22715 + [PCF50606_B_CHG_FAST] = "fast_enabled",
22716 + [PCF50606_B_CHG_PRESENT] = "present",
22717 + [PCF50606_B_CHG_FOK] = "fast_ok",
22718 + [PCF50606_B_CHG_ERR] = "error",
22719 + [PCF50606_B_CHG_PROT] = "protection",
22720 + [PCF50606_B_CHG_READY] = "ready",
22721 +};
22722 +
22723 +static ssize_t show_chgstate(struct device *dev, struct device_attribute *attr,
22724 + char *buf)
22725 +{
22726 + struct i2c_client *client = to_i2c_client(dev);
22727 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22728 + char *b = buf;
22729 + int i;
22730 +
22731 + for (i = 0; i < 32; i++)
22732 + if (pcf->flags & (1 << i) && i < ARRAY_SIZE(chgstate_names))
22733 + b += sprintf(b, "%s ", chgstate_names[i]);
22734 +
22735 + if (b > buf)
22736 + b += sprintf(b, "\n");
22737 +
22738 + return b - buf;
22739 +}
22740 +static DEVICE_ATTR(chgstate, S_IRUGO | S_IWUSR, show_chgstate, NULL);
22741 +
22742 +/***********************************************************************
22743 + * APM emulation
22744 + ***********************************************************************/
22745 +
22746 +static void pcf50606_get_power_status(struct apm_power_info *info)
22747 +{
22748 + struct pcf50606_data *pcf = pcf50606_global;
22749 + u_int8_t mbcc1 = reg_read(pcf, PCF50606_REG_MBCC1);
22750 + u_int8_t chgmod = mbcc1 & PCF50606_MBCC1_CHGMOD_MASK;
22751 + u_int16_t battvolt = pcf50606_battvolt(pcf);
22752 +
22753 + if (reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON)
22754 + info->ac_line_status = APM_AC_ONLINE;
22755 + else
22756 + info->ac_line_status = APM_AC_OFFLINE;
22757 +
22758 + switch (chgmod) {
22759 + case PCF50606_MBCC1_CHGMOD_QUAL:
22760 + case PCF50606_MBCC1_CHGMOD_PRE:
22761 + case PCF50606_MBCC1_CHGMOD_IDLE:
22762 + info->battery_life = battvolt_scale(battvolt);
22763 + break;
22764 + default:
22765 + info->battery_status = APM_BATTERY_STATUS_CHARGING;
22766 + info->battery_flag = APM_BATTERY_FLAG_CHARGING;
22767 + break;
22768 + }
22769 +}
22770 +
22771 +/***********************************************************************
22772 + * Battery driver interface
22773 + ***********************************************************************/
22774 +static int pcf50606_bat_get_property(struct power_supply *psy,
22775 + enum power_supply_property psp,
22776 + union power_supply_propval *val)
22777 +{
22778 + u_int16_t adc, adc_adcin1;
22779 + u_int8_t mbcc1, chgmod;
22780 + struct pcf50606_data *pcf = pcf50606_global;
22781 + int ret = 0;
22782 +
22783 + switch (psp) {
22784 +
22785 + case POWER_SUPPLY_PROP_STATUS:
22786 + if (!(reg_read(pcf, PCF50606_REG_OOCS) & PCF50606_OOCS_EXTON)) {
22787 + /* No charger, clearly we're discharging then */
22788 + val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
22789 + } else {
22790 +
22791 + /* We have a charger present, get charge mode */
22792 + mbcc1 = reg_read(pcf, PCF50606_REG_MBCC1);
22793 + chgmod = (mbcc1 & PCF50606_MBCC1_CHGMOD_MASK);
22794 + switch (chgmod) {
22795 +
22796 + /* TODO: How to determine POWER_SUPPLY_STATUS_FULL? */
22797 +
22798 + case PCF50606_MBCC1_CHGMOD_QUAL:
22799 + case PCF50606_MBCC1_CHGMOD_PRE:
22800 + case PCF50606_MBCC1_CHGMOD_IDLE:
22801 + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
22802 + break;
22803 +
22804 + case PCF50606_MBCC1_CHGMOD_TRICKLE:
22805 + case PCF50606_MBCC1_CHGMOD_FAST_CCCV:
22806 + case PCF50606_MBCC1_CHGMOD_FAST_NOCC:
22807 + case PCF50606_MBCC1_CHGMOD_FAST_NOCV:
22808 + case PCF50606_MBCC1_CHGMOD_FAST_SW:
22809 + val->intval = POWER_SUPPLY_STATUS_CHARGING;
22810 + break;
22811 +
22812 + default:
22813 + val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
22814 + break;
22815 +
22816 + }
22817 + }
22818 +
22819 + case POWER_SUPPLY_PROP_PRESENT:
22820 + val->intval = 1; /* Must be, or the magic smoke comes out */
22821 + break;
22822 +
22823 + case POWER_SUPPLY_PROP_ONLINE:
22824 + val->intval = !!(reg_read(pcf, PCF50606_REG_OOCS) &
22825 + PCF50606_OOCS_EXTON);
22826 + break;
22827 +
22828 + case POWER_SUPPLY_PROP_VOLTAGE_NOW:
22829 + adc = adc_read(pcf, PCF50606_ADCMUX_BATVOLT_RES, NULL);
22830 + /* (adc * 6000000) / 1024 == (adc * 46875) / 8 */
22831 + val->intval = (adc * 46875) / 8;
22832 + break;
22833 +
22834 + case POWER_SUPPLY_PROP_CURRENT_NOW:
22835 + adc = adc_read(pcf, PCF50606_ADCMUX_BATVOLT_ADCIN1,
22836 + &adc_adcin1);
22837 + val->intval = adc_to_chg_milliamps(pcf, adc_adcin1, adc) * 1000;
22838 + break;
22839 +
22840 + case POWER_SUPPLY_PROP_TEMP:
22841 + adc = adc_read(pcf, PCF50606_ADCMUX_BATTEMP, NULL);
22842 + val->intval = rntc_to_temp(adc_to_rntc(pcf, adc)) * 10;
22843 + break;
22844 +
22845 + case POWER_SUPPLY_PROP_CAPACITY:
22846 + val->intval = battvolt_scale(pcf50606_battvolt(pcf));
22847 + break;
22848 +
22849 + default:
22850 + ret = -EINVAL;
22851 + break;
22852 + }
22853 +
22854 + return ret;
22855 +}
22856 +
22857 +/***********************************************************************
22858 + * RTC
22859 + ***********************************************************************/
22860 +
22861 +struct pcf50606_time {
22862 + u_int8_t sec;
22863 + u_int8_t min;
22864 + u_int8_t hour;
22865 + u_int8_t wkday;
22866 + u_int8_t day;
22867 + u_int8_t month;
22868 + u_int8_t year;
22869 +};
22870 +
22871 +static void pcf2rtc_time(struct rtc_time *rtc, struct pcf50606_time *pcf)
22872 +{
22873 + rtc->tm_sec = BCD2BIN(pcf->sec);
22874 + rtc->tm_min = BCD2BIN(pcf->min);
22875 + rtc->tm_hour = BCD2BIN(pcf->hour);
22876 + rtc->tm_wday = BCD2BIN(pcf->wkday);
22877 + rtc->tm_mday = BCD2BIN(pcf->day);
22878 + rtc->tm_mon = BCD2BIN(pcf->month);
22879 + rtc->tm_year = BCD2BIN(pcf->year) + 100;
22880 +}
22881 +
22882 +static void rtc2pcf_time(struct pcf50606_time *pcf, struct rtc_time *rtc)
22883 +{
22884 + pcf->sec = BIN2BCD(rtc->tm_sec);
22885 + pcf->min = BIN2BCD(rtc->tm_min);
22886 + pcf->hour = BIN2BCD(rtc->tm_hour);
22887 + pcf->wkday = BIN2BCD(rtc->tm_wday);
22888 + pcf->day = BIN2BCD(rtc->tm_mday);
22889 + pcf->month = BIN2BCD(rtc->tm_mon);
22890 + pcf->year = BIN2BCD(rtc->tm_year - 100);
22891 +}
22892 +
22893 +static int pcf50606_rtc_ioctl(struct device *dev, unsigned int cmd,
22894 + unsigned long arg)
22895 +{
22896 + struct i2c_client *client = to_i2c_client(dev);
22897 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22898 +
22899 + switch (cmd) {
22900 + case RTC_AIE_OFF:
22901 + /* disable the alarm interrupt */
22902 + reg_set_bit_mask(pcf, PCF50606_REG_INT1M,
22903 + PCF50606_INT1_ALARM, PCF50606_INT1_ALARM);
22904 + return 0;
22905 + case RTC_AIE_ON:
22906 + /* enable the alarm interrupt */
22907 + reg_clear_bits(pcf, PCF50606_REG_INT1M, PCF50606_INT1_ALARM);
22908 + return 0;
22909 + case RTC_PIE_OFF:
22910 + /* disable periodic interrupt (hz tick) */
22911 + pcf->flags &= ~PCF50606_F_RTC_SECOND;
22912 + reg_set_bit_mask(pcf, PCF50606_REG_INT1M,
22913 + PCF50606_INT1_SECOND, PCF50606_INT1_SECOND);
22914 + return 0;
22915 + case RTC_PIE_ON:
22916 + /* ensable periodic interrupt (hz tick) */
22917 + pcf->flags |= PCF50606_F_RTC_SECOND;
22918 + reg_clear_bits(pcf, PCF50606_REG_INT1M, PCF50606_INT1_SECOND);
22919 + return 0;
22920 + }
22921 + return -ENOIOCTLCMD;
22922 +}
22923 +
22924 +static int pcf50606_rtc_read_time(struct device *dev, struct rtc_time *tm)
22925 +{
22926 + struct i2c_client *client = to_i2c_client(dev);
22927 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22928 + struct pcf50606_time pcf_tm;
22929 +
22930 + mutex_lock(&pcf->lock);
22931 + pcf_tm.sec = __reg_read(pcf, PCF50606_REG_RTCSC);
22932 + pcf_tm.min = __reg_read(pcf, PCF50606_REG_RTCMN);
22933 + pcf_tm.hour = __reg_read(pcf, PCF50606_REG_RTCHR);
22934 + pcf_tm.wkday = __reg_read(pcf, PCF50606_REG_RTCWD);
22935 + pcf_tm.day = __reg_read(pcf, PCF50606_REG_RTCDT);
22936 + pcf_tm.month = __reg_read(pcf, PCF50606_REG_RTCMT);
22937 + pcf_tm.year = __reg_read(pcf, PCF50606_REG_RTCYR);
22938 + mutex_unlock(&pcf->lock);
22939 +
22940 + dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n",
22941 + pcf_tm.day, pcf_tm.month, pcf_tm.year,
22942 + pcf_tm.hour, pcf_tm.min, pcf_tm.sec);
22943 +
22944 + pcf2rtc_time(tm, &pcf_tm);
22945 +
22946 + dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
22947 + tm->tm_mday, tm->tm_mon, tm->tm_year,
22948 + tm->tm_hour, tm->tm_min, tm->tm_sec);
22949 +
22950 + return 0;
22951 +}
22952 +
22953 +static int pcf50606_rtc_set_time(struct device *dev, struct rtc_time *tm)
22954 +{
22955 + struct i2c_client *client = to_i2c_client(dev);
22956 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22957 + struct pcf50606_time pcf_tm;
22958 + u_int8_t int1m;
22959 +
22960 + dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
22961 + tm->tm_mday, tm->tm_mon, tm->tm_year,
22962 + tm->tm_hour, tm->tm_min, tm->tm_sec);
22963 + rtc2pcf_time(&pcf_tm, tm);
22964 + dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n",
22965 + pcf_tm.day, pcf_tm.month, pcf_tm.year,
22966 + pcf_tm.hour, pcf_tm.min, pcf_tm.sec);
22967 +
22968 + mutex_lock(&pcf->lock);
22969 +
22970 + /* disable SECOND interrupt */
22971 + int1m = __reg_read(pcf, PCF50606_REG_INT1M);
22972 + __reg_write(pcf, PCF50606_REG_INT1M, int1m | PCF50606_INT1_SECOND);
22973 +
22974 + __reg_write(pcf, PCF50606_REG_RTCSC, pcf_tm.sec);
22975 + __reg_write(pcf, PCF50606_REG_RTCMN, pcf_tm.min);
22976 + __reg_write(pcf, PCF50606_REG_RTCHR, pcf_tm.hour);
22977 + __reg_write(pcf, PCF50606_REG_RTCWD, pcf_tm.wkday);
22978 + __reg_write(pcf, PCF50606_REG_RTCDT, pcf_tm.day);
22979 + __reg_write(pcf, PCF50606_REG_RTCMT, pcf_tm.month);
22980 + __reg_write(pcf, PCF50606_REG_RTCYR, pcf_tm.year);
22981 +
22982 + /* restore INT1M, potentially re-enable SECOND interrupt */
22983 + __reg_write(pcf, PCF50606_REG_INT1M, int1m);
22984 +
22985 + mutex_unlock(&pcf->lock);
22986 +
22987 + return 0;
22988 +}
22989 +
22990 +static int pcf50606_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
22991 +{
22992 + struct i2c_client *client = to_i2c_client(dev);
22993 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
22994 + struct pcf50606_time pcf_tm;
22995 +
22996 + mutex_lock(&pcf->lock);
22997 + alrm->enabled =
22998 + __reg_read(pcf, PCF50606_REG_INT1M) & PCF50606_INT1_ALARM
22999 + ? 0 : 1;
23000 + pcf_tm.sec = __reg_read(pcf, PCF50606_REG_RTCSCA);
23001 + pcf_tm.min = __reg_read(pcf, PCF50606_REG_RTCMNA);
23002 + pcf_tm.hour = __reg_read(pcf, PCF50606_REG_RTCHRA);
23003 + pcf_tm.wkday = __reg_read(pcf, PCF50606_REG_RTCWDA);
23004 + pcf_tm.day = __reg_read(pcf, PCF50606_REG_RTCDTA);
23005 + pcf_tm.month = __reg_read(pcf, PCF50606_REG_RTCMTA);
23006 + pcf_tm.year = __reg_read(pcf, PCF50606_REG_RTCYRA);
23007 + mutex_unlock(&pcf->lock);
23008 +
23009 + pcf2rtc_time(&alrm->time, &pcf_tm);
23010 +
23011 + return 0;
23012 +}
23013 +
23014 +static int pcf50606_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
23015 +{
23016 + struct i2c_client *client = to_i2c_client(dev);
23017 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
23018 + struct pcf50606_time pcf_tm;
23019 + u_int8_t irqmask;
23020 +
23021 + rtc2pcf_time(&pcf_tm, &alrm->time);
23022 +
23023 + mutex_lock(&pcf->lock);
23024 +
23025 + /* disable alarm interrupt */
23026 + irqmask = __reg_read(pcf, PCF50606_REG_INT1M);
23027 + irqmask |= PCF50606_INT1_ALARM;
23028 + __reg_write(pcf, PCF50606_REG_INT1M, irqmask);
23029 +
23030 + __reg_write(pcf, PCF50606_REG_RTCSCA, pcf_tm.sec);
23031 + __reg_write(pcf, PCF50606_REG_RTCMNA, pcf_tm.min);
23032 + __reg_write(pcf, PCF50606_REG_RTCHRA, pcf_tm.hour);
23033 + __reg_write(pcf, PCF50606_REG_RTCWDA, pcf_tm.wkday);
23034 + __reg_write(pcf, PCF50606_REG_RTCDTA, pcf_tm.day);
23035 + __reg_write(pcf, PCF50606_REG_RTCMTA, pcf_tm.month);
23036 + __reg_write(pcf, PCF50606_REG_RTCYRA, pcf_tm.year);
23037 +
23038 + if (alrm->enabled) {
23039 + /* (re-)enaable alarm interrupt */
23040 + irqmask = __reg_read(pcf, PCF50606_REG_INT1M);
23041 + irqmask &= ~PCF50606_INT1_ALARM;
23042 + __reg_write(pcf, PCF50606_REG_INT1M, irqmask);
23043 + }
23044 +
23045 + mutex_unlock(&pcf->lock);
23046 +
23047 + /* FIXME */
23048 + return 0;
23049 +}
23050 +
23051 +static struct rtc_class_ops pcf50606_rtc_ops = {
23052 + .ioctl = pcf50606_rtc_ioctl,
23053 + .read_time = pcf50606_rtc_read_time,
23054 + .set_time = pcf50606_rtc_set_time,
23055 + .read_alarm = pcf50606_rtc_read_alarm,
23056 + .set_alarm = pcf50606_rtc_set_alarm,
23057 +};
23058 +
23059 +/***********************************************************************
23060 + * Watchdog
23061 + ***********************************************************************/
23062 +
23063 +static void pcf50606_wdt_start(struct pcf50606_data *pcf)
23064 +{
23065 + reg_set_bit_mask(pcf, PCF50606_REG_OOCC1, PCF50606_OOCC1_WDTRST,
23066 + PCF50606_OOCC1_WDTRST);
23067 +}
23068 +
23069 +static void pcf50606_wdt_stop(struct pcf50606_data *pcf)
23070 +{
23071 + reg_clear_bits(pcf, PCF50606_REG_OOCS, PCF50606_OOCS_WDTEXP);
23072 +}
23073 +
23074 +static void pcf50606_wdt_keepalive(struct pcf50606_data *pcf)
23075 +{
23076 + pcf50606_wdt_start(pcf);
23077 +}
23078 +
23079 +static int pcf50606_wdt_open(struct inode *inode, struct file *file)
23080 +{
23081 + struct pcf50606_data *pcf = pcf50606_global;
23082 +
23083 + file->private_data = pcf;
23084 +
23085 + /* start the timer */
23086 + pcf50606_wdt_start(pcf);
23087 +
23088 + return nonseekable_open(inode, file);
23089 +}
23090 +
23091 +static int pcf50606_wdt_release(struct inode *inode, struct file *file)
23092 +{
23093 + struct pcf50606_data *pcf = file->private_data;
23094 +
23095 + if (pcf->allow_close == CLOSE_STATE_ALLOW)
23096 + pcf50606_wdt_stop(pcf);
23097 + else {
23098 + printk(KERN_CRIT "Unexpected close, not stopping watchdog!\n");
23099 + pcf50606_wdt_keepalive(pcf);
23100 + }
23101 +
23102 + pcf->allow_close = CLOSE_STATE_NOT;
23103 +
23104 + return 0;
23105 +}
23106 +
23107 +static ssize_t pcf50606_wdt_write(struct file *file, const char __user *data,
23108 + size_t len, loff_t *ppos)
23109 +{
23110 + struct pcf50606_data *pcf = file->private_data;
23111 + if (len) {
23112 + size_t i;
23113 +
23114 + for (i = 0; i != len; i++) {
23115 + char c;
23116 + if (get_user(c, data + i))
23117 + return -EFAULT;
23118 + if (c == 'V')
23119 + pcf->allow_close = CLOSE_STATE_ALLOW;
23120 + }
23121 + pcf50606_wdt_keepalive(pcf);
23122 + }
23123 +
23124 + return len;
23125 +}
23126 +
23127 +static struct watchdog_info pcf50606_wdt_ident = {
23128 + .options = WDIOF_MAGICCLOSE,
23129 + .firmware_version = 0,
23130 + .identity = "PCF50606 Watchdog",
23131 +};
23132 +
23133 +static int pcf50606_wdt_ioctl(struct inode *inode, struct file *file,
23134 + unsigned int cmd, unsigned long arg)
23135 +{
23136 + struct pcf50606_data *pcf = file->private_data;
23137 + void __user *argp = (void __user *)arg;
23138 + int __user *p = argp;
23139 +
23140 + switch (cmd) {
23141 + case WDIOC_GETSUPPORT:
23142 + return copy_to_user(argp, &pcf50606_wdt_ident,
23143 + sizeof(pcf50606_wdt_ident)) ? -EFAULT : 0;
23144 + break;
23145 + case WDIOC_GETSTATUS:
23146 + case WDIOC_GETBOOTSTATUS:
23147 + return put_user(0, p);
23148 + case WDIOC_KEEPALIVE:
23149 + pcf50606_wdt_keepalive(pcf);
23150 + return 0;
23151 + case WDIOC_GETTIMEOUT:
23152 + return put_user(8, p);
23153 + default:
23154 + return -ENOIOCTLCMD;
23155 + }
23156 +}
23157 +
23158 +static struct file_operations pcf50606_wdt_fops = {
23159 + .owner = THIS_MODULE,
23160 + .llseek = no_llseek,
23161 + .write = &pcf50606_wdt_write,
23162 + .ioctl = &pcf50606_wdt_ioctl,
23163 + .open = &pcf50606_wdt_open,
23164 + .release = &pcf50606_wdt_release,
23165 +};
23166 +
23167 +static struct miscdevice pcf50606_wdt_miscdev = {
23168 + .minor = WATCHDOG_MINOR,
23169 + .name = "watchdog",
23170 + .fops = &pcf50606_wdt_fops,
23171 +};
23172 +
23173 +/***********************************************************************
23174 + * PWM
23175 + ***********************************************************************/
23176 +
23177 +static const char *pwm_dc_table[] = {
23178 + "0/16", "1/16", "2/16", "3/16",
23179 + "4/16", "5/16", "6/16", "7/16",
23180 + "8/16", "9/16", "10/16", "11/16",
23181 + "12/16", "13/16", "14/16", "15/16",
23182 +};
23183 +
23184 +static ssize_t show_pwm_dc(struct device *dev, struct device_attribute *attr,
23185 + char *buf)
23186 +{
23187 + struct i2c_client *client = to_i2c_client(dev);
23188 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
23189 + u_int8_t val;
23190 +
23191 + val = reg_read(pcf, PCF50606_REG_PWMC1) >> PCF50606_PWMC1_DC_SHIFT;
23192 + val &= 0xf;
23193 +
23194 + return sprintf(buf, "%s\n", pwm_dc_table[val]);
23195 +}
23196 +
23197 +static ssize_t set_pwm_dc(struct device *dev, struct device_attribute *attr,
23198 + const char *buf, size_t count)
23199 +{
23200 + struct i2c_client *client = to_i2c_client(dev);
23201 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
23202 + u_int8_t i;
23203 +
23204 + for (i = 0; i < ARRAY_SIZE(pwm_dc_table); i++) {
23205 + if (!strncmp(buf, pwm_dc_table[i], strlen(pwm_dc_table[i]))) {
23206 + dev_dbg(dev, "setting pwm dc %s\n\r", pwm_dc_table[i]);
23207 + reg_set_bit_mask(pcf, PCF50606_REG_PWMC1, 0x1e,
23208 + (i << PCF50606_PWMC1_DC_SHIFT));
23209 + }
23210 + }
23211 + return count;
23212 +}
23213 +
23214 +static DEVICE_ATTR(pwm_dc, S_IRUGO | S_IWUSR, show_pwm_dc, set_pwm_dc);
23215 +
23216 +static const char *pwm_clk_table[] = {
23217 + "512", "256", "128", "64",
23218 + "56300", "28100", "14100", "7000",
23219 +};
23220 +
23221 +static ssize_t show_pwm_clk(struct device *dev, struct device_attribute *attr,
23222 + char *buf)
23223 +{
23224 + struct i2c_client *client = to_i2c_client(dev);
23225 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
23226 + u_int8_t val;
23227 +
23228 + val = reg_read(pcf, PCF50606_REG_PWMC1) >> PCF50606_PWMC1_CLK_SHIFT;
23229 + val &= 0x7;
23230 +
23231 + return sprintf(buf, "%s\n", pwm_clk_table[val]);
23232 +}
23233 +
23234 +static ssize_t set_pwm_clk(struct device *dev, struct device_attribute *attr,
23235 + const char *buf, size_t count)
23236 +{
23237 + struct i2c_client *client = to_i2c_client(dev);
23238 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
23239 + u_int8_t i;
23240 +
23241 + for (i = 0; i < ARRAY_SIZE(pwm_clk_table); i++) {
23242 + if (!strncmp(buf, pwm_clk_table[i], strlen(pwm_clk_table[i]))) {
23243 + dev_dbg(dev, "setting pwm clk %s\n\r",
23244 + pwm_clk_table[i]);
23245 + reg_set_bit_mask(pcf, PCF50606_REG_PWMC1, 0xe0,
23246 + (i << PCF50606_PWMC1_CLK_SHIFT));
23247 + }
23248 + }
23249 + return count;
23250 +}
23251 +
23252 +static DEVICE_ATTR(pwm_clk, S_IRUGO | S_IWUSR, show_pwm_clk, set_pwm_clk);
23253 +
23254 +static int pcf50606bl_get_intensity(struct backlight_device *bd)
23255 +{
23256 + struct pcf50606_data *pcf = bl_get_data(bd);
23257 + int intensity = reg_read(pcf, PCF50606_REG_PWMC1);
23258 + intensity = (intensity >> PCF50606_PWMC1_DC_SHIFT);
23259 +
23260 + return intensity & 0xf;
23261 +}
23262 +
23263 +static int pcf50606bl_set_intensity(struct backlight_device *bd)
23264 +{
23265 + struct pcf50606_data *pcf = bl_get_data(bd);
23266 + int intensity = bd->props.brightness;
23267 +
23268 + if (bd->props.power != FB_BLANK_UNBLANK)
23269 + intensity = 0;
23270 + if (bd->props.fb_blank != FB_BLANK_UNBLANK)
23271 + intensity = 0;
23272 +
23273 + return reg_set_bit_mask(pcf, PCF50606_REG_PWMC1, 0x1e,
23274 + (intensity << PCF50606_PWMC1_DC_SHIFT));
23275 +}
23276 +
23277 +static struct backlight_ops pcf50606bl_ops = {
23278 + .get_brightness = pcf50606bl_get_intensity,
23279 + .update_status = pcf50606bl_set_intensity,
23280 +};
23281 +
23282 +/***********************************************************************
23283 + * Driver initialization
23284 + ***********************************************************************/
23285 +
23286 +#ifdef CONFIG_MACH_NEO1973_GTA01
23287 +/* We currently place those platform devices here to make sure the device
23288 + * suspend/resume order is correct */
23289 +static struct platform_device gta01_pm_gps_dev = {
23290 + .name = "neo1973-pm-gps",
23291 +};
23292 +
23293 +static struct platform_device gta01_pm_bt_dev = {
23294 + .name = "neo1973-pm-bt",
23295 +};
23296 +#endif
23297 +
23298 +static struct attribute *pcf_sysfs_entries[16] = {
23299 + &dev_attr_voltage_dcd.attr,
23300 + &dev_attr_voltage_dcde.attr,
23301 + &dev_attr_voltage_dcud.attr,
23302 + &dev_attr_voltage_d1reg.attr,
23303 + &dev_attr_voltage_d2reg.attr,
23304 + &dev_attr_voltage_d3reg.attr,
23305 + &dev_attr_voltage_lpreg.attr,
23306 + &dev_attr_voltage_ioreg.attr,
23307 + NULL
23308 +};
23309 +
23310 +static struct attribute_group pcf_attr_group = {
23311 + .name = NULL, /* put in device directory */
23312 + .attrs = pcf_sysfs_entries,
23313 +};
23314 +
23315 +static void populate_sysfs_group(struct pcf50606_data *pcf)
23316 +{
23317 + int i = 0;
23318 + struct attribute **attr;
23319 +
23320 + for (attr = pcf_sysfs_entries; *attr; attr++)
23321 + i++;
23322 +
23323 + if (pcf->pdata->used_features & PCF50606_FEAT_MBC) {
23324 + pcf_sysfs_entries[i++] = &dev_attr_chgstate.attr;
23325 + pcf_sysfs_entries[i++] = &dev_attr_chgmode.attr;
23326 + }
23327 +
23328 + if (pcf->pdata->used_features & PCF50606_FEAT_CHGCUR)
23329 + pcf_sysfs_entries[i++] = &dev_attr_chgcur.attr;
23330 +
23331 + if (pcf->pdata->used_features & PCF50606_FEAT_BATVOLT)
23332 + pcf_sysfs_entries[i++] = &dev_attr_battvolt.attr;
23333 +
23334 + if (pcf->pdata->used_features & PCF50606_FEAT_BATTEMP)
23335 + pcf_sysfs_entries[i++] = &dev_attr_battemp.attr;
23336 +
23337 + if (pcf->pdata->used_features & PCF50606_FEAT_PWM) {
23338 + pcf_sysfs_entries[i++] = &dev_attr_pwm_dc.attr;
23339 + pcf_sysfs_entries[i++] = &dev_attr_pwm_clk.attr;
23340 + }
23341 +}
23342 +
23343 +static int pcf50606_detect(struct i2c_adapter *adapter, int address, int kind)
23344 +{
23345 + struct i2c_client *new_client;
23346 + struct pcf50606_data *data;
23347 + int err = 0;
23348 + int irq;
23349 +
23350 + if (!pcf50606_pdev) {
23351 + printk(KERN_ERR "pcf50606: driver needs a platform_device!\n");
23352 + return -EIO;
23353 + }
23354 +
23355 + irq = platform_get_irq(pcf50606_pdev, 0);
23356 + if (irq < 0) {
23357 + dev_err(&pcf50606_pdev->dev, "no irq in platform resources!\n");
23358 + return -EIO;
23359 + }
23360 +
23361 + /* At the moment, we only support one PCF50606 in a system */
23362 + if (pcf50606_global) {
23363 + dev_err(&pcf50606_pdev->dev,
23364 + "currently only one chip supported\n");
23365 + return -EBUSY;
23366 + }
23367 +
23368 + data = kzalloc(sizeof(*data), GFP_KERNEL);
23369 + if (!data)
23370 + return -ENOMEM;
23371 +
23372 + mutex_init(&data->lock);
23373 + mutex_init(&data->working_lock);
23374 + INIT_WORK(&data->work, pcf50606_work);
23375 + data->irq = irq;
23376 + data->working = 0;
23377 + data->suppress_onkey_events = 0;
23378 + data->onkey_seconds = -1;
23379 + data->pdata = pcf50606_pdev->dev.platform_data;
23380 +
23381 + new_client = &data->client;
23382 + i2c_set_clientdata(new_client, data);
23383 + new_client->addr = address;
23384 + new_client->adapter = adapter;
23385 + new_client->driver = &pcf50606_driver;
23386 + new_client->flags = 0;
23387 + strlcpy(new_client->name, "pcf50606", I2C_NAME_SIZE);
23388 +
23389 + /* now we try to detect the chip */
23390 +
23391 + /* register with i2c core */
23392 + err = i2c_attach_client(new_client);
23393 + if (err) {
23394 + dev_err(&new_client->dev,
23395 + "error during i2c_attach_client()\n");
23396 + goto exit_free;
23397 + }
23398 +
23399 + populate_sysfs_group(data);
23400 +
23401 + err = sysfs_create_group(&new_client->dev.kobj, &pcf_attr_group);
23402 + if (err) {
23403 + dev_err(&new_client->dev, "error creating sysfs group\n");
23404 + goto exit_detach;
23405 + }
23406 +
23407 + /* create virtual charger 'device' */
23408 +
23409 + /* input device registration */
23410 + data->input_dev = input_allocate_device();
23411 + if (!data->input_dev)
23412 + goto exit_sysfs;
23413 +
23414 + data->input_dev->name = "FIC Neo1973 PMU events";
23415 + data->input_dev->phys = "I2C";
23416 + data->input_dev->id.bustype = BUS_I2C;
23417 + data->input_dev->cdev.dev = &new_client->dev;
23418 +
23419 + data->input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR);
23420 + set_bit(KEY_POWER, data->input_dev->keybit);
23421 + set_bit(KEY_POWER2, data->input_dev->keybit);
23422 + set_bit(KEY_BATTERY, data->input_dev->keybit);
23423 +
23424 + err = input_register_device(data->input_dev);
23425 + if (err)
23426 + goto exit_sysfs;
23427 +
23428 + /* register power off handler with core power management */
23429 + pm_power_off = &pcf50606_go_standby;
23430 +
23431 + /* configure interrupt mask */
23432 + /* we don't mask SECOND here, because we want one to do coldplug with */
23433 + reg_write(data, PCF50606_REG_INT1M, 0x00);
23434 + reg_write(data, PCF50606_REG_INT2M, 0x00);
23435 + reg_write(data, PCF50606_REG_INT3M, PCF50606_INT3_TSCPRES);
23436 +
23437 + err = request_irq(irq, pcf50606_irq, IRQF_TRIGGER_FALLING,
23438 + "pcf50606", data);
23439 + if (err < 0)
23440 + goto exit_input;
23441 +
23442 + if (enable_irq_wake(irq) < 0)
23443 + dev_err(&new_client->dev, "IRQ %u cannot be enabled as wake-up"
23444 + "source in this hardware revision!", irq);
23445 +
23446 + pcf50606_global = data;
23447 +
23448 + if (data->pdata->used_features & PCF50606_FEAT_RTC) {
23449 + data->rtc = rtc_device_register("pcf50606", &new_client->dev,
23450 + &pcf50606_rtc_ops, THIS_MODULE);
23451 + if (IS_ERR(data->rtc)) {
23452 + err = PTR_ERR(data->rtc);
23453 + goto exit_irq;
23454 + }
23455 + }
23456 +
23457 + if (data->pdata->used_features & PCF50606_FEAT_WDT) {
23458 + err = misc_register(&pcf50606_wdt_miscdev);
23459 + if (err) {
23460 + dev_err(&new_client->dev, "cannot register miscdev on "
23461 + "minor=%d (%d)\n", WATCHDOG_MINOR, err);
23462 + goto exit_rtc;
23463 + }
23464 + }
23465 +
23466 + if (data->pdata->used_features & PCF50606_FEAT_PWM) {
23467 + /* enable PWM controller */
23468 + reg_set_bit_mask(data, PCF50606_REG_PWMC1,
23469 + PCF50606_PWMC1_ACTSET,
23470 + PCF50606_PWMC1_ACTSET);
23471 + }
23472 +
23473 + if (data->pdata->used_features & PCF50606_FEAT_PWM_BL) {
23474 + data->backlight = backlight_device_register("pcf50606-bl",
23475 + &new_client->dev,
23476 + data,
23477 + &pcf50606bl_ops);
23478 + if (!data->backlight)
23479 + goto exit_misc;
23480 + data->backlight->props.max_brightness = 16;
23481 + data->backlight->props.power = FB_BLANK_UNBLANK;
23482 + data->backlight->props.brightness =
23483 + data->pdata->init_brightness;
23484 + backlight_update_status(data->backlight);
23485 + }
23486 +
23487 + apm_get_power_status = pcf50606_get_power_status;
23488 + pmu_bat_get_property = pcf50606_bat_get_property;
23489 +
23490 +#ifdef CONFIG_MACH_NEO1973_GTA01
23491 + if (machine_is_neo1973_gta01()) {
23492 + gta01_pm_gps_dev.dev.parent = &new_client->dev;
23493 + switch (system_rev) {
23494 + case GTA01Bv2_SYSTEM_REV:
23495 + case GTA01Bv3_SYSTEM_REV:
23496 + case GTA01Bv4_SYSTEM_REV:
23497 + gta01_pm_bt_dev.dev.parent = &new_client->dev;
23498 + platform_device_register(&gta01_pm_bt_dev);
23499 + break;
23500 + }
23501 + platform_device_register(&gta01_pm_gps_dev);
23502 + /* a link for gllin compatibility */
23503 + err = sysfs_create_link(&platform_bus_type.devices.kobj,
23504 + &gta01_pm_gps_dev.dev.kobj, "gta01-pm-gps.0");
23505 + if (err)
23506 + printk(KERN_ERR
23507 + "sysfs_create_link (gta01-pm-gps.0): %d\n", err);
23508 + }
23509 +#endif
23510 +
23511 + if (data->pdata->used_features & PCF50606_FEAT_ACD)
23512 + reg_set_bit_mask(data, PCF50606_REG_ACDC1,
23513 + PCF50606_ACDC1_ACDAPE, PCF50606_ACDC1_ACDAPE);
23514 + else
23515 + reg_clear_bits(data, PCF50606_REG_ACDC1,
23516 + PCF50606_ACDC1_ACDAPE);
23517 +
23518 + return 0;
23519 +
23520 +exit_misc:
23521 + if (data->pdata->used_features & PCF50606_FEAT_WDT)
23522 + misc_deregister(&pcf50606_wdt_miscdev);
23523 +exit_rtc:
23524 + if (data->pdata->used_features & PCF50606_FEAT_RTC)
23525 + rtc_device_unregister(pcf50606_global->rtc);
23526 +exit_irq:
23527 + free_irq(pcf50606_global->irq, pcf50606_global);
23528 + pcf50606_global = NULL;
23529 +exit_input:
23530 + pm_power_off = NULL;
23531 + input_unregister_device(data->input_dev);
23532 +exit_sysfs:
23533 + sysfs_remove_group(&new_client->dev.kobj, &pcf_attr_group);
23534 +exit_detach:
23535 + i2c_detach_client(new_client);
23536 +exit_free:
23537 + kfree(data);
23538 + return err;
23539 +}
23540 +
23541 +static int pcf50606_attach_adapter(struct i2c_adapter *adapter)
23542 +{
23543 + return i2c_probe(adapter, &addr_data, &pcf50606_detect);
23544 +}
23545 +
23546 +static int pcf50606_detach_client(struct i2c_client *client)
23547 +{
23548 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
23549 +
23550 + apm_get_power_status = NULL;
23551 + pmu_bat_get_property = NULL;
23552 +
23553 + input_unregister_device(pcf->input_dev);
23554 +
23555 + if (pcf->pdata->used_features & PCF50606_FEAT_PWM_BL)
23556 + backlight_device_unregister(pcf->backlight);
23557 +
23558 + if (pcf->pdata->used_features & PCF50606_FEAT_WDT)
23559 + misc_deregister(&pcf50606_wdt_miscdev);
23560 +
23561 + if (pcf->pdata->used_features & PCF50606_FEAT_RTC)
23562 + rtc_device_unregister(pcf->rtc);
23563 +
23564 + free_irq(pcf->irq, pcf);
23565 +
23566 + sysfs_remove_group(&client->dev.kobj, &pcf_attr_group);
23567 +
23568 + pm_power_off = NULL;
23569 +
23570 + kfree(pcf);
23571 +
23572 + return 0;
23573 +}
23574 +
23575 +#ifdef CONFIG_PM
23576 +#define INT1M_RESUMERS (PCF50606_INT1_ALARM | \
23577 + PCF50606_INT1_ONKEYF | \
23578 + PCF50606_INT1_EXTONR)
23579 +#define INT2M_RESUMERS (PCF50606_INT2_CHGWD10S | \
23580 + PCF50606_INT2_CHGPROT | \
23581 + PCF50606_INT2_CHGERR)
23582 +#define INT3M_RESUMERS (PCF50606_INT3_LOWBAT | \
23583 + PCF50606_INT3_HIGHTMP | \
23584 + PCF50606_INT3_ACDINS)
23585 +static int pcf50606_suspend(struct device *dev, pm_message_t state)
23586 +{
23587 + struct i2c_client *client = to_i2c_client(dev);
23588 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
23589 + int i;
23590 +
23591 + /* we suspend once (!) as late as possible in the suspend sequencing */
23592 +
23593 + if ((state.event != PM_EVENT_SUSPEND) ||
23594 + (pcf->suspend_state != PCF50606_SS_RUNNING))
23595 + return -EBUSY;
23596 +
23597 + /* The general idea is to power down all unused power supplies,
23598 + * and then mask all PCF50606 interrup sources but EXTONR, ONKEYF
23599 + * and ALARM */
23600 +
23601 + mutex_lock(&pcf->lock);
23602 +
23603 + pcf->suspend_state = PCF50606_SS_STARTING_SUSPEND;
23604 +
23605 + /* we are not going to service any further interrupts until we
23606 + * resume. If the IRQ workqueue is still pending in the background,
23607 + * it will bail when it sees we set suspend state above.
23608 + */
23609 +
23610 + disable_irq(pcf->irq);
23611 +
23612 + /* Save all registers that don't "survive" standby state */
23613 + pcf->standby_regs.dcdc1 = __reg_read(pcf, PCF50606_REG_DCDC1);
23614 + pcf->standby_regs.dcdc2 = __reg_read(pcf, PCF50606_REG_DCDC2);
23615 + pcf->standby_regs.dcdec1 = __reg_read(pcf, PCF50606_REG_DCDEC1);
23616 + pcf->standby_regs.dcudc1 = __reg_read(pcf, PCF50606_REG_DCUDC1);
23617 + pcf->standby_regs.ioregc = __reg_read(pcf, PCF50606_REG_IOREGC);
23618 + pcf->standby_regs.d1regc1 = __reg_read(pcf, PCF50606_REG_D1REGC1);
23619 + pcf->standby_regs.d2regc1 = __reg_read(pcf, PCF50606_REG_D2REGC1);
23620 + pcf->standby_regs.d3regc1 = __reg_read(pcf, PCF50606_REG_D3REGC1);
23621 + pcf->standby_regs.lpregc1 = __reg_read(pcf, PCF50606_REG_LPREGC1);
23622 + pcf->standby_regs.adcc1 = __reg_read(pcf, PCF50606_REG_ADCC1);
23623 + pcf->standby_regs.adcc2 = __reg_read(pcf, PCF50606_REG_ADCC2);
23624 + pcf->standby_regs.pwmc1 = __reg_read(pcf, PCF50606_REG_PWMC1);
23625 +
23626 + /* switch off power supplies that are not needed during suspend */
23627 + for (i = 0; i < __NUM_PCF50606_REGULATORS; i++) {
23628 + if (!(pcf->pdata->rails[i].flags & PMU_VRAIL_F_SUSPEND_ON)) {
23629 + u_int8_t tmp;
23630 +
23631 + /* IOREG powers the I@C interface so we cannot switch
23632 + * it off */
23633 + if (i == PCF50606_REGULATOR_IOREG)
23634 + continue;
23635 +
23636 + dev_dbg(dev, "disabling pcf50606 regulator %u\n", i);
23637 + /* we cannot use pcf50606_onoff_set() because we're
23638 + * already under the mutex */
23639 + tmp = __reg_read(pcf, regulator_registers[i]);
23640 + tmp &= 0x1f;
23641 + __reg_write(pcf, regulator_registers[i], tmp);
23642 + }
23643 + }
23644 +
23645 + pcf->standby_regs.int1m = __reg_read(pcf, PCF50606_REG_INT1M);
23646 + pcf->standby_regs.int2m = __reg_read(pcf, PCF50606_REG_INT2M);
23647 + pcf->standby_regs.int3m = __reg_read(pcf, PCF50606_REG_INT3M);
23648 + __reg_write(pcf, PCF50606_REG_INT1M, ~INT1M_RESUMERS & 0xff);
23649 + __reg_write(pcf, PCF50606_REG_INT2M, ~INT2M_RESUMERS & 0xff);
23650 + __reg_write(pcf, PCF50606_REG_INT3M, ~INT3M_RESUMERS & 0xff);
23651 +
23652 + pcf->suspend_state = PCF50606_SS_COMPLETED_SUSPEND;
23653 +
23654 + mutex_unlock(&pcf->lock);
23655 +
23656 + return 0;
23657 +}
23658 +
23659 +static int pcf50606_resume(struct device *dev)
23660 +{
23661 + struct i2c_client *client = to_i2c_client(dev);
23662 + struct pcf50606_data *pcf = i2c_get_clientdata(client);
23663 +
23664 + mutex_lock(&pcf->lock);
23665 +
23666 + pcf->suspend_state = PCF50606_SS_STARTING_RESUME;
23667 +
23668 + /* Resume all saved registers that don't "survive" standby state */
23669 + __reg_write(pcf, PCF50606_REG_INT1M, pcf->standby_regs.int1m);
23670 + __reg_write(pcf, PCF50606_REG_INT2M, pcf->standby_regs.int2m);
23671 + __reg_write(pcf, PCF50606_REG_INT3M, pcf->standby_regs.int3m);
23672 +
23673 + __reg_write(pcf, PCF50606_REG_DCDC1, pcf->standby_regs.dcdc1);
23674 + __reg_write(pcf, PCF50606_REG_DCDC2, pcf->standby_regs.dcdc2);
23675 + __reg_write(pcf, PCF50606_REG_DCDEC1, pcf->standby_regs.dcdec1);
23676 + __reg_write(pcf, PCF50606_REG_DCUDC1, pcf->standby_regs.dcudc1);
23677 + __reg_write(pcf, PCF50606_REG_IOREGC, pcf->standby_regs.ioregc);
23678 + __reg_write(pcf, PCF50606_REG_D1REGC1, pcf->standby_regs.d1regc1);
23679 + __reg_write(pcf, PCF50606_REG_D2REGC1, pcf->standby_regs.d2regc1);
23680 + __reg_write(pcf, PCF50606_REG_D3REGC1, pcf->standby_regs.d3regc1);
23681 + __reg_write(pcf, PCF50606_REG_LPREGC1, pcf->standby_regs.lpregc1);
23682 + __reg_write(pcf, PCF50606_REG_ADCC1, pcf->standby_regs.adcc1);
23683 + __reg_write(pcf, PCF50606_REG_ADCC2, pcf->standby_regs.adcc2);
23684 + __reg_write(pcf, PCF50606_REG_PWMC1, pcf->standby_regs.pwmc1);
23685 +
23686 + pcf->suspend_state = PCF50606_SS_COMPLETED_RESUME;
23687 +
23688 + enable_irq(pcf->irq);
23689 +
23690 + mutex_unlock(&pcf->lock);
23691 +
23692 + /* Call PCF work function; this fixes an issue on the gta01 where
23693 + * the power button "goes away" if it is used to wake the device.
23694 + */
23695 + get_device(&pcf->client.dev);
23696 + pcf50606_work(&pcf->work);
23697 +
23698 + return 0;
23699 +}
23700 +#else
23701 +#define pcf50606_suspend NULL
23702 +#define pcf50606_resume NULL
23703 +#endif
23704 +
23705 +static struct i2c_driver pcf50606_driver = {
23706 + .driver = {
23707 + .name = "pcf50606",
23708 + .suspend = pcf50606_suspend,
23709 + .resume = pcf50606_resume,
23710 + },
23711 + .id = I2C_DRIVERID_PCF50606,
23712 + .attach_adapter = pcf50606_attach_adapter,
23713 + .detach_client = pcf50606_detach_client,
23714 +};
23715 +
23716 +/* platform driver, since i2c devices don't have platform_data */
23717 +static int __init pcf50606_plat_probe(struct platform_device *pdev)
23718 +{
23719 + struct pcf50606_platform_data *pdata = pdev->dev.platform_data;
23720 +
23721 + if (!pdata)
23722 + return -ENODEV;
23723 +
23724 + pcf50606_pdev = pdev;
23725 +
23726 + return 0;
23727 +}
23728 +
23729 +static int pcf50606_plat_remove(struct platform_device *pdev)
23730 +{
23731 + return 0;
23732 +}
23733 +
23734 +/* We have this purely to capture an early indication that we are coming out
23735 + * of suspend, before our device resume got called; async interrupt service is
23736 + * interested in this.
23737 + */
23738 +
23739 +static int pcf50606_plat_resume(struct platform_device *pdev)
23740 +{
23741 + /* i2c_get_clientdata(to_i2c_client(&pdev->dev)) returns NULL at this
23742 + * early resume time so we have to use pcf50606_global
23743 + */
23744 + pcf50606_global->suspend_state = PCF50606_SS_RESUMING_BUT_NOT_US_YET;
23745 +
23746 + return 0;
23747 +}
23748 +
23749 +static struct platform_driver pcf50606_plat_driver = {
23750 + .probe = pcf50606_plat_probe,
23751 + .remove = pcf50606_plat_remove,
23752 + .resume_early = pcf50606_plat_resume,
23753 + .driver = {
23754 + .owner = THIS_MODULE,
23755 + .name = "pcf50606",
23756 + },
23757 +};
23758 +
23759 +static int __init pcf50606_init(void)
23760 +{
23761 + int rc;
23762 +
23763 + rc = platform_driver_register(&pcf50606_plat_driver);
23764 + if (!rc)
23765 + rc = i2c_add_driver(&pcf50606_driver);
23766 +
23767 + return rc;
23768 +}
23769 +
23770 +static void pcf50606_exit(void)
23771 +{
23772 + i2c_del_driver(&pcf50606_driver);
23773 + platform_driver_unregister(&pcf50606_plat_driver);
23774 +}
23775 +
23776 +MODULE_DESCRIPTION("I2C chip driver for NXP PCF50606 power management unit");
23777 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
23778 +MODULE_LICENSE("GPL");
23779 +
23780 +module_init(pcf50606_init);
23781 +module_exit(pcf50606_exit);
23782 Index: linux-2.6.24.7/drivers/i2c/chips/pcf50606.h
23783 ===================================================================
23784 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
23785 +++ linux-2.6.24.7/drivers/i2c/chips/pcf50606.h 2008-12-11 22:46:49.000000000 +0100
23786 @@ -0,0 +1,302 @@
23787 +#ifndef _PCF50606_H
23788 +#define _PCF50606_H
23789 +
23790 +/* Philips PCF50606 Power Managemnt Unit (PMU) driver
23791 + * (C) 2006-2007 by Openmoko, Inc.
23792 + * Author: Harald Welte <laforge@openmoko.org>
23793 + *
23794 + */
23795 +
23796 +enum pfc50606_regs {
23797 + PCF50606_REG_ID = 0x00,
23798 + PCF50606_REG_OOCS = 0x01,
23799 + PCF50606_REG_INT1 = 0x02, /* Interrupt Status */
23800 + PCF50606_REG_INT2 = 0x03, /* Interrupt Status */
23801 + PCF50606_REG_INT3 = 0x04, /* Interrupt Status */
23802 + PCF50606_REG_INT1M = 0x05, /* Interrupt Mask */
23803 + PCF50606_REG_INT2M = 0x06, /* Interrupt Mask */
23804 + PCF50606_REG_INT3M = 0x07, /* Interrupt Mask */
23805 + PCF50606_REG_OOCC1 = 0x08,
23806 + PCF50606_REG_OOCC2 = 0x09,
23807 + PCF50606_REG_RTCSC = 0x0a, /* Second */
23808 + PCF50606_REG_RTCMN = 0x0b, /* Minute */
23809 + PCF50606_REG_RTCHR = 0x0c, /* Hour */
23810 + PCF50606_REG_RTCWD = 0x0d, /* Weekday */
23811 + PCF50606_REG_RTCDT = 0x0e, /* Day */
23812 + PCF50606_REG_RTCMT = 0x0f, /* Month */
23813 + PCF50606_REG_RTCYR = 0x10, /* Year */
23814 + PCF50606_REG_RTCSCA = 0x11, /* Alarm Second */
23815 + PCF50606_REG_RTCMNA = 0x12, /* Alarm Minute */
23816 + PCF50606_REG_RTCHRA = 0x13, /* Alarm Hour */
23817 + PCF50606_REG_RTCWDA = 0x14, /* Alarm Weekday */
23818 + PCF50606_REG_RTCDTA = 0x15, /* Alarm Day */
23819 + PCF50606_REG_RTCMTA = 0x16, /* Alarm Month */
23820 + PCF50606_REG_RTCYRA = 0x17, /* Alarm Year */
23821 + PCF50606_REG_PSSC = 0x18, /* Power sequencing */
23822 + PCF50606_REG_PWROKM = 0x19, /* PWROK mask */
23823 + PCF50606_REG_PWROKS = 0x1a, /* PWROK status */
23824 + PCF50606_REG_DCDC1 = 0x1b,
23825 + PCF50606_REG_DCDC2 = 0x1c,
23826 + PCF50606_REG_DCDC3 = 0x1d,
23827 + PCF50606_REG_DCDC4 = 0x1e,
23828 + PCF50606_REG_DCDEC1 = 0x1f,
23829 + PCF50606_REG_DCDEC2 = 0x20,
23830 + PCF50606_REG_DCUDC1 = 0x21,
23831 + PCF50606_REG_DCUDC2 = 0x22,
23832 + PCF50606_REG_IOREGC = 0x23,
23833 + PCF50606_REG_D1REGC1 = 0x24,
23834 + PCF50606_REG_D2REGC1 = 0x25,
23835 + PCF50606_REG_D3REGC1 = 0x26,
23836 + PCF50606_REG_LPREGC1 = 0x27,
23837 + PCF50606_REG_LPREGC2 = 0x28,
23838 + PCF50606_REG_MBCC1 = 0x29,
23839 + PCF50606_REG_MBCC2 = 0x2a,
23840 + PCF50606_REG_MBCC3 = 0x2b,
23841 + PCF50606_REG_MBCS1 = 0x2c,
23842 + PCF50606_REG_BBCC = 0x2d,
23843 + PCF50606_REG_ADCC1 = 0x2e,
23844 + PCF50606_REG_ADCC2 = 0x2f,
23845 + PCF50606_REG_ADCS1 = 0x30,
23846 + PCF50606_REG_ADCS2 = 0x31,
23847 + PCF50606_REG_ADCS3 = 0x32,
23848 + PCF50606_REG_ACDC1 = 0x33,
23849 + PCF50606_REG_BVMC = 0x34,
23850 + PCF50606_REG_PWMC1 = 0x35,
23851 + PCF50606_REG_LEDC1 = 0x36,
23852 + PCF50606_REG_LEDC2 = 0x37,
23853 + PCF50606_REG_GPOC1 = 0x38,
23854 + PCF50606_REG_GPOC2 = 0x39,
23855 + PCF50606_REG_GPOC3 = 0x3a,
23856 + PCF50606_REG_GPOC4 = 0x3b,
23857 + PCF50606_REG_GPOC5 = 0x3c,
23858 + __NUM_PCF50606_REGS
23859 +};
23860 +
23861 +enum pcf50606_reg_oocs {
23862 + PFC50606_OOCS_ONKEY = 0x01,
23863 + PCF50606_OOCS_EXTON = 0x02,
23864 + PCF50606_OOCS_PWROKRST = 0x04,
23865 + PCF50606_OOCS_BATOK = 0x08,
23866 + PCF50606_OOCS_BACKOK = 0x10,
23867 + PCF50606_OOCS_CHGOK = 0x20,
23868 + PCF50606_OOCS_TEMPOK = 0x40,
23869 + PCF50606_OOCS_WDTEXP = 0x80,
23870 +};
23871 +
23872 +enum pcf50606_reg_oocc1 {
23873 + PCF50606_OOCC1_GOSTDBY = 0x01,
23874 + PCF50606_OOCC1_TOTRST = 0x02,
23875 + PCF50606_OOCC1_CLK32ON = 0x04,
23876 + PCF50606_OOCC1_WDTRST = 0x08,
23877 + PCF50606_OOCC1_RTCWAK = 0x10,
23878 + PCF50606_OOCC1_CHGWAK = 0x20,
23879 + PCF50606_OOCC1_EXTONWAK_HIGH = 0x40,
23880 + PCF50606_OOCC1_EXTONWAK_LOW = 0x80,
23881 +};
23882 +
23883 +enum pcf50606_reg_oocc2 {
23884 + PCF50606_OOCC2_ONKEYDB_NONE = 0x00,
23885 + PCF50606_OOCC2_ONKEYDB_14ms = 0x01,
23886 + PCF50606_OOCC2_ONKEYDB_62ms = 0x02,
23887 + PCF50606_OOCC2_ONKEYDB_500ms = 0x03,
23888 + PCF50606_OOCC2_EXTONDB_NONE = 0x00,
23889 + PCF50606_OOCC2_EXTONDB_14ms = 0x04,
23890 + PCF50606_OOCC2_EXTONDB_62ms = 0x08,
23891 + PCF50606_OOCC2_EXTONDB_500ms = 0x0c,
23892 +};
23893 +
23894 +enum pcf50606_reg_int1 {
23895 + PCF50606_INT1_ONKEYR = 0x01, /* ONKEY rising edge */
23896 + PCF50606_INT1_ONKEYF = 0x02, /* ONKEY falling edge */
23897 + PCF50606_INT1_ONKEY1S = 0x04, /* OMKEY at least 1sec low */
23898 + PCF50606_INT1_EXTONR = 0x08, /* EXTON rising edge */
23899 + PCF50606_INT1_EXTONF = 0x10, /* EXTON falling edge */
23900 + PCF50606_INT1_SECOND = 0x40, /* RTC periodic second interrupt */
23901 + PCF50606_INT1_ALARM = 0x80, /* RTC alarm time is reached */
23902 +};
23903 +
23904 +enum pcf50606_reg_int2 {
23905 + PCF50606_INT2_CHGINS = 0x01, /* Charger inserted */
23906 + PCF50606_INT2_CHGRM = 0x02, /* Charger removed */
23907 + PCF50606_INT2_CHGFOK = 0x04, /* Fast charging OK */
23908 + PCF50606_INT2_CHGERR = 0x08, /* Error in charging mode */
23909 + PCF50606_INT2_CHGFRDY = 0x10, /* Fast charge completed */
23910 + PCF50606_INT2_CHGPROT = 0x20, /* Charging protection interrupt */
23911 + PCF50606_INT2_CHGWD10S = 0x40, /* Charger watchdig expires in 10s */
23912 + PCF50606_INT2_CHGWDEXP = 0x80, /* Charger watchdog expires */
23913 +};
23914 +
23915 +enum pcf50606_reg_int3 {
23916 + PCF50606_INT3_ADCRDY = 0x01, /* ADC conversion finished */
23917 + PCF50606_INT3_ACDINS = 0x02, /* Accessory inserted */
23918 + PCF50606_INT3_ACDREM = 0x04, /* Accessory removed */
23919 + PCF50606_INT3_TSCPRES = 0x08, /* Touch screen pressed */
23920 + PCF50606_INT3_LOWBAT = 0x40, /* Low battery voltage */
23921 + PCF50606_INT3_HIGHTMP = 0x80, /* High temperature */
23922 +};
23923 +
23924 +/* used by PSSC, PWROKM, PWROKS, */
23925 +enum pcf50606_regu {
23926 + PCF50606_REGU_DCD = 0x01, /* DCD in phase 2 */
23927 + PCF50606_REGU_DCDE = 0x02, /* DCDE in phase 2 */
23928 + PCF50606_REGU_DCUD = 0x04, /* DCDU in phase 2 */
23929 + PCF50606_REGU_IO = 0x08, /* IO in phase 2 */
23930 + PCF50606_REGU_D1 = 0x10, /* D1 in phase 2 */
23931 + PCF50606_REGU_D2 = 0x20, /* D2 in phase 2 */
23932 + PCF50606_REGU_D3 = 0x40, /* D3 in phase 2 */
23933 + PCF50606_REGU_LP = 0x80, /* LP in phase 2 */
23934 +};
23935 +
23936 +enum pcf50606_reg_dcdc4 {
23937 + PCF50606_DCDC4_MODE_AUTO = 0x00,
23938 + PCF50606_DCDC4_MODE_PWM = 0x01,
23939 + PCF50606_DCDC4_MODE_PCF = 0x02,
23940 + PCF50606_DCDC4_OFF_FLOAT = 0x00,
23941 + PCF50606_DCDC4_OFF_BYPASS = 0x04,
23942 + PCF50606_DCDC4_OFF_PULLDOWN = 0x08,
23943 + PCF50606_DCDC4_CURLIM_500mA = 0x00,
23944 + PCF50606_DCDC4_CURLIM_750mA = 0x10,
23945 + PCF50606_DCDC4_CURLIM_1000mA = 0x20,
23946 + PCF50606_DCDC4_CURLIM_1250mA = 0x30,
23947 + PCF50606_DCDC4_TOGGLE = 0x40,
23948 + PCF50606_DCDC4_REGSEL_DCDC2 = 0x80,
23949 +};
23950 +
23951 +enum pcf50606_reg_dcdec2 {
23952 + PCF50606_DCDEC2_MODE_AUTO = 0x00,
23953 + PCF50606_DCDEC2_MODE_PWM = 0x01,
23954 + PCF50606_DCDEC2_MODE_PCF = 0x02,
23955 + PCF50606_DCDEC2_OFF_FLOAT = 0x00,
23956 + PCF50606_DCDEC2_OFF_BYPASS = 0x04,
23957 +};
23958 +
23959 +enum pcf50606_reg_dcudc2 {
23960 + PCF50606_DCUDC2_MODE_AUTO = 0x00,
23961 + PCF50606_DCUDC2_MODE_PWM = 0x01,
23962 + PCF50606_DCUDC2_MODE_PCF = 0x02,
23963 + PCF50606_DCUDC2_OFF_FLOAT = 0x00,
23964 + PCF50606_DCUDC2_OFF_BYPASS = 0x04,
23965 +};
23966 +
23967 +enum pcf50606_reg_adcc1 {
23968 + PCF50606_ADCC1_TSCMODACT = 0x01,
23969 + PCF50606_ADCC1_TSCMODSTB = 0x02,
23970 + PCF50606_ADCC1_TRATSET = 0x04,
23971 + PCF50606_ADCC1_NTCSWAPE = 0x08,
23972 + PCF50606_ADCC1_NTCSWAOFF = 0x10,
23973 + PCF50606_ADCC1_EXTSYNCBREAK = 0x20,
23974 + /* reserved */
23975 + PCF50606_ADCC1_TSCINT = 0x80,
23976 +};
23977 +
23978 +enum pcf50606_reg_adcc2 {
23979 + PCF50606_ADCC2_ADCSTART = 0x01,
23980 + /* see enum pcf50606_adcc2_adcmux */
23981 + PCF50606_ADCC2_SYNC_NONE = 0x00,
23982 + PCF50606_ADCC2_SYNC_TXON = 0x20,
23983 + PCF50606_ADCC2_SYNC_PWREN1 = 0x40,
23984 + PCF50606_ADCC2_SYNC_PWREN2 = 0x60,
23985 + PCF50606_ADCC2_RES_10BIT = 0x00,
23986 + PCF50606_ADCC2_RES_8BIT = 0x80,
23987 +};
23988 +
23989 +#define PCF50606_ADCC2_ADCMUX_MASK (0xf << 1)
23990 +
23991 +#define ADCMUX_SHIFT 1
23992 +enum pcf50606_adcc2_adcmux {
23993 + PCF50606_ADCMUX_BATVOLT_RES = 0x0 << ADCMUX_SHIFT,
23994 + PCF50606_ADCMUX_BATVOLT_SUBTR = 0x1 << ADCMUX_SHIFT,
23995 + PCF50606_ADCMUX_ADCIN1_RES = 0x2 << ADCMUX_SHIFT,
23996 + PCF50606_ADCMUX_ADCIN1_SUBTR = 0x3 << ADCMUX_SHIFT,
23997 + PCF50606_ADCMUX_BATTEMP = 0x4 << ADCMUX_SHIFT,
23998 + PCF50606_ADCMUX_ADCIN2 = 0x5 << ADCMUX_SHIFT,
23999 + PCF50606_ADCMUX_ADCIN3 = 0x6 << ADCMUX_SHIFT,
24000 + PCF50606_ADCMUX_ADCIN3_RATIO = 0x7 << ADCMUX_SHIFT,
24001 + PCF50606_ADCMUX_XPOS = 0x8 << ADCMUX_SHIFT,
24002 + PCF50606_ADCMUX_YPOS = 0x9 << ADCMUX_SHIFT,
24003 + PCF50606_ADCMUX_P1 = 0xa << ADCMUX_SHIFT,
24004 + PCF50606_ADCMUX_P2 = 0xb << ADCMUX_SHIFT,
24005 + PCF50606_ADCMUX_BATVOLT_ADCIN1 = 0xc << ADCMUX_SHIFT,
24006 + PCF50606_ADCMUX_XY_SEQUENCE = 0xe << ADCMUX_SHIFT,
24007 + PCF50606_P1_P2_RESISTANCE = 0xf << ADCMUX_SHIFT,
24008 +};
24009 +
24010 +enum pcf50606_adcs2 {
24011 + PCF50606_ADCS2_ADCRDY = 0x80,
24012 +};
24013 +
24014 +enum pcf50606_reg_mbcc1 {
24015 + PCF50606_MBCC1_CHGAPE = 0x01,
24016 + PCF50606_MBCC1_AUTOFST = 0x02,
24017 +#define PCF50606_MBCC1_CHGMOD_MASK 0x1c
24018 +#define PCF50606_MBCC1_CHGMOD_SHIFT 2
24019 + PCF50606_MBCC1_CHGMOD_QUAL = 0x00,
24020 + PCF50606_MBCC1_CHGMOD_PRE = 0x04,
24021 + PCF50606_MBCC1_CHGMOD_TRICKLE = 0x08,
24022 + PCF50606_MBCC1_CHGMOD_FAST_CCCV = 0x0c,
24023 + PCF50606_MBCC1_CHGMOD_FAST_NOCC = 0x10,
24024 + PCF50606_MBCC1_CHGMOD_FAST_NOCV = 0x14,
24025 + PCF50606_MBCC1_CHGMOD_FAST_SW = 0x18,
24026 + PCF50606_MBCC1_CHGMOD_IDLE = 0x1c,
24027 + PCF50606_MBCC1_DETMOD_LOWCHG = 0x20,
24028 + PCF50606_MBCC1_DETMOD_WDRST = 0x40,
24029 +};
24030 +
24031 +enum pcf50606_reg_acdc1 {
24032 + PCF50606_ACDC1_ACDDET = 0x01,
24033 + PCF50606_ACDC1_THRSHLD_1V0 = 0x00,
24034 + PCF50606_ACDC1_THRSHLD_1V2 = 0x02,
24035 + PCF50606_ACDC1_THRSHLD_1V4 = 0x04,
24036 + PCF50606_ACDC1_THRSHLD_1V6 = 0x06,
24037 + PCF50606_ACDC1_THRSHLD_1V8 = 0x08,
24038 + PCF50606_ACDC1_THRSHLD_2V0 = 0x0a,
24039 + PCF50606_ACDC1_THRSHLD_2V2 = 0x0c,
24040 + PCF50606_ACDC1_THRSHLD_2V4 = 0x0e,
24041 + PCF50606_ACDC1_DISDB = 0x10,
24042 + PCF50606_ACDC1_ACDAPE = 0x80,
24043 +};
24044 +
24045 +enum pcf50606_reg_bvmc {
24046 + PCF50606_BVMC_LOWBAT = 0x01,
24047 + PCF50606_BVMC_THRSHLD_NULL = 0x00,
24048 + PCF50606_BVMC_THRSHLD_2V8 = 0x02,
24049 + PCF50606_BVMC_THRSHLD_2V9 = 0x04,
24050 + PCF50606_BVMC_THRSHLD_3V = 0x08,
24051 + PCF50606_BVMC_THRSHLD_3V1 = 0x08,
24052 + PCF50606_BVMC_THRSHLD_3V2 = 0x0a,
24053 + PCF50606_BVMC_THRSHLD_3V3 = 0x0c,
24054 + PCF50606_BVMC_THRSHLD_3V4 = 0x0e,
24055 + PCF50606_BVMC_DISDB = 0x10,
24056 +};
24057 +
24058 +enum pcf50606_reg_pwmc1 {
24059 + PCF50606_PWMC1_ACTSET = 0x01,
24060 + PCF50606_PWMC1_PWMDC_0_16 = 0x00,
24061 + PCF50606_PWMC1_PWMDC_1_16 = 0x02,
24062 + PCF50606_PWMC1_PWMDC_2_16 = 0x04,
24063 + PCF50606_PWMC1_PWMDC_3_16 = 0x06,
24064 + PCF50606_PWMC1_PWMDC_4_16 = 0x08,
24065 + PCF50606_PWMC1_PWMDC_5_16 = 0x0a,
24066 + PCF50606_PWMC1_PWMDC_6_16 = 0x0c,
24067 + PCF50606_PWMC1_PWMDC_7_16 = 0x0e,
24068 + PCF50606_PWMC1_PWMDC_8_16 = 0x10,
24069 + PCF50606_PWMC1_PWMDC_9_16 = 0x12,
24070 + PCF50606_PWMC1_PWMDC_10_16 = 0x14,
24071 + PCF50606_PWMC1_PWMDC_11_16 = 0x16,
24072 + PCF50606_PWMC1_PWMDC_12_16 = 0x18,
24073 + PCF50606_PWMC1_PWMDC_13_16 = 0x1a,
24074 + PCF50606_PWMC1_PWMDC_14_16 = 0x1c,
24075 + PCF50606_PWMC1_PWMDC_15_16 = 0x1e,
24076 + PCF50606_PWMC1_PRESC_512Hz = 0x20,
24077 + PCF50606_PWMC1_PRESC_256Hz = 0x40,
24078 + PCF50606_PWMC1_PRESC_64Hz = 0x60,
24079 + PCF50606_PWMC1_PRESC_56kHz = 0x80,
24080 + PCF50606_PWMC1_PRESC_28kHz = 0xa0,
24081 + PCF50606_PWMC1_PRESC_14kHz = 0xc0,
24082 + PCF50606_PWMC1_PRESC_7kHz = 0xe0,
24083 +};
24084 +#define PCF50606_PWMC1_CLK_SHIFT 5
24085 +#define PCF50606_PWMC1_DC_SHIFT 1
24086 +
24087 +#endif /* _PCF50606_H */
24088 +
24089 Index: linux-2.6.24.7/drivers/i2c/chips/pcf50633.c
24090 ===================================================================
24091 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
24092 +++ linux-2.6.24.7/drivers/i2c/chips/pcf50633.c 2008-12-11 22:46:49.000000000 +0100
24093 @@ -0,0 +1,2713 @@
24094 +/* Philips PCF50633 Power Management Unit (PMU) driver
24095 + *
24096 + * (C) 2006-2007 by Openmoko, Inc.
24097 + * Author: Harald Welte <laforge@openmoko.org>
24098 + * All rights reserved.
24099 + *
24100 + * This program is free software; you can redistribute it and/or
24101 + * modify it under the terms of the GNU General Public License as
24102 + * published by the Free Software Foundation; either version 2 of
24103 + * the License, or (at your option) any later version.
24104 + *
24105 + * This program is distributed in the hope that it will be useful,
24106 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
24107 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24108 + * GNU General Public License for more details.
24109 + *
24110 + * You should have received a copy of the GNU General Public License
24111 + * along with this program; if not, write to the Free Software
24112 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
24113 + * MA 02111-1307 USA
24114 + *
24115 + * This driver is a monster ;) It provides the following features
24116 + * - voltage control for a dozen different voltage domains
24117 + * - charging control for main and backup battery
24118 + * - rtc / alarm
24119 + * - adc driver (hw_sensors like)
24120 + * - backlight
24121 + *
24122 + */
24123 +
24124 +#include <linux/module.h>
24125 +#include <linux/init.h>
24126 +#include <linux/i2c.h>
24127 +#include <linux/types.h>
24128 +#include <linux/interrupt.h>
24129 +#include <linux/irq.h>
24130 +#include <linux/workqueue.h>
24131 +#include <linux/delay.h>
24132 +#include <linux/rtc.h>
24133 +#include <linux/bcd.h>
24134 +#include <linux/watchdog.h>
24135 +#include <linux/miscdevice.h>
24136 +#include <linux/input.h>
24137 +#include <linux/fb.h>
24138 +#include <linux/backlight.h>
24139 +#include <linux/sched.h>
24140 +#include <linux/platform_device.h>
24141 +#include <linux/pcf50633.h>
24142 +#include <linux/apm-emulation.h>
24143 +#include <linux/jiffies.h>
24144 +
24145 +#include <asm/mach-types.h>
24146 +
24147 +#include "pcf50633.h"
24148 +#include <linux/resume-dependency.h>
24149 +
24150 +#if 0
24151 +#define DEBUGP(x, args ...) printk("%s: " x, __FUNCTION__, ## args)
24152 +#define DEBUGPC(x, args ...) printk(x, ## args)
24153 +#else
24154 +#define DEBUGP(x, args ...)
24155 +#define DEBUGPC(x, args ...)
24156 +#endif
24157 +
24158 +/***********************************************************************
24159 + * Static data / structures
24160 + ***********************************************************************/
24161 +
24162 +static unsigned short normal_i2c[] = { 0x73, I2C_CLIENT_END };
24163 +
24164 +I2C_CLIENT_INSMOD_1(pcf50633);
24165 +
24166 +#define PCF50633_FIDX_CHG_ENABLED 0 /* Charger enabled */
24167 +#define PCF50633_FIDX_CHG_PRESENT 1 /* Charger present */
24168 +#define PCF50633_FIDX_CHG_ERR 3 /* Charger Error */
24169 +#define PCF50633_FIDX_CHG_PROT 4 /* Charger Protection */
24170 +#define PCF50633_FIDX_CHG_READY 5 /* Charging completed */
24171 +#define PCF50633_FIDX_PWR_PRESSED 8
24172 +#define PCF50633_FIDX_RTC_SECOND 9
24173 +#define PCF50633_FIDX_USB_PRESENT 10
24174 +
24175 +#define PCF50633_F_CHG_ENABLED (1 << PCF50633_FIDX_CHG_ENABLED)
24176 +#define PCF50633_F_CHG_PRESENT (1 << PCF50633_FIDX_CHG_PRESENT)
24177 +#define PCF50633_F_CHG_ERR (1 << PCF50633_FIDX_CHG_ERR)
24178 +#define PCF50633_F_CHG_PROT (1 << PCF50633_FIDX_CHG_PROT)
24179 +#define PCF50633_F_CHG_READY (1 << PCF50633_FIDX_CHG_READY)
24180 +
24181 +#define PCF50633_F_CHG_MASK 0x000000fc
24182 +
24183 +#define PCF50633_F_PWR_PRESSED (1 << PCF50633_FIDX_PWR_PRESSED)
24184 +#define PCF50633_F_RTC_SECOND (1 << PCF50633_FIDX_RTC_SECOND)
24185 +#define PCF50633_F_USB_PRESENT (1 << PCF50633_FIDX_USB_PRESENT)
24186 +
24187 +enum close_state {
24188 + CLOSE_STATE_NOT,
24189 + CLOSE_STATE_ALLOW = 0x2342,
24190 +};
24191 +
24192 +enum charger_type {
24193 + CHARGER_TYPE_NONE = 0,
24194 + CHARGER_TYPE_HOSTUSB,
24195 + CHARGER_TYPE_1A
24196 +};
24197 +
24198 +#define ADC_NOM_CHG_DETECT_1A 6
24199 +#define ADC_NOM_CHG_DETECT_NONE 43
24200 +
24201 +#define MAX_ADC_FIFO_DEPTH 8
24202 +
24203 +enum pcf50633_suspend_states {
24204 + PCF50633_SS_RUNNING,
24205 + PCF50633_SS_STARTING_SUSPEND,
24206 + PCF50633_SS_COMPLETED_SUSPEND,
24207 + PCF50633_SS_RESUMING_BUT_NOT_US_YET,
24208 + PCF50633_SS_STARTING_RESUME,
24209 + PCF50633_SS_COMPLETED_RESUME,
24210 +};
24211 +
24212 +
24213 +struct pcf50633_data {
24214 + struct i2c_client client;
24215 + struct pcf50633_platform_data *pdata;
24216 + struct backlight_device *backlight;
24217 + struct mutex lock;
24218 + unsigned int flags;
24219 + unsigned int working;
24220 + struct mutex working_lock;
24221 + struct work_struct work;
24222 + struct rtc_device *rtc;
24223 + struct input_dev *input_dev;
24224 + int allow_close;
24225 + int onkey_seconds;
24226 + int irq;
24227 + enum pcf50633_suspend_states suspend_state;
24228 + int usb_removal_count;
24229 + u8 pcfirq_resume[5];
24230 + int probe_completed;
24231 + int suppress_onkey_events;
24232 +
24233 + /* if he pulls battery while charging, we notice that and correctly
24234 + * report that the charger is idle. But there is no interrupt that
24235 + * fires if he puts a battery back in and charging resumes. So when
24236 + * the battery is pulled, we run this work function looking for
24237 + * either charger resumption or USB cable pull
24238 + */
24239 + struct mutex working_lock_nobat;
24240 + struct work_struct work_nobat;
24241 + int working_nobat;
24242 + int usb_removal_count_nobat;
24243 + int jiffies_last_bat_ins;
24244 +
24245 + /* current limit notification handler stuff */
24246 + struct mutex working_lock_usb_curlimit;
24247 + struct work_struct work_usb_curlimit;
24248 + int pending_curlimit;
24249 + int usb_removal_count_usb_curlimit;
24250 +
24251 + int last_curlim_set;
24252 +
24253 + int coldplug_done; /* cleared by probe, set by first work service */
24254 + int flag_bat_voltage_read; /* ipc to /sys batt voltage read func */
24255 +
24256 + int charger_adc_result_raw;
24257 + enum charger_type charger_type;
24258 +
24259 + /* we have a FIFO of ADC measurement requests that are used only by
24260 + * the workqueue service code after the ADC completion interrupt
24261 + */
24262 + int adc_queue_mux[MAX_ADC_FIFO_DEPTH]; /* which ADC input to use */
24263 + int adc_queue_avg[MAX_ADC_FIFO_DEPTH]; /* amount of averaging */
24264 + int adc_queue_head; /* head owned by foreground code */
24265 + int adc_queue_tail; /* tail owned by service code */
24266 +
24267 +#ifdef CONFIG_PM
24268 + struct {
24269 + u_int8_t ooctim2;
24270 + /* enables are always [1] below
24271 + * I2C has limit of 32 sequential regs, so done in two lumps
24272 + * because it covers 33 register extent otherwise
24273 + */
24274 + u_int8_t misc[PCF50633_REG_LEDDIM - PCF50633_REG_AUTOOUT + 1];
24275 + /* skip 1 reserved reg here */
24276 + u_int8_t ldo[PCF50633_REG_HCLDOENA - PCF50633_REG_LDO1OUT + 1];
24277 + } standby_regs;
24278 +
24279 + struct resume_dependency resume_dependency;
24280 + int is_suspended;
24281 +
24282 +#endif
24283 +};
24284 +
24285 +static struct i2c_driver pcf50633_driver;
24286 +
24287 +struct pcf50633_data *pcf50633_global;
24288 +EXPORT_SYMBOL_GPL(pcf50633_global);
24289 +
24290 +static struct platform_device *pcf50633_pdev;
24291 +
24292 +static void pcf50633_usb_curlim_set(struct pcf50633_data *pcf, int ma);
24293 +static void pcf50633_charge_enable(struct pcf50633_data *pcf, int on);
24294 +
24295 +
24296 +/***********************************************************************
24297 + * Low-Level routines
24298 + ***********************************************************************/
24299 +
24300 +static int __reg_write(struct pcf50633_data *pcf, u_int8_t reg, u_int8_t val)
24301 +{
24302 + if (pcf->suspend_state == PCF50633_SS_COMPLETED_SUSPEND) {
24303 + dev_err(&pcf->client.dev, "__reg_write while suspended\n");
24304 + dump_stack();
24305 + }
24306 + return i2c_smbus_write_byte_data(&pcf->client, reg, val);
24307 +}
24308 +
24309 +static int reg_write(struct pcf50633_data *pcf, u_int8_t reg, u_int8_t val)
24310 +{
24311 + int ret;
24312 +
24313 + mutex_lock(&pcf->lock);
24314 + ret = __reg_write(pcf, reg, val);
24315 + mutex_unlock(&pcf->lock);
24316 +
24317 + return ret;
24318 +}
24319 +
24320 +static int32_t __reg_read(struct pcf50633_data *pcf, u_int8_t reg)
24321 +{
24322 + int32_t ret;
24323 +
24324 + if (pcf->suspend_state == PCF50633_SS_COMPLETED_SUSPEND) {
24325 + dev_err(&pcf->client.dev, "__reg_read while suspended\n");
24326 + dump_stack();
24327 + }
24328 + ret = i2c_smbus_read_byte_data(&pcf->client, reg);
24329 +
24330 + return ret;
24331 +}
24332 +
24333 +static u_int8_t reg_read(struct pcf50633_data *pcf, u_int8_t reg)
24334 +{
24335 + int32_t ret;
24336 +
24337 + mutex_lock(&pcf->lock);
24338 + ret = __reg_read(pcf, reg);
24339 + mutex_unlock(&pcf->lock);
24340 +
24341 + return ret & 0xff;
24342 +}
24343 +
24344 +static int reg_set_bit_mask(struct pcf50633_data *pcf,
24345 + u_int8_t reg, u_int8_t mask, u_int8_t val)
24346 +{
24347 + int ret;
24348 + u_int8_t tmp;
24349 +
24350 + val &= mask;
24351 +
24352 + mutex_lock(&pcf->lock);
24353 +
24354 + tmp = __reg_read(pcf, reg);
24355 + tmp &= ~mask;
24356 + tmp |= val;
24357 + ret = __reg_write(pcf, reg, tmp);
24358 +
24359 + mutex_unlock(&pcf->lock);
24360 +
24361 + return ret;
24362 +}
24363 +
24364 +static int reg_clear_bits(struct pcf50633_data *pcf, u_int8_t reg, u_int8_t val)
24365 +{
24366 + int ret;
24367 + u_int8_t tmp;
24368 +
24369 + mutex_lock(&pcf->lock);
24370 +
24371 + tmp = __reg_read(pcf, reg);
24372 + tmp &= ~val;
24373 + ret = __reg_write(pcf, reg, tmp);
24374 +
24375 + mutex_unlock(&pcf->lock);
24376 +
24377 + return ret;
24378 +}
24379 +
24380 +/* asynchronously setup reading one ADC channel */
24381 +static void async_adc_read_setup(struct pcf50633_data *pcf,
24382 + int channel, int avg)
24383 +{
24384 + channel &= PCF50633_ADCC1_ADCMUX_MASK;
24385 +
24386 + /* kill ratiometric, but enable ACCSW biasing */
24387 + __reg_write(pcf, PCF50633_REG_ADCC2, 0x00);
24388 + __reg_write(pcf, PCF50633_REG_ADCC3, 0x01);
24389 +
24390 + /* start ADC conversion of selected channel */
24391 + __reg_write(pcf, PCF50633_REG_ADCC1, channel | avg |
24392 + PCF50633_ADCC1_ADCSTART | PCF50633_ADCC1_RES_10BIT);
24393 +
24394 +}
24395 +
24396 +static u_int16_t async_adc_complete(struct pcf50633_data *pcf)
24397 +{
24398 + u_int16_t ret = (__reg_read(pcf, PCF50633_REG_ADCS1) << 2) |
24399 + (__reg_read(pcf, PCF50633_REG_ADCS3) &
24400 + PCF50633_ADCS3_ADCDAT1L_MASK);
24401 +
24402 + DEBUGPC("adc result = %d\n", ret);
24403 +
24404 + return ret;
24405 +}
24406 +
24407 +
24408 +
24409 +
24410 +/***********************************************************************
24411 + * Voltage / ADC
24412 + ***********************************************************************/
24413 +
24414 +static u_int8_t auto_voltage(unsigned int millivolts)
24415 +{
24416 + if (millivolts < 1800)
24417 + return 0;
24418 + if (millivolts > 3800)
24419 + return 0xff;
24420 +
24421 + millivolts -= 625;
24422 + return millivolts/25;
24423 +}
24424 +
24425 +static unsigned int auto_2voltage(u_int8_t bits)
24426 +{
24427 + if (bits < 0x2f)
24428 + return 0;
24429 + return 625 + (bits * 25);
24430 +}
24431 +
24432 +static u_int8_t down_voltage(unsigned int millivolts)
24433 +{
24434 + if (millivolts < 625)
24435 + return 0;
24436 + else if (millivolts > 3000)
24437 + return 0xff;
24438 +
24439 + millivolts -= 625;
24440 + return millivolts/25;
24441 +}
24442 +
24443 +static unsigned int down_2voltage(u_int8_t bits)
24444 +{
24445 + return 625 + (bits*25);
24446 +}
24447 +
24448 +static u_int8_t ldo_voltage(unsigned int millivolts)
24449 +{
24450 + if (millivolts < 900)
24451 + return 0;
24452 + else if (millivolts > 3600)
24453 + return 0x1f;
24454 +
24455 + millivolts -= 900;
24456 + return millivolts/100;
24457 +}
24458 +
24459 +static unsigned int ldo_2voltage(u_int8_t bits)
24460 +{
24461 + bits &= 0x1f;
24462 + return 900 + (bits * 100);
24463 +}
24464 +
24465 +static const u_int8_t regulator_registers[__NUM_PCF50633_REGULATORS] = {
24466 + [PCF50633_REGULATOR_AUTO] = PCF50633_REG_AUTOOUT,
24467 + [PCF50633_REGULATOR_DOWN1] = PCF50633_REG_DOWN1OUT,
24468 + [PCF50633_REGULATOR_DOWN2] = PCF50633_REG_DOWN2OUT,
24469 + [PCF50633_REGULATOR_MEMLDO] = PCF50633_REG_MEMLDOOUT,
24470 + [PCF50633_REGULATOR_LDO1] = PCF50633_REG_LDO1OUT,
24471 + [PCF50633_REGULATOR_LDO2] = PCF50633_REG_LDO2OUT,
24472 + [PCF50633_REGULATOR_LDO3] = PCF50633_REG_LDO3OUT,
24473 + [PCF50633_REGULATOR_LDO4] = PCF50633_REG_LDO4OUT,
24474 + [PCF50633_REGULATOR_LDO5] = PCF50633_REG_LDO5OUT,
24475 + [PCF50633_REGULATOR_LDO6] = PCF50633_REG_LDO6OUT,
24476 + [PCF50633_REGULATOR_HCLDO] = PCF50633_REG_HCLDOOUT,
24477 +};
24478 +
24479 +int pcf50633_onoff_set(struct pcf50633_data *pcf,
24480 + enum pcf50633_regulator_id reg, int on)
24481 +{
24482 + u_int8_t addr;
24483 +
24484 + if (reg >= __NUM_PCF50633_REGULATORS)
24485 + return -EINVAL;
24486 +
24487 + /* the *ENA register is always one after the *OUT register */
24488 + addr = regulator_registers[reg] + 1;
24489 +
24490 + if (on == 0)
24491 + reg_set_bit_mask(pcf, addr, PCF50633_REGULATOR_ON, 0);
24492 + else
24493 + reg_set_bit_mask(pcf, addr, PCF50633_REGULATOR_ON,
24494 + PCF50633_REGULATOR_ON);
24495 +
24496 + return 0;
24497 +}
24498 +EXPORT_SYMBOL_GPL(pcf50633_onoff_set);
24499 +
24500 +int pcf50633_onoff_get(struct pcf50633_data *pcf,
24501 + enum pcf50633_regulator_id reg)
24502 +{
24503 + u_int8_t val, addr;
24504 +
24505 + if (reg >= __NUM_PCF50633_REGULATORS)
24506 + return -EINVAL;
24507 +
24508 + /* the *ENA register is always one after the *OUT register */
24509 + addr = regulator_registers[reg] + 1;
24510 + val = reg_read(pcf, addr) & PCF50633_REGULATOR_ON;
24511 +
24512 + return val;
24513 +}
24514 +EXPORT_SYMBOL_GPL(pcf50633_onoff_get);
24515 +
24516 +int pcf50633_voltage_set(struct pcf50633_data *pcf,
24517 + enum pcf50633_regulator_id reg,
24518 + unsigned int millivolts)
24519 +{
24520 + u_int8_t volt_bits;
24521 + u_int8_t regnr;
24522 +
24523 + DEBUGP("pcf=%p, reg=%d, mvolts=%d\n", pcf, reg, millivolts);
24524 +
24525 + if (reg >= __NUM_PCF50633_REGULATORS)
24526 + return -EINVAL;
24527 +
24528 + regnr = regulator_registers[reg];
24529 +
24530 + if (millivolts > pcf->pdata->rails[reg].voltage.max)
24531 + return -EINVAL;
24532 +
24533 + switch (reg) {
24534 + case PCF50633_REGULATOR_AUTO:
24535 + volt_bits = auto_voltage(millivolts);
24536 + break;
24537 + case PCF50633_REGULATOR_DOWN1:
24538 + volt_bits = down_voltage(millivolts);
24539 + break;
24540 + case PCF50633_REGULATOR_DOWN2:
24541 + volt_bits = down_voltage(millivolts);
24542 + break;
24543 + case PCF50633_REGULATOR_LDO1:
24544 + case PCF50633_REGULATOR_LDO2:
24545 + case PCF50633_REGULATOR_LDO3:
24546 + case PCF50633_REGULATOR_LDO4:
24547 + case PCF50633_REGULATOR_LDO5:
24548 + case PCF50633_REGULATOR_LDO6:
24549 + case PCF50633_REGULATOR_HCLDO:
24550 + volt_bits = ldo_voltage(millivolts);
24551 + DEBUGP("ldo_voltage(0x%x)=%u\n", millivolts, volt_bits);
24552 + break;
24553 + default:
24554 + return -EINVAL;
24555 + }
24556 +
24557 + return reg_write(pcf, regnr, volt_bits);
24558 +}
24559 +EXPORT_SYMBOL_GPL(pcf50633_voltage_set);
24560 +
24561 +unsigned int pcf50633_voltage_get(struct pcf50633_data *pcf,
24562 + enum pcf50633_regulator_id reg)
24563 +{
24564 + u_int8_t volt_bits;
24565 + u_int8_t regnr;
24566 + unsigned int rc = 0;
24567 +
24568 + if (reg >= __NUM_PCF50633_REGULATORS)
24569 + return -EINVAL;
24570 +
24571 + regnr = regulator_registers[reg];
24572 + volt_bits = reg_read(pcf, regnr);
24573 +
24574 + switch (reg) {
24575 + case PCF50633_REGULATOR_AUTO:
24576 + rc = auto_2voltage(volt_bits);
24577 + break;
24578 + case PCF50633_REGULATOR_DOWN1:
24579 + rc = down_2voltage(volt_bits);
24580 + break;
24581 + case PCF50633_REGULATOR_DOWN2:
24582 + rc = down_2voltage(volt_bits);
24583 + break;
24584 + case PCF50633_REGULATOR_LDO1:
24585 + case PCF50633_REGULATOR_LDO2:
24586 + case PCF50633_REGULATOR_LDO3:
24587 + case PCF50633_REGULATOR_LDO4:
24588 + case PCF50633_REGULATOR_LDO5:
24589 + case PCF50633_REGULATOR_LDO6:
24590 + case PCF50633_REGULATOR_HCLDO:
24591 + rc = ldo_2voltage(volt_bits);
24592 + break;
24593 + default:
24594 + return -EINVAL;
24595 + }
24596 +
24597 + return rc;
24598 +}
24599 +EXPORT_SYMBOL_GPL(pcf50633_voltage_get);
24600 +
24601 +/* go into 'STANDBY' mode, i.e. power off the main CPU and peripherals */
24602 +void pcf50633_go_standby(void)
24603 +{
24604 + reg_set_bit_mask(pcf50633_global, PCF50633_REG_OOCSHDWN,
24605 + PCF50633_OOCSHDWN_GOSTDBY, PCF50633_OOCSHDWN_GOSTDBY);
24606 +}
24607 +EXPORT_SYMBOL_GPL(pcf50633_go_standby);
24608 +
24609 +void pcf50633_gpio_set(struct pcf50633_data *pcf, enum pcf50633_gpio gpio,
24610 + int on)
24611 +{
24612 + u_int8_t reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
24613 +
24614 + if (on)
24615 + reg_set_bit_mask(pcf, reg, 0x0f, 0x07);
24616 + else
24617 + reg_set_bit_mask(pcf, reg, 0x0f, 0x00);
24618 +}
24619 +EXPORT_SYMBOL_GPL(pcf50633_gpio_set);
24620 +
24621 +int pcf50633_gpio_get(struct pcf50633_data *pcf, enum pcf50633_gpio gpio)
24622 +{
24623 + u_int8_t reg = gpio - PCF50633_GPIO1 + PCF50633_REG_GPIO1CFG;
24624 + u_int8_t val = reg_read(pcf, reg) & 0x0f;
24625 +
24626 + if (val == PCF50633_GPOCFG_GPOSEL_1 ||
24627 + val == (PCF50633_GPOCFG_GPOSEL_0|PCF50633_GPOCFG_GPOSEL_INVERSE))
24628 + return 1;
24629 +
24630 + return 0;
24631 +}
24632 +EXPORT_SYMBOL_GPL(pcf50633_gpio_get);
24633 +
24634 +static int interpret_charger_type_from_adc(struct pcf50633_data *pcf,
24635 + int sample)
24636 +{
24637 + /* 1A capable charger? */
24638 +
24639 + if (sample < ((ADC_NOM_CHG_DETECT_NONE + ADC_NOM_CHG_DETECT_1A) / 2))
24640 + return CHARGER_TYPE_1A;
24641 +
24642 + /* well then, nothing in the USB hole, or USB host / unk adapter */
24643 +
24644 + if (pcf->flags & PCF50633_F_USB_PRESENT) /* ooh power is in there */
24645 + return CHARGER_TYPE_HOSTUSB; /* HOSTUSB is the catchall */
24646 +
24647 + return CHARGER_TYPE_NONE; /* no really -- nothing in there */
24648 +}
24649 +
24650 +
24651 +
24652 +static void configure_pmu_for_charger(struct pcf50633_data *pcf,
24653 + enum charger_type type)
24654 +{
24655 + switch (type) {
24656 + case CHARGER_TYPE_NONE:
24657 + pcf50633_usb_curlim_set(pcf, 0);
24658 + break;
24659 + /*
24660 + * the PCF50633 has a feature that it will supply only excess current
24661 + * from the charger that is not used to power the device. So this
24662 + * 500mA setting is "up to 500mA" according to that.
24663 + */
24664 + case CHARGER_TYPE_HOSTUSB:
24665 + /* USB subsystem should call pcf50633_usb_curlim_set to set
24666 + * what was negotiated with the host when it is enumerated
24667 + * successfully. If we get called again after a good
24668 + * negotiation, we keep what was negotiated. (Removal of
24669 + * USB plug destroys pcf->last_curlim_set to 0)
24670 + */
24671 + if (pcf->last_curlim_set > 100)
24672 + pcf50633_usb_curlim_set(pcf, pcf->last_curlim_set);
24673 + else
24674 + pcf50633_usb_curlim_set(pcf, 100);
24675 + break;
24676 + case CHARGER_TYPE_1A:
24677 + pcf50633_usb_curlim_set(pcf, 1000);
24678 + /*
24679 + * stop GPO / EN_HOSTUSB power driving out on the same
24680 + * USB power pins we have a 1A charger on right now!
24681 + */
24682 + dev_dbg(&pcf->client.dev, "Charger -> CHARGER_TYPE_1A\n");
24683 + __reg_write(pcf, PCF50633_GPO - PCF50633_GPIO1 +
24684 + PCF50633_REG_GPIO1CFG,
24685 + __reg_read(pcf, PCF50633_GPO - PCF50633_GPIO1 +
24686 + PCF50633_REG_GPIO1CFG) & 0xf0);
24687 + break;
24688 + }
24689 +
24690 + /* max out USB fast charge current -- actual current drawn is
24691 + * additionally limited by USB limit so no worries
24692 + */
24693 + __reg_write(pcf, PCF50633_REG_MBCC5, 0xff);
24694 +
24695 +}
24696 +
24697 +static void trigger_next_adc_job_if_any(struct pcf50633_data *pcf)
24698 +{
24699 + if (pcf->adc_queue_head == pcf->adc_queue_tail)
24700 + return;
24701 + async_adc_read_setup(pcf,
24702 + pcf->adc_queue_mux[pcf->adc_queue_tail],
24703 + pcf->adc_queue_avg[pcf->adc_queue_tail]);
24704 +}
24705 +
24706 +static void add_request_to_adc_queue(struct pcf50633_data *pcf,
24707 + int mux, int avg)
24708 +{
24709 + int old_head = pcf->adc_queue_head;
24710 + pcf->adc_queue_mux[pcf->adc_queue_head] = mux;
24711 + pcf->adc_queue_avg[pcf->adc_queue_head] = avg;
24712 +
24713 + pcf->adc_queue_head = (pcf->adc_queue_head + 1) &
24714 + (MAX_ADC_FIFO_DEPTH - 1);
24715 +
24716 + /* it was idle before we just added this? we need to kick it then */
24717 + if (old_head == pcf->adc_queue_tail)
24718 + trigger_next_adc_job_if_any(pcf);
24719 +}
24720 +
24721 +/*
24722 + * we get run to handle servicing the async notification from USB stack that
24723 + * we got enumerated and allowed to draw a particular amount of current
24724 + */
24725 +
24726 +static void pcf50633_work_usbcurlim(struct work_struct *work)
24727 +{
24728 + struct pcf50633_data *pcf =
24729 + container_of(work, struct pcf50633_data, work_usb_curlimit);
24730 +
24731 + mutex_lock(&pcf->working_lock_usb_curlimit);
24732 +
24733 + /* just can't cope with it if we are suspending, don't reschedule */
24734 + if ((pcf->suspend_state == PCF50633_SS_STARTING_SUSPEND) ||
24735 + (pcf->suspend_state == PCF50633_SS_COMPLETED_SUSPEND))
24736 + goto bail;
24737 +
24738 + dev_dbg(&pcf->client.dev, "pcf50633_work_usbcurlim\n");
24739 +
24740 + if (!pcf->probe_completed)
24741 + goto reschedule;
24742 +
24743 + /* we got a notification from USB stack before we completed resume...
24744 + * that can only make trouble, reschedule for a retry
24745 + */
24746 + if (pcf->suspend_state &&
24747 + (pcf->suspend_state < PCF50633_SS_COMPLETED_RESUME))
24748 + goto reschedule;
24749 +
24750 + /*
24751 + * did he pull USB before we managed to set the limit?
24752 + */
24753 + if (pcf->usb_removal_count_usb_curlimit != pcf->usb_removal_count)
24754 + goto bail;
24755 +
24756 + /* OK let's set the requested limit and finish */
24757 +
24758 + dev_dbg(&pcf->client.dev, "pcf50633_work_usbcurlim setting %dmA\n",
24759 + pcf->pending_curlimit);
24760 + pcf50633_usb_curlim_set(pcf, pcf->pending_curlimit);
24761 +
24762 +bail:
24763 + mutex_unlock(&pcf->working_lock_usb_curlimit);
24764 + return;
24765 +
24766 +reschedule:
24767 + dev_dbg(&pcf->client.dev, "pcf50633_work_usbcurlim rescheduling\n");
24768 + if (!schedule_work(&pcf->work_usb_curlimit))
24769 + dev_err(&pcf->client.dev, "curlim reschedule work "
24770 + "already queued\n");
24771 +
24772 + mutex_unlock(&pcf->working_lock_usb_curlimit);
24773 + /* don't spew, delaying whatever else is happening */
24774 + msleep(1);
24775 +}
24776 +
24777 +
24778 +/* this is an export to allow machine to set USB current limit according to
24779 + * notifications of USB stack about enumeration state. We spawn a work
24780 + * function to handle the actual setting, because suspend / resume and such
24781 + * can be in a bad state since this gets called externally asychronous to
24782 + * anything else going on in pcf50633.
24783 + */
24784 +
24785 +int pcf50633_notify_usb_current_limit_change(struct pcf50633_data *pcf,
24786 + unsigned int ma)
24787 +{
24788 + /* can happen if he calls with pcf50633_global before probe
24789 + * have to bail with error since we can't even schedule the work
24790 + */
24791 + if (!pcf) {
24792 + printk(KERN_ERR "pcf50633_notify_usb_current_limit called with NULL pcf\n");
24793 + return -EBUSY;
24794 + }
24795 +
24796 + dev_dbg(&pcf->client.dev,
24797 + "pcf50633_notify_usb_current_limit_change %dmA\n", ma);
24798 +
24799 + /* prepare to detect USB power removal before we complete */
24800 + pcf->usb_removal_count_usb_curlimit = pcf->usb_removal_count;
24801 +
24802 + pcf->pending_curlimit = ma;
24803 +
24804 + if (!schedule_work(&pcf->work_usb_curlimit))
24805 + dev_err(&pcf->client.dev, "curlim work item already queued\n");
24806 +
24807 + return 0;
24808 +}
24809 +EXPORT_SYMBOL_GPL(pcf50633_notify_usb_current_limit_change);
24810 +
24811 +
24812 +/* we are run when we see a NOBAT situation, because there is no interrupt
24813 + * source in pcf50633 that triggers on resuming charging. It watches to see
24814 + * if charging resumes, it reassesses the charging source if it does. If the
24815 + * USB power disappears, it is also a sign there must be a battery and it is
24816 + * NOT being charged, so it exits since the next move must be USB insertion for
24817 + * change of charger state
24818 + */
24819 +
24820 +static void pcf50633_work_nobat(struct work_struct *work)
24821 +{
24822 + struct pcf50633_data *pcf =
24823 + container_of(work, struct pcf50633_data, work_nobat);
24824 +
24825 + mutex_lock(&pcf->working_lock_nobat);
24826 + pcf->working_nobat = 1;
24827 + mutex_unlock(&pcf->working_lock_nobat);
24828 +
24829 + while (1) {
24830 + msleep(1000);
24831 +
24832 + if (pcf->suspend_state != PCF50633_SS_RUNNING)
24833 + continue;
24834 +
24835 + /* there's a battery in there now? */
24836 + if (reg_read(pcf, PCF50633_REG_MBCS3) & 0x40) {
24837 +
24838 + pcf->jiffies_last_bat_ins = jiffies;
24839 +
24840 + /* figure out our charging stance */
24841 + add_request_to_adc_queue(pcf, PCF50633_ADCC1_MUX_ADCIN1,
24842 + PCF50633_ADCC1_AVERAGE_16);
24843 + goto bail;
24844 + }
24845 +
24846 + /* he pulled USB cable since we were started? exit then */
24847 + if (pcf->usb_removal_count_nobat != pcf->usb_removal_count)
24848 + goto bail;
24849 + }
24850 +
24851 +bail:
24852 + mutex_lock(&pcf->working_lock_nobat);
24853 + pcf->working_nobat = 0;
24854 + mutex_unlock(&pcf->working_lock_nobat);
24855 +}
24856 +
24857 +
24858 +static void pcf50633_work(struct work_struct *work)
24859 +{
24860 + struct pcf50633_data *pcf =
24861 + container_of(work, struct pcf50633_data, work);
24862 + u_int8_t pcfirq[5];
24863 + int ret;
24864 + int tail;
24865 +
24866 + mutex_lock(&pcf->working_lock);
24867 + pcf->working = 1;
24868 +
24869 + /* sanity */
24870 + if (!&pcf->client.dev)
24871 + goto bail;
24872 +
24873 + /*
24874 + * if we are presently suspending, we are not in a position to deal
24875 + * with pcf50633 interrupts at all.
24876 + *
24877 + * Because we didn't clear the int pending registers, there will be
24878 + * no edge / interrupt waiting for us when we wake. But it is OK
24879 + * because at the end of our resume, we call this workqueue function
24880 + * gratuitously, clearing the pending register and re-enabling
24881 + * servicing this interrupt.
24882 + */
24883 +
24884 + if ((pcf->suspend_state == PCF50633_SS_STARTING_SUSPEND) ||
24885 + (pcf->suspend_state == PCF50633_SS_COMPLETED_SUSPEND))
24886 + goto bail;
24887 +
24888 + /*
24889 + * If we are inside suspend -> resume completion time we don't attempt
24890 + * service until we have fully resumed. Although we could talk to the
24891 + * device as soon as I2C is up, the regs in the device which we might
24892 + * choose to modify as part of the service action have not been
24893 + * reloaded with their pre-suspend states yet. Therefore we will
24894 + * defer our service if we are called like that until our resume has
24895 + * completed.
24896 + *
24897 + * This shouldn't happen any more because we disable servicing this
24898 + * interrupt in suspend and don't re-enable it until resume is
24899 + * completed.
24900 + */
24901 +
24902 + if (pcf->suspend_state &&
24903 + (pcf->suspend_state != PCF50633_SS_COMPLETED_RESUME))
24904 + goto reschedule;
24905 +
24906 + /* this is the case early in resume! Sanity check! */
24907 + if (i2c_get_clientdata(&pcf->client) == NULL)
24908 + goto reschedule;
24909 +
24910 + /*
24911 + * datasheet says we have to read the five IRQ
24912 + * status regs in one transaction
24913 + */
24914 + ret = i2c_smbus_read_i2c_block_data(&pcf->client,
24915 + PCF50633_REG_INT1,
24916 + sizeof(pcfirq),
24917 + pcfirq);
24918 + if (ret != sizeof(pcfirq)) {
24919 + dev_dbg(&pcf->client.dev,
24920 + "Oh crap PMU IRQ register read failed -- "
24921 + "retrying later %d\n", ret);
24922 + /*
24923 + * it shouldn't fail, we no longer attempt to use
24924 + * I2C while it can be suspended. But we don't have
24925 + * much option but to retry if if it ever did fail,
24926 + * because if we don't service the interrupt to clear
24927 + * it, we will never see another PMU interrupt edge.
24928 + */
24929 + goto reschedule;
24930 + }
24931 +
24932 + /* hey did we just resume? (because we don't get here unless we are
24933 + * running normally or the first call after resumption)
24934 + */
24935 +
24936 + if (pcf->suspend_state != PCF50633_SS_RUNNING) {
24937 + /*
24938 + * grab a copy of resume interrupt reasons
24939 + * from pcf50633 POV
24940 + */
24941 + memcpy(pcf->pcfirq_resume, pcfirq, sizeof(pcf->pcfirq_resume));
24942 +
24943 + /* pcf50633 resume is really really over now then */
24944 + pcf->suspend_state = PCF50633_SS_RUNNING;
24945 +
24946 + /* peek at the IRQ reason, if power button then set a flag
24947 + * so that we do not signal the event to userspace
24948 + */
24949 + if (pcfirq[1] & (PCF50633_INT2_ONKEYF | PCF50633_INT2_ONKEYR)) {
24950 + pcf->suppress_onkey_events = 1;
24951 + DEBUGP("Wake by ONKEY, suppressing ONKEY event");
24952 + } else {
24953 + pcf->suppress_onkey_events = 0;
24954 + }
24955 + }
24956 +
24957 + if (!pcf->coldplug_done) {
24958 + DEBUGP("PMU Coldplug init\n");
24959 +
24960 + /* we used SECOND to kick ourselves started -- turn it off */
24961 + pcfirq[0] &= ~PCF50633_INT1_SECOND;
24962 + reg_set_bit_mask(pcf, PCF50633_REG_INT1M,
24963 + PCF50633_INT1_SECOND,
24964 + PCF50633_INT1_SECOND);
24965 +
24966 + /* coldplug the USB if present */
24967 + if ((__reg_read(pcf, PCF50633_REG_MBCS1) &
24968 + (PCF50633_MBCS1_USBPRES | PCF50633_MBCS1_USBOK)) ==
24969 + (PCF50633_MBCS1_USBPRES | PCF50633_MBCS1_USBOK)) {
24970 + DEBUGPC("COLD USBINS\n");
24971 + input_report_key(pcf->input_dev, KEY_POWER2, 1);
24972 + apm_queue_event(APM_POWER_STATUS_CHANGE);
24973 + pcf->flags |= PCF50633_F_USB_PRESENT;
24974 + if (pcf->pdata->cb)
24975 + pcf->pdata->cb(&pcf->client.dev,
24976 + PCF50633_FEAT_MBC, PMU_EVT_USB_INSERT);
24977 + }
24978 +
24979 + /* figure out our initial charging stance */
24980 + add_request_to_adc_queue(pcf, PCF50633_ADCC1_MUX_ADCIN1,
24981 + PCF50633_ADCC1_AVERAGE_16);
24982 +
24983 + pcf->coldplug_done = 1;
24984 + }
24985 +
24986 + DEBUGP("INT1=0x%02x INT2=0x%02x INT3=0x%02x INT4=0x%02x INT5=0x%02x\n",
24987 + pcfirq[0], pcfirq[1], pcfirq[2], pcfirq[3], pcfirq[4]);
24988 +
24989 + if (pcfirq[0] & PCF50633_INT1_ADPINS) {
24990 + /* Charger inserted */
24991 + DEBUGPC("ADPINS ");
24992 + input_report_key(pcf->input_dev, KEY_BATTERY, 1);
24993 + apm_queue_event(APM_POWER_STATUS_CHANGE);
24994 + pcf->flags |= PCF50633_F_CHG_PRESENT;
24995 + if (pcf->pdata->cb)
24996 + pcf->pdata->cb(&pcf->client.dev,
24997 + PCF50633_FEAT_MBC, PMU_EVT_INSERT);
24998 + }
24999 + if (pcfirq[0] & PCF50633_INT1_ADPREM) {
25000 + /* Charger removed */
25001 + DEBUGPC("ADPREM ");
25002 + input_report_key(pcf->input_dev, KEY_BATTERY, 0);
25003 + apm_queue_event(APM_POWER_STATUS_CHANGE);
25004 + pcf->flags &= ~PCF50633_F_CHG_PRESENT;
25005 + if (pcf->pdata->cb)
25006 + pcf->pdata->cb(&pcf->client.dev,
25007 + PCF50633_FEAT_MBC, PMU_EVT_REMOVE);
25008 + }
25009 + if (pcfirq[0] & PCF50633_INT1_USBINS) {
25010 + DEBUGPC("USBINS ");
25011 + input_report_key(pcf->input_dev, KEY_POWER2, 1);
25012 + apm_queue_event(APM_POWER_STATUS_CHANGE);
25013 + pcf->flags |= PCF50633_F_USB_PRESENT;
25014 + if (pcf->pdata->cb)
25015 + pcf->pdata->cb(&pcf->client.dev,
25016 + PCF50633_FEAT_MBC, PMU_EVT_USB_INSERT);
25017 + msleep(500); /* debounce, allow to see any ID resistor */
25018 + /* completion irq will figure out our charging stance */
25019 + add_request_to_adc_queue(pcf, PCF50633_ADCC1_MUX_ADCIN1,
25020 + PCF50633_ADCC1_AVERAGE_16);
25021 + }
25022 + if (pcfirq[0] & PCF50633_INT1_USBREM &&
25023 + !(pcfirq[0] & PCF50633_INT1_USBINS)) {
25024 + /* the occurrence of USBINS and USBREM
25025 + * should be exclusive in one schedule work
25026 + */
25027 + DEBUGPC("USBREM ");
25028 +
25029 + pcf->usb_removal_count++;
25030 +
25031 + /* only deal if we had understood it was in */
25032 + if (pcf->flags & PCF50633_F_USB_PRESENT) {
25033 + input_report_key(pcf->input_dev, KEY_POWER2, 0);
25034 + apm_queue_event(APM_POWER_STATUS_CHANGE);
25035 + pcf->flags &= ~PCF50633_F_USB_PRESENT;
25036 +
25037 + if (pcf->pdata->cb)
25038 + pcf->pdata->cb(&pcf->client.dev,
25039 + PCF50633_FEAT_MBC, PMU_EVT_USB_REMOVE);
25040 +
25041 + /* destroy any memory of grant of power from host */
25042 + pcf->last_curlim_set = 0;
25043 +
25044 + /* completion irq will figure out our charging stance */
25045 + add_request_to_adc_queue(pcf, PCF50633_ADCC1_MUX_ADCIN1,
25046 + PCF50633_ADCC1_AVERAGE_16);
25047 + }
25048 + }
25049 + if (pcfirq[0] & PCF50633_INT1_ALARM) {
25050 + DEBUGPC("ALARM ");
25051 + if (pcf->pdata->used_features & PCF50633_FEAT_RTC)
25052 + rtc_update_irq(pcf->rtc, 1, RTC_AF | RTC_IRQF);
25053 + }
25054 + if (pcfirq[0] & PCF50633_INT1_SECOND) {
25055 + if (pcf->flags & PCF50633_F_RTC_SECOND) {
25056 + DEBUGPC("SECOND ");
25057 + rtc_update_irq(pcf->rtc, 1, RTC_PF | RTC_IRQF);
25058 + }
25059 +
25060 + if (pcf->onkey_seconds >= 0 &&
25061 + pcf->flags & PCF50633_F_PWR_PRESSED) {
25062 + DEBUGP("ONKEY_SECONDS(%u, OOCSTAT=0x%02x) ",
25063 + pcf->onkey_seconds,
25064 + reg_read(pcf, PCF50633_REG_OOCSTAT));
25065 + pcf->onkey_seconds++;
25066 + if (pcf->onkey_seconds >=
25067 + pcf->pdata->onkey_seconds_sig_init) {
25068 + /* Ask init to do 'ctrlaltdel' */
25069 + /*
25070 + * currently Linux reacts badly to issuing a
25071 + * signal to PID #1 before init is started.
25072 + * What happens is that the next kernel thread
25073 + * to start, which is the JFFS2 Garbage
25074 + * collector in our case, gets the signal
25075 + * instead and proceeds to fail to fork --
25076 + * which is very bad. Therefore we confirm
25077 + * PID #1 exists before issuing the signal
25078 + */
25079 + if (find_task_by_pid(1)) {
25080 + DEBUGPC("SIGINT(init) ");
25081 + kill_proc(1, SIGINT, 1);
25082 + }
25083 + /* FIXME: what if userspace doesn't shut down? */
25084 + }
25085 + if (pcf->onkey_seconds >=
25086 + pcf->pdata->onkey_seconds_shutdown) {
25087 + DEBUGPC("Power Off ");
25088 + pcf50633_go_standby();
25089 + }
25090 + }
25091 + }
25092 +
25093 + if (pcfirq[1] & PCF50633_INT2_ONKEYF) {
25094 + /* ONKEY falling edge (start of button press) */
25095 + pcf->flags |= PCF50633_F_PWR_PRESSED;
25096 + if (!pcf->suppress_onkey_events) {
25097 + DEBUGPC("ONKEYF ");
25098 + input_report_key(pcf->input_dev, KEY_POWER, 1);
25099 + } else {
25100 + DEBUGPC("ONKEYF(unreported) ");
25101 + }
25102 + }
25103 + if (pcfirq[1] & PCF50633_INT2_ONKEYR) {
25104 + /* ONKEY rising edge (end of button press) */
25105 + pcf->flags &= ~PCF50633_F_PWR_PRESSED;
25106 + pcf->onkey_seconds = -1;
25107 + if (!pcf->suppress_onkey_events) {
25108 + DEBUGPC("ONKEYR ");
25109 + input_report_key(pcf->input_dev, KEY_POWER, 0);
25110 + } else {
25111 + DEBUGPC("ONKEYR(unreported) ");
25112 + /* don't suppress any more power button events */
25113 + pcf->suppress_onkey_events = 0;
25114 + }
25115 + /* disable SECOND interrupt in case RTC didn't
25116 + * request it */
25117 + if (!(pcf->flags & PCF50633_F_RTC_SECOND))
25118 + reg_set_bit_mask(pcf, PCF50633_REG_INT1M,
25119 + PCF50633_INT1_SECOND,
25120 + PCF50633_INT1_SECOND);
25121 + }
25122 + /* FIXME: we don't use EXTON1/2/3. thats why we skip it */
25123 +
25124 + if (pcfirq[2] & PCF50633_INT3_BATFULL) {
25125 + DEBUGPC("BATFULL ");
25126 +
25127 + /* the problem is, we get a false BATFULL if we inserted battery
25128 + * while USB powered. Defeat BATFULL if we recently inserted
25129 + * battery
25130 + */
25131 +
25132 + if ((jiffies - pcf->jiffies_last_bat_ins) < (HZ * 2)) {
25133 +
25134 + DEBUGPC("*** Ignoring BATFULL ***\n");
25135 +
25136 + ret = reg_read(pcf, PCF50633_REG_MBCC7) &
25137 + PCF56033_MBCC7_USB_MASK;
25138 +
25139 +
25140 + reg_set_bit_mask(pcf, PCF50633_REG_MBCC7,
25141 + PCF56033_MBCC7_USB_MASK,
25142 + PCF50633_MBCC7_USB_SUSPEND);
25143 +
25144 + reg_set_bit_mask(pcf, PCF50633_REG_MBCC7,
25145 + PCF56033_MBCC7_USB_MASK,
25146 + ret);
25147 + } else {
25148 + if (pcf->pdata->cb)
25149 + pcf->pdata->cb(&pcf->client.dev,
25150 + PCF50633_FEAT_MBC, PMU_EVT_CHARGER_IDLE);
25151 + }
25152 +
25153 + /* FIXME: signal this to userspace */
25154 + }
25155 + if (pcfirq[2] & PCF50633_INT3_CHGHALT) {
25156 + DEBUGPC("CHGHALT ");
25157 + /*
25158 + * this is really "battery not pulling current" -- it can
25159 + * appear with no battery attached
25160 + */
25161 + if (pcf->pdata->cb)
25162 + pcf->pdata->cb(&pcf->client.dev,
25163 + PCF50633_FEAT_MBC, PMU_EVT_CHARGER_CHANGE);
25164 + }
25165 + if (pcfirq[2] & PCF50633_INT3_THLIMON) {
25166 + DEBUGPC("THLIMON ");
25167 + pcf->flags |= PCF50633_F_CHG_PROT;
25168 + if (pcf->pdata->cb)
25169 + pcf->pdata->cb(&pcf->client.dev,
25170 + PCF50633_FEAT_MBC, PMU_EVT_CHARGER_CHANGE);
25171 + }
25172 + if (pcfirq[2] & PCF50633_INT3_THLIMOFF) {
25173 + DEBUGPC("THLIMOFF ");
25174 + pcf->flags &= ~PCF50633_F_CHG_PROT;
25175 + if (pcf->pdata->cb)
25176 + pcf->pdata->cb(&pcf->client.dev,
25177 + PCF50633_FEAT_MBC, PMU_EVT_CHARGER_CHANGE);
25178 + }
25179 + if (pcfirq[2] & PCF50633_INT3_USBLIMON) {
25180 + DEBUGPC("USBLIMON ");
25181 + if (pcf->pdata->cb)
25182 + pcf->pdata->cb(&pcf->client.dev,
25183 + PCF50633_FEAT_MBC, PMU_EVT_CHARGER_CHANGE);
25184 + }
25185 + if (pcfirq[2] & PCF50633_INT3_USBLIMOFF) {
25186 + DEBUGPC("USBLIMOFF ");
25187 + if (pcf->pdata->cb)
25188 + pcf->pdata->cb(&pcf->client.dev,
25189 + PCF50633_FEAT_MBC, PMU_EVT_CHARGER_CHANGE);
25190 + }
25191 + if (pcfirq[2] & PCF50633_INT3_ADCRDY) {
25192 + /* ADC result ready */
25193 + DEBUGPC("ADCRDY ");
25194 + tail = pcf->adc_queue_tail;
25195 + pcf->adc_queue_tail = (pcf->adc_queue_tail + 1) &
25196 + (MAX_ADC_FIFO_DEPTH - 1);
25197 +
25198 + switch (pcf->adc_queue_mux[tail]) {
25199 + case PCF50633_ADCC1_MUX_BATSNS_RES: /* battery voltage */
25200 + pcf->flag_bat_voltage_read = async_adc_complete(pcf);
25201 + break;
25202 + case PCF50633_ADCC1_MUX_ADCIN1: /* charger type */
25203 + pcf->charger_adc_result_raw = async_adc_complete(pcf);
25204 + pcf->charger_type = interpret_charger_type_from_adc(
25205 + pcf, pcf->charger_adc_result_raw);
25206 + configure_pmu_for_charger(pcf, pcf->charger_type);
25207 + break;
25208 + default:
25209 + async_adc_complete(pcf);
25210 + break;
25211 + }
25212 + trigger_next_adc_job_if_any(pcf);
25213 + }
25214 + if (pcfirq[2] & PCF50633_INT3_ONKEY1S) {
25215 + /* ONKEY pressed for more than 1 second */
25216 + pcf->onkey_seconds = 0;
25217 + DEBUGPC("ONKEY1S ");
25218 + /* Tell PMU we are taking care of this */
25219 + reg_set_bit_mask(pcf, PCF50633_REG_OOCSHDWN,
25220 + PCF50633_OOCSHDWN_TOTRST,
25221 + PCF50633_OOCSHDWN_TOTRST);
25222 + /* enable SECOND interrupt (hz tick) */
25223 + reg_clear_bits(pcf, PCF50633_REG_INT1M, PCF50633_INT1_SECOND);
25224 + }
25225 +
25226 + if (pcfirq[3] & (PCF50633_INT4_LOWBAT|PCF50633_INT4_LOWSYS)) {
25227 + if ((__reg_read(pcf, PCF50633_REG_MBCS1) &
25228 + (PCF50633_MBCS1_USBPRES | PCF50633_MBCS1_USBOK)) ==
25229 + (PCF50633_MBCS1_USBPRES | PCF50633_MBCS1_USBOK)) {
25230 + /*
25231 + * hey no need to freak out, we have some kind of
25232 + * valid charger power to keep us going -- but note that
25233 + * we are not actually charging anything
25234 + */
25235 + if (pcf->pdata->cb)
25236 + pcf->pdata->cb(&pcf->client.dev,
25237 + PCF50633_FEAT_MBC, PMU_EVT_CHARGER_IDLE);
25238 +
25239 + reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
25240 + PCF50633_MBCC1_RESUME,
25241 + PCF50633_MBCC1_RESUME);
25242 +
25243 + /*
25244 + * Well, we are not charging anything right this second
25245 + * ... however in the next ~30s before we get the next
25246 + * NOBAT, he might insert a battery. So we schedule a
25247 + * work function checking to see if
25248 + * we started charging something during that time.
25249 + * USB removal as well as charging terminates the work
25250 + * function so we can't get terminally confused
25251 + */
25252 + mutex_lock(&pcf->working_lock_nobat);
25253 + if (!pcf->working_nobat) {
25254 + pcf->usb_removal_count_nobat =
25255 + pcf->usb_removal_count;
25256 +
25257 + if (!schedule_work(&pcf->work_nobat))
25258 + DEBUGPC("failed to schedule nobat\n");
25259 + }
25260 + mutex_unlock(&pcf->working_lock_nobat);
25261 +
25262 +
25263 + DEBUGPC("(NO)BAT ");
25264 + } else {
25265 + /* Really low battery voltage, we have 8 seconds left */
25266 + DEBUGPC("LOWBAT ");
25267 + /*
25268 + * currently Linux reacts badly to issuing a signal to
25269 + * PID #1 before init is started. What happens is that
25270 + * the next kernel thread to start, which is the JFFS2
25271 + * Garbage collector in our case, gets the signal
25272 + * instead and proceeds to fail to fork -- which is
25273 + * very bad. Therefore we confirm PID #1 exists
25274 + * before issuing SPIGPWR
25275 + */
25276 + if (find_task_by_pid(1)) {
25277 + apm_queue_event(APM_LOW_BATTERY);
25278 + DEBUGPC("SIGPWR(init) ");
25279 + kill_proc(1, SIGPWR, 1);
25280 + } else
25281 + /*
25282 + * well, our situation is like this: we do not
25283 + * have any external power, we have a low
25284 + * battery and since PID #1 doesn't exist yet,
25285 + * we are early in the boot, likely before
25286 + * rootfs mount. We should just call it a day
25287 + */
25288 + apm_queue_event(APM_CRITICAL_SUSPEND);
25289 + }
25290 +
25291 + /* Tell PMU we are taking care of this */
25292 + reg_set_bit_mask(pcf, PCF50633_REG_OOCSHDWN,
25293 + PCF50633_OOCSHDWN_TOTRST,
25294 + PCF50633_OOCSHDWN_TOTRST);
25295 + }
25296 + if (pcfirq[3] & PCF50633_INT4_HIGHTMP) {
25297 + /* High temperature */
25298 + DEBUGPC("HIGHTMP ");
25299 + apm_queue_event(APM_CRITICAL_SUSPEND);
25300 + }
25301 + if (pcfirq[3] & PCF50633_INT4_AUTOPWRFAIL) {
25302 + DEBUGPC("PCF50633_INT4_AUTOPWRFAIL ");
25303 + /* FIXME: deal with this */
25304 + }
25305 + if (pcfirq[3] & PCF50633_INT4_DWN1PWRFAIL) {
25306 + DEBUGPC("PCF50633_INT4_DWN1PWRFAIL ");
25307 + /* FIXME: deal with this */
25308 + }
25309 + if (pcfirq[3] & PCF50633_INT4_DWN2PWRFAIL) {
25310 + DEBUGPC("PCF50633_INT4_DWN2PWRFAIL ");
25311 + /* FIXME: deal with this */
25312 + }
25313 + if (pcfirq[3] & PCF50633_INT4_LEDPWRFAIL) {
25314 + DEBUGPC("PCF50633_INT4_LEDPWRFAIL ");
25315 + /* FIXME: deal with this */
25316 + }
25317 + if (pcfirq[3] & PCF50633_INT4_LEDOVP) {
25318 + DEBUGPC("PCF50633_INT4_LEDOVP ");
25319 + /* FIXME: deal with this */
25320 + }
25321 +
25322 + DEBUGPC("\n");
25323 +
25324 +bail:
25325 + pcf->working = 0;
25326 + input_sync(pcf->input_dev);
25327 + put_device(&pcf->client.dev);
25328 + mutex_unlock(&pcf->working_lock);
25329 +
25330 + return;
25331 +
25332 +reschedule:
25333 + /* don't spew, delaying whatever else is happening */
25334 + /* EXCEPTION: if we are in the middle of suspending, we don't have
25335 + * time to hang around since we may be turned off core 1V3 already
25336 + */
25337 + if ((pcf->suspend_state != PCF50633_SS_STARTING_SUSPEND) &&
25338 + (pcf->suspend_state != PCF50633_SS_COMPLETED_SUSPEND)) {
25339 + msleep(10);
25340 + dev_dbg(&pcf->client.dev, "rescheduling interrupt service\n");
25341 + }
25342 + if (!schedule_work(&pcf->work))
25343 + dev_err(&pcf->client.dev, "int service reschedule failed\n");
25344 +
25345 + /* we don't put the device here, hold it for next time */
25346 + mutex_unlock(&pcf->working_lock);
25347 +}
25348 +
25349 +static irqreturn_t pcf50633_irq(int irq, void *_pcf)
25350 +{
25351 + struct pcf50633_data *pcf = _pcf;
25352 +
25353 + DEBUGP("entering(irq=%u, pcf=%p): scheduling work\n", irq, _pcf);
25354 + dev_dbg(&pcf->client.dev, "pcf50633_irq scheduling work\n");
25355 +
25356 + get_device(&pcf->client.dev);
25357 + if (!schedule_work(&pcf->work) && !pcf->working)
25358 + dev_err(&pcf->client.dev, "pcf irq work already queued\n");
25359 +
25360 + return IRQ_HANDLED;
25361 +}
25362 +
25363 +static u_int16_t adc_to_batt_millivolts(u_int16_t adc)
25364 +{
25365 + u_int16_t mvolts;
25366 +
25367 + mvolts = (adc * 6000) / 1024;
25368 +
25369 + return mvolts;
25370 +}
25371 +
25372 +#define BATTVOLT_SCALE_START 2800
25373 +#define BATTVOLT_SCALE_END 4200
25374 +#define BATTVOLT_SCALE_DIVIDER ((BATTVOLT_SCALE_END - BATTVOLT_SCALE_START)/100)
25375 +
25376 +static u_int8_t battvolt_scale(u_int16_t battvolt)
25377 +{
25378 + /* FIXME: this linear scale is completely bogus */
25379 + u_int16_t battvolt_relative = battvolt - BATTVOLT_SCALE_START;
25380 + unsigned int percent = battvolt_relative / BATTVOLT_SCALE_DIVIDER;
25381 +
25382 + return percent;
25383 +}
25384 +
25385 +u_int16_t pcf50633_battvolt(struct pcf50633_data *pcf)
25386 +{
25387 + int count = 10;
25388 +
25389 + pcf->flag_bat_voltage_read = -1;
25390 + add_request_to_adc_queue(pcf, PCF50633_ADCC1_MUX_BATSNS_RES,
25391 + PCF50633_ADCC1_AVERAGE_16);
25392 +
25393 + while ((count--) && (pcf->flag_bat_voltage_read < 0))
25394 + msleep(1);
25395 +
25396 + if (count < 0) { /* timeout somehow */
25397 + DEBUGPC("pcf50633_battvolt timeout :-(\n");
25398 + return -1;
25399 + }
25400 +
25401 + return adc_to_batt_millivolts(pcf->flag_bat_voltage_read);
25402 +}
25403 +EXPORT_SYMBOL_GPL(pcf50633_battvolt);
25404 +
25405 +static ssize_t show_battvolt(struct device *dev, struct device_attribute *attr,
25406 + char *buf)
25407 +{
25408 + struct i2c_client *client = to_i2c_client(dev);
25409 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25410 +
25411 + return sprintf(buf, "%u\n", pcf50633_battvolt(pcf));
25412 +}
25413 +static DEVICE_ATTR(battvolt, S_IRUGO | S_IWUSR, show_battvolt, NULL);
25414 +
25415 +static int reg_id_by_name(const char *name)
25416 +{
25417 + int reg_id;
25418 +
25419 + if (!strcmp(name, "voltage_auto"))
25420 + reg_id = PCF50633_REGULATOR_AUTO;
25421 + else if (!strcmp(name, "voltage_down1"))
25422 + reg_id = PCF50633_REGULATOR_DOWN1;
25423 + else if (!strcmp(name, "voltage_down2"))
25424 + reg_id = PCF50633_REGULATOR_DOWN2;
25425 + else if (!strcmp(name, "voltage_memldo"))
25426 + reg_id = PCF50633_REGULATOR_MEMLDO;
25427 + else if (!strcmp(name, "voltage_ldo1"))
25428 + reg_id = PCF50633_REGULATOR_LDO1;
25429 + else if (!strcmp(name, "voltage_ldo2"))
25430 + reg_id = PCF50633_REGULATOR_LDO2;
25431 + else if (!strcmp(name, "voltage_ldo3"))
25432 + reg_id = PCF50633_REGULATOR_LDO3;
25433 + else if (!strcmp(name, "voltage_ldo4"))
25434 + reg_id = PCF50633_REGULATOR_LDO4;
25435 + else if (!strcmp(name, "voltage_ldo5"))
25436 + reg_id = PCF50633_REGULATOR_LDO5;
25437 + else if (!strcmp(name, "voltage_ldo6"))
25438 + reg_id = PCF50633_REGULATOR_LDO6;
25439 + else if (!strcmp(name, "voltage_hcldo"))
25440 + reg_id = PCF50633_REGULATOR_HCLDO;
25441 + else
25442 + reg_id = -1;
25443 +
25444 + return reg_id;
25445 +}
25446 +
25447 +static ssize_t show_vreg(struct device *dev, struct device_attribute *attr,
25448 + char *buf)
25449 +{
25450 + struct i2c_client *client = to_i2c_client(dev);
25451 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25452 + unsigned int reg_id;
25453 +
25454 + reg_id = reg_id_by_name(attr->attr.name);
25455 + if (reg_id < 0)
25456 + return 0;
25457 +
25458 + if (pcf50633_onoff_get(pcf, reg_id) > 0)
25459 + return sprintf(buf, "%u\n", pcf50633_voltage_get(pcf, reg_id));
25460 + else
25461 + return strlcpy(buf, "0\n", PAGE_SIZE);
25462 +}
25463 +
25464 +static ssize_t set_vreg(struct device *dev, struct device_attribute *attr,
25465 + const char *buf, size_t count)
25466 +{
25467 + struct i2c_client *client = to_i2c_client(dev);
25468 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25469 + unsigned long mvolts = simple_strtoul(buf, NULL, 10);
25470 + unsigned int reg_id;
25471 +
25472 + reg_id = reg_id_by_name(attr->attr.name);
25473 + if (reg_id < 0)
25474 + return -EIO;
25475 +
25476 + DEBUGP("attempting to set %s(%d) to %lu mvolts\n", attr->attr.name,
25477 + reg_id, mvolts);
25478 +
25479 + if (mvolts == 0) {
25480 + pcf50633_onoff_set(pcf, reg_id, 0);
25481 + } else {
25482 + if (pcf50633_voltage_set(pcf, reg_id, mvolts) < 0) {
25483 + dev_warn(dev, "refusing to set %s(%d) to %lu mvolts "
25484 + "(max=%u)\n", attr->attr.name, reg_id, mvolts,
25485 + pcf->pdata->rails[reg_id].voltage.max);
25486 + return -EINVAL;
25487 + }
25488 + pcf50633_onoff_set(pcf, reg_id, 1);
25489 + }
25490 +
25491 + return count;
25492 +}
25493 +
25494 +static DEVICE_ATTR(voltage_auto, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25495 +static DEVICE_ATTR(voltage_down1, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25496 +static DEVICE_ATTR(voltage_down2, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25497 +static DEVICE_ATTR(voltage_memldo, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25498 +static DEVICE_ATTR(voltage_ldo1, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25499 +static DEVICE_ATTR(voltage_ldo2, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25500 +static DEVICE_ATTR(voltage_ldo3, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25501 +static DEVICE_ATTR(voltage_ldo4, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25502 +static DEVICE_ATTR(voltage_ldo5, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25503 +static DEVICE_ATTR(voltage_ldo6, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25504 +static DEVICE_ATTR(voltage_hcldo, S_IRUGO | S_IWUSR, show_vreg, set_vreg);
25505 +
25506 +/***********************************************************************
25507 + * Charger Control
25508 + ***********************************************************************/
25509 +
25510 +/* Set maximum USB current limit */
25511 +static void pcf50633_usb_curlim_set(struct pcf50633_data *pcf, int ma)
25512 +{
25513 + u_int8_t bits;
25514 + int active = 0;
25515 +
25516 + pcf->last_curlim_set = ma;
25517 +
25518 + dev_dbg(&pcf->client.dev, "setting usb current limit to %d ma", ma);
25519 +
25520 + if (ma >= 1000) {
25521 + bits = PCF50633_MBCC7_USB_1000mA;
25522 + }
25523 + else if (ma >= 500)
25524 + bits = PCF50633_MBCC7_USB_500mA;
25525 + else if (ma >= 100)
25526 + bits = PCF50633_MBCC7_USB_100mA;
25527 + else
25528 + bits = PCF50633_MBCC7_USB_SUSPEND;
25529 +
25530 + /* set the nearest charging limit */
25531 + reg_set_bit_mask(pcf, PCF50633_REG_MBCC7, PCF56033_MBCC7_USB_MASK,
25532 + bits);
25533 +
25534 + /* with this charging limit, is charging actually meaningful? */
25535 + switch (bits) {
25536 + case PCF50633_MBCC7_USB_500mA:
25537 + case PCF50633_MBCC7_USB_1000mA:
25538 + /* yes with this charging limit, we can do real charging */
25539 + active = 1;
25540 + break;
25541 + default:
25542 + /* no charging is gonna be happening */
25543 + break;
25544 + }
25545 + /*
25546 + * enable or disable charging according to current limit -- this will
25547 + * also throw a platform notification callback about it
25548 + */
25549 + pcf50633_charge_enable(pcf50633_global, active);
25550 +
25551 + /* clear batfull */
25552 + reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
25553 + PCF50633_MBCC1_AUTORES,
25554 + 0);
25555 + reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
25556 + PCF50633_MBCC1_RESUME,
25557 + PCF50633_MBCC1_RESUME);
25558 + reg_set_bit_mask(pcf, PCF50633_REG_MBCC1,
25559 + PCF50633_MBCC1_AUTORES,
25560 + PCF50633_MBCC1_AUTORES);
25561 +
25562 +}
25563 +
25564 +static ssize_t show_usblim(struct device *dev, struct device_attribute *attr,
25565 + char *buf)
25566 +{
25567 + struct i2c_client *client = to_i2c_client(dev);
25568 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25569 + u_int8_t usblim = reg_read(pcf, PCF50633_REG_MBCC7) &
25570 + PCF56033_MBCC7_USB_MASK;
25571 + unsigned int ma;
25572 +
25573 + if (usblim == PCF50633_MBCC7_USB_1000mA)
25574 + ma = 1000;
25575 + else if (usblim == PCF50633_MBCC7_USB_500mA)
25576 + ma = 500;
25577 + else if (usblim == PCF50633_MBCC7_USB_100mA)
25578 + ma = 100;
25579 + else
25580 + ma = 0;
25581 +
25582 + return sprintf(buf, "%u\n", ma);
25583 +}
25584 +static DEVICE_ATTR(usb_curlim, S_IRUGO | S_IWUSR, show_usblim, NULL);
25585 +
25586 +/* Enable/disable charging */
25587 +static void pcf50633_charge_enable(struct pcf50633_data *pcf, int on)
25588 +{
25589 + u_int8_t bits;
25590 + u_int8_t usblim;
25591 +
25592 + if (!(pcf->pdata->used_features & PCF50633_FEAT_MBC))
25593 + return;
25594 +
25595 + DEBUGPC("pcf50633_charge_enable %d\n", on);
25596 +
25597 + if (on) {
25598 + pcf->flags |= PCF50633_F_CHG_ENABLED;
25599 + bits = PCF50633_MBCC1_CHGENA;
25600 + usblim = reg_read(pcf, PCF50633_REG_MBCC7) &
25601 + PCF56033_MBCC7_USB_MASK;
25602 + switch (usblim) {
25603 + case PCF50633_MBCC7_USB_1000mA:
25604 + case PCF50633_MBCC7_USB_500mA:
25605 + if (pcf->flags & PCF50633_F_USB_PRESENT)
25606 + if (pcf->pdata->cb)
25607 + pcf->pdata->cb(&pcf->client.dev,
25608 + PCF50633_FEAT_MBC,
25609 + PMU_EVT_CHARGER_ACTIVE);
25610 + break;
25611 + default:
25612 + break;
25613 + }
25614 + } else {
25615 + pcf->flags &= ~PCF50633_F_CHG_ENABLED;
25616 + bits = 0;
25617 + if (pcf->pdata->cb)
25618 + pcf->pdata->cb(&pcf->client.dev,
25619 + PCF50633_FEAT_MBC, PMU_EVT_CHARGER_IDLE);
25620 + }
25621 + reg_set_bit_mask(pcf, PCF50633_REG_MBCC1, PCF50633_MBCC1_CHGENA,
25622 + bits);
25623 +}
25624 +
25625 +#if 0
25626 +#define ONE 1000000
25627 +static u_int16_t adc_to_rntc(struct pcf50633_data *pcf, u_int16_t adc)
25628 +{
25629 + u_int32_t r_batt = (adc * pcf->pdata->r_fix_batt) / (1023 - adc);
25630 + u_int16_t r_ntc;
25631 +
25632 + /* The battery NTC has a parallell 10kOhms resistor */
25633 + r_ntc = ONE / ((ONE/r_batt) - (ONE/pcf->pdata->r_fix_batt_par));
25634 +
25635 + return r_ntc;
25636 +}
25637 +#endif
25638 +static ssize_t show_battemp(struct device *dev, struct device_attribute *attr,
25639 + char *buf)
25640 +{
25641 + return sprintf(buf, "\n");
25642 +}
25643 +static DEVICE_ATTR(battemp, S_IRUGO | S_IWUSR, show_battemp, NULL);
25644 +#if 0
25645 +static u_int16_t adc_to_chg_milliamps(struct pcf50633_data *pcf,
25646 + u_int16_t adc_adcin1,
25647 + u_int16_t adc_batvolt)
25648 +{
25649 + u_int32_t res = ((adc_adcin1 - adc_batvolt) * 6000);
25650 + return res / (pcf->pdata->r_sense_milli * 1024 / 1000);
25651 +}
25652 +#endif
25653 +static ssize_t show_chgcur(struct device *dev, struct device_attribute *attr,
25654 + char *buf)
25655 +{
25656 + return sprintf(buf, "\n");
25657 +}
25658 +static DEVICE_ATTR(chgcur, S_IRUGO | S_IWUSR, show_chgcur, NULL);
25659 +
25660 +static const char *chgmode_names[] = {
25661 + [PCF50633_MBCS2_MBC_PLAY] = "play-only",
25662 + [PCF50633_MBCS2_MBC_USB_PRE] = "pre",
25663 + [PCF50633_MBCS2_MBC_ADP_PRE] = "pre",
25664 + [PCF50633_MBCS2_MBC_USB_PRE_WAIT] = "pre-wait",
25665 + [PCF50633_MBCS2_MBC_ADP_PRE_WAIT] = "pre-wait",
25666 + [PCF50633_MBCS2_MBC_USB_FAST] = "fast",
25667 + [PCF50633_MBCS2_MBC_ADP_FAST] = "fast",
25668 + [PCF50633_MBCS2_MBC_USB_FAST_WAIT] = "fast-wait",
25669 + [PCF50633_MBCS2_MBC_ADP_FAST_WAIT] = "fast-wait",
25670 + [PCF50633_MBCS2_MBC_ADP_FAST_WAIT] = "bat-full",
25671 +};
25672 +
25673 +static ssize_t show_chgmode(struct device *dev, struct device_attribute *attr,
25674 + char *buf)
25675 +{
25676 + struct i2c_client *client = to_i2c_client(dev);
25677 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25678 + u_int8_t mbcs2 = reg_read(pcf, PCF50633_REG_MBCS2);
25679 + u_int8_t chgmod = (mbcs2 & PCF50633_MBCS2_MBC_MASK);
25680 +
25681 + return sprintf(buf, "%s\n", chgmode_names[chgmod]);
25682 +}
25683 +
25684 +static ssize_t set_chgmode(struct device *dev, struct device_attribute *attr,
25685 + const char *buf, size_t count)
25686 +{
25687 + struct i2c_client *client = to_i2c_client(dev);
25688 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25689 +
25690 + /* As opposed to the PCF50606, we can only enable or disable
25691 + * charging and not directly jump into a certain mode! */
25692 +
25693 + if (!strcmp(buf, "0\n"))
25694 + pcf50633_charge_enable(pcf, 0);
25695 + else
25696 + pcf50633_charge_enable(pcf, 1);
25697 +
25698 + return count;
25699 +}
25700 +
25701 +static DEVICE_ATTR(chgmode, S_IRUGO | S_IWUSR, show_chgmode, set_chgmode);
25702 +
25703 +static const char *chgstate_names[] = {
25704 + [PCF50633_FIDX_CHG_ENABLED] = "enabled",
25705 + [PCF50633_FIDX_CHG_PRESENT] = "charger_present",
25706 + [PCF50633_FIDX_USB_PRESENT] = "usb_present",
25707 + [PCF50633_FIDX_CHG_ERR] = "error",
25708 + [PCF50633_FIDX_CHG_PROT] = "protection",
25709 + [PCF50633_FIDX_CHG_READY] = "ready",
25710 +};
25711 +
25712 +static ssize_t show_chgstate(struct device *dev, struct device_attribute *attr,
25713 + char *buf)
25714 +{
25715 + struct i2c_client *client = to_i2c_client(dev);
25716 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25717 +
25718 + char *b = buf;
25719 + int i;
25720 +
25721 + for (i = 0; i < 32; i++)
25722 + if (pcf->flags & (1 << i) && i < ARRAY_SIZE(chgstate_names))
25723 + b += sprintf(b, "%s ", chgstate_names[i]);
25724 +
25725 + if (b > buf)
25726 + b += sprintf(b, "\n");
25727 +
25728 + return b - buf;
25729 +}
25730 +static DEVICE_ATTR(chgstate, S_IRUGO | S_IWUSR, show_chgstate, NULL);
25731 +
25732 +/***********************************************************************
25733 + * APM emulation
25734 + ***********************************************************************/
25735 +
25736 +extern void (*apm_get_power_status)(struct apm_power_info *);
25737 +
25738 +static void pcf50633_get_power_status(struct apm_power_info *info)
25739 +{
25740 + struct pcf50633_data *pcf = pcf50633_global;
25741 + u_int8_t chgmod = reg_read(pcf, PCF50633_REG_MBCS2) &
25742 + PCF50633_MBCS2_MBC_MASK;
25743 +
25744 + u_int16_t battvolt = pcf50633_battvolt(pcf);
25745 +
25746 + if (reg_read(pcf, PCF50633_REG_MBCS1) &
25747 + (PCF50633_MBCS1_USBPRES|PCF50633_MBCS1_ADAPTPRES))
25748 + info->ac_line_status = APM_AC_ONLINE;
25749 + else
25750 + info->ac_line_status = APM_AC_OFFLINE;
25751 +
25752 + switch (chgmod) {
25753 + case PCF50633_MBCS2_MBC_PLAY:
25754 + case PCF50633_MBCS2_MBC_USB_PRE:
25755 + case PCF50633_MBCS2_MBC_USB_PRE_WAIT:
25756 + case PCF50633_MBCS2_MBC_USB_FAST_WAIT:
25757 + case PCF50633_MBCS2_MBC_ADP_PRE:
25758 + case PCF50633_MBCS2_MBC_ADP_PRE_WAIT:
25759 + case PCF50633_MBCS2_MBC_ADP_FAST_WAIT:
25760 + case PCF50633_MBCS2_MBC_BAT_FULL:
25761 + case PCF50633_MBCS2_MBC_HALT:
25762 + info->battery_life = battvolt_scale(battvolt);
25763 + break;
25764 + case PCF50633_MBCS2_MBC_USB_FAST:
25765 + case PCF50633_MBCS2_MBC_ADP_FAST:
25766 + info->battery_status = APM_BATTERY_STATUS_CHARGING;
25767 + info->battery_flag = APM_BATTERY_FLAG_CHARGING;
25768 + default:
25769 + break;
25770 + }
25771 +}
25772 +
25773 +/***********************************************************************
25774 + * RTC
25775 + ***********************************************************************/
25776 +enum pcf50633_time_indexes {
25777 + PCF50633_TI_SEC = 0,
25778 + PCF50633_TI_MIN,
25779 + PCF50633_TI_HOUR,
25780 + PCF50633_TI_WKDAY,
25781 + PCF50633_TI_DAY,
25782 + PCF50633_TI_MONTH,
25783 + PCF50633_TI_YEAR,
25784 + PCF50633_TI_EXTENT /* always last */
25785 +};
25786 +
25787 +
25788 +struct pcf50633_time {
25789 + u_int8_t time[PCF50633_TI_EXTENT];
25790 +};
25791 +
25792 +static void pcf2rtc_time(struct rtc_time *rtc, struct pcf50633_time *pcf)
25793 +{
25794 + rtc->tm_sec = BCD2BIN(pcf->time[PCF50633_TI_SEC]);
25795 + rtc->tm_min = BCD2BIN(pcf->time[PCF50633_TI_MIN]);
25796 + rtc->tm_hour = BCD2BIN(pcf->time[PCF50633_TI_HOUR]);
25797 + rtc->tm_wday = BCD2BIN(pcf->time[PCF50633_TI_WKDAY]);
25798 + rtc->tm_mday = BCD2BIN(pcf->time[PCF50633_TI_DAY]);
25799 + rtc->tm_mon = BCD2BIN(pcf->time[PCF50633_TI_MONTH]);
25800 + rtc->tm_year = BCD2BIN(pcf->time[PCF50633_TI_YEAR]) + 100;
25801 +}
25802 +
25803 +static void rtc2pcf_time(struct pcf50633_time *pcf, struct rtc_time *rtc)
25804 +{
25805 + pcf->time[PCF50633_TI_SEC] = BIN2BCD(rtc->tm_sec);
25806 + pcf->time[PCF50633_TI_MIN] = BIN2BCD(rtc->tm_min);
25807 + pcf->time[PCF50633_TI_HOUR] = BIN2BCD(rtc->tm_hour);
25808 + pcf->time[PCF50633_TI_WKDAY] = BIN2BCD(rtc->tm_wday);
25809 + pcf->time[PCF50633_TI_DAY] = BIN2BCD(rtc->tm_mday);
25810 + pcf->time[PCF50633_TI_MONTH] = BIN2BCD(rtc->tm_mon);
25811 + pcf->time[PCF50633_TI_YEAR] = BIN2BCD(rtc->tm_year - 100);
25812 +}
25813 +
25814 +static int pcf50633_rtc_ioctl(struct device *dev, unsigned int cmd,
25815 + unsigned long arg)
25816 +{
25817 + struct i2c_client *client = to_i2c_client(dev);
25818 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25819 +
25820 + switch (cmd) {
25821 + case RTC_AIE_OFF:
25822 + /* disable the alarm interrupt */
25823 + reg_set_bit_mask(pcf, PCF50633_REG_INT1M,
25824 + PCF50633_INT1_ALARM, PCF50633_INT1_ALARM);
25825 + return 0;
25826 + case RTC_AIE_ON:
25827 + /* enable the alarm interrupt */
25828 + reg_clear_bits(pcf, PCF50633_REG_INT1M, PCF50633_INT1_ALARM);
25829 + return 0;
25830 + case RTC_PIE_OFF:
25831 + /* disable periodic interrupt (hz tick) */
25832 + pcf->flags &= ~PCF50633_F_RTC_SECOND;
25833 + reg_set_bit_mask(pcf, PCF50633_REG_INT1M,
25834 + PCF50633_INT1_SECOND, PCF50633_INT1_SECOND);
25835 + return 0;
25836 + case RTC_PIE_ON:
25837 + /* ensable periodic interrupt (hz tick) */
25838 + pcf->flags |= PCF50633_F_RTC_SECOND;
25839 + reg_clear_bits(pcf, PCF50633_REG_INT1M, PCF50633_INT1_SECOND);
25840 + return 0;
25841 + }
25842 + return -ENOIOCTLCMD;
25843 +}
25844 +
25845 +static int pcf50633_rtc_read_time(struct device *dev, struct rtc_time *tm)
25846 +{
25847 + struct i2c_client *client = to_i2c_client(dev);
25848 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25849 + struct pcf50633_time pcf_tm;
25850 + int ret;
25851 +
25852 + mutex_lock(&pcf->lock);
25853 +
25854 + ret = i2c_smbus_read_i2c_block_data(&pcf->client,
25855 + PCF50633_REG_RTCSC,
25856 + PCF50633_TI_EXTENT,
25857 + &pcf_tm.time[0]);
25858 + if (ret != PCF50633_TI_EXTENT)
25859 + dev_err(dev, "Failed to read time :-(\n");
25860 +
25861 + mutex_unlock(&pcf->lock);
25862 +
25863 + dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n",
25864 + pcf_tm.time[PCF50633_TI_DAY],
25865 + pcf_tm.time[PCF50633_TI_MONTH],
25866 + pcf_tm.time[PCF50633_TI_YEAR],
25867 + pcf_tm.time[PCF50633_TI_HOUR],
25868 + pcf_tm.time[PCF50633_TI_MIN],
25869 + pcf_tm.time[PCF50633_TI_SEC]);
25870 +
25871 + pcf2rtc_time(tm, &pcf_tm);
25872 +
25873 + dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
25874 + tm->tm_mday, tm->tm_mon, tm->tm_year,
25875 + tm->tm_hour, tm->tm_min, tm->tm_sec);
25876 +
25877 + return 0;
25878 +}
25879 +
25880 +static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm)
25881 +{
25882 + struct i2c_client *client = to_i2c_client(dev);
25883 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25884 + struct pcf50633_time pcf_tm;
25885 + int ret;
25886 +
25887 + dev_dbg(dev, "RTC_TIME: %u.%u.%u %u:%u:%u\n",
25888 + tm->tm_mday, tm->tm_mon, tm->tm_year,
25889 + tm->tm_hour, tm->tm_min, tm->tm_sec);
25890 + rtc2pcf_time(&pcf_tm, tm);
25891 + dev_dbg(dev, "PCF_TIME: %02x.%02x.%02x %02x:%02x:%02x\n",
25892 + pcf_tm.time[PCF50633_TI_DAY],
25893 + pcf_tm.time[PCF50633_TI_MONTH],
25894 + pcf_tm.time[PCF50633_TI_YEAR],
25895 + pcf_tm.time[PCF50633_TI_HOUR],
25896 + pcf_tm.time[PCF50633_TI_MIN],
25897 + pcf_tm.time[PCF50633_TI_SEC]);
25898 +
25899 + mutex_lock(&pcf->lock);
25900 + /* FIXME: disable second interrupt */
25901 +
25902 + ret = i2c_smbus_write_i2c_block_data(&pcf->client,
25903 + PCF50633_REG_RTCSC,
25904 + PCF50633_TI_EXTENT,
25905 + &pcf_tm.time[0]);
25906 + if (ret)
25907 + dev_err(dev, "Failed to set time %d\n", ret);
25908 +
25909 + /* FIXME: re-enable second interrupt */
25910 + mutex_unlock(&pcf->lock);
25911 +
25912 + return 0;
25913 +}
25914 +
25915 +static int pcf50633_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
25916 +{
25917 + struct i2c_client *client = to_i2c_client(dev);
25918 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25919 + struct pcf50633_time pcf_tm;
25920 + int ret;
25921 +
25922 + mutex_lock(&pcf->lock);
25923 +
25924 + alrm->enabled =
25925 + __reg_read(pcf, PCF50633_REG_INT1M) & PCF50633_INT1_ALARM ? 0 : 1;
25926 +
25927 + ret = i2c_smbus_read_i2c_block_data(&pcf->client,
25928 + PCF50633_REG_RTCSCA,
25929 + PCF50633_TI_EXTENT,
25930 + &pcf_tm.time[0]);
25931 + if (ret != PCF50633_TI_EXTENT)
25932 + dev_err(dev, "Failed to read Alarm time :-(\n");
25933 +
25934 + mutex_unlock(&pcf->lock);
25935 +
25936 + pcf2rtc_time(&alrm->time, &pcf_tm);
25937 +
25938 + return 0;
25939 +}
25940 +
25941 +static int pcf50633_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
25942 +{
25943 + struct i2c_client *client = to_i2c_client(dev);
25944 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
25945 + struct pcf50633_time pcf_tm;
25946 + u_int8_t irqmask;
25947 + int ret;
25948 +
25949 + rtc2pcf_time(&pcf_tm, &alrm->time);
25950 +
25951 + mutex_lock(&pcf->lock);
25952 +
25953 + /* disable alarm interrupt */
25954 + irqmask = __reg_read(pcf, PCF50633_REG_INT1M);
25955 + irqmask |= PCF50633_INT1_ALARM;
25956 + __reg_write(pcf, PCF50633_REG_INT1M, irqmask);
25957 +
25958 + ret = i2c_smbus_write_i2c_block_data(&pcf->client,
25959 + PCF50633_REG_RTCSCA,
25960 + PCF50633_TI_EXTENT,
25961 + &pcf_tm.time[0]);
25962 + if (ret)
25963 + dev_err(dev, "Failed to write alarm time :-( %d\n", ret);
25964 +
25965 + if (alrm->enabled) {
25966 + /* (re-)enaable alarm interrupt */
25967 + irqmask = __reg_read(pcf, PCF50633_REG_INT1M);
25968 + irqmask &= ~PCF50633_INT1_ALARM;
25969 + __reg_write(pcf, PCF50633_REG_INT1M, irqmask);
25970 + }
25971 +
25972 + mutex_unlock(&pcf->lock);
25973 +
25974 + /* FIXME */
25975 + return 0;
25976 +}
25977 +
25978 +static struct rtc_class_ops pcf50633_rtc_ops = {
25979 + .ioctl = pcf50633_rtc_ioctl,
25980 + .read_time = pcf50633_rtc_read_time,
25981 + .set_time = pcf50633_rtc_set_time,
25982 + .read_alarm = pcf50633_rtc_read_alarm,
25983 + .set_alarm = pcf50633_rtc_set_alarm,
25984 +};
25985 +
25986 +/***********************************************************************
25987 + * Backlight device
25988 + ***********************************************************************/
25989 +
25990 +static int pcf50633bl_get_intensity(struct backlight_device *bd)
25991 +{
25992 + struct pcf50633_data *pcf = bl_get_data(bd);
25993 + int intensity = reg_read(pcf, PCF50633_REG_LEDOUT);
25994 +
25995 + if (!(reg_read(pcf, PCF50633_REG_LEDENA) & 1))
25996 + intensity = 0;
25997 +
25998 + return intensity & 0x3f;
25999 +}
26000 +
26001 +static int __pcf50633bl_set_intensity(struct pcf50633_data *pcf, int intensity)
26002 +{
26003 + int old_intensity = reg_read(pcf, PCF50633_REG_LEDOUT);
26004 + int ret;
26005 +
26006 + if (!(reg_read(pcf, PCF50633_REG_LEDENA) & 1))
26007 + old_intensity = 0;
26008 +
26009 + /*
26010 + * The PCF50633 cannot handle LEDOUT = 0 (datasheet p60)
26011 + * if seen, you have to re-enable the LED unit
26012 + * we treat intensity 0 as disable
26013 + */
26014 +
26015 + if (intensity && !old_intensity) {
26016 + ret = reg_set_bit_mask(pcf, PCF50633_REG_LEDENA, 0x01, 0x00);
26017 + if (ret)
26018 + return ret;
26019 + }
26020 +
26021 + if (!intensity) /* illegal to set LEDOUT to 0 */
26022 + ret = reg_set_bit_mask(pcf, PCF50633_REG_LEDENA, 0x01, 0x00);
26023 + else {
26024 + ret = reg_set_bit_mask(pcf, PCF50633_REG_LEDOUT, 0x3f,
26025 + intensity);
26026 + if (ret)
26027 + return ret;
26028 + ret = reg_set_bit_mask(pcf, PCF50633_REG_LEDENA, 0x01, 0x01);
26029 + }
26030 +
26031 + return ret;
26032 +}
26033 +
26034 +static int pcf50633bl_set_intensity(struct backlight_device *bd)
26035 +{
26036 + struct pcf50633_data *pcf = bl_get_data(bd);
26037 + int intensity = bd->props.brightness;
26038 +
26039 + if ((bd->props.power != FB_BLANK_UNBLANK) ||
26040 + (bd->props.fb_blank != FB_BLANK_UNBLANK))
26041 + intensity = 0;
26042 +
26043 + return __pcf50633bl_set_intensity(pcf, intensity);
26044 +}
26045 +
26046 +static struct backlight_ops pcf50633bl_ops = {
26047 + .get_brightness = pcf50633bl_get_intensity,
26048 + .update_status = pcf50633bl_set_intensity,
26049 +};
26050 +
26051 +/*
26052 + * Charger type
26053 + */
26054 +
26055 +static ssize_t show_charger_type(struct device *dev,
26056 + struct device_attribute *attr, char *buf)
26057 +{
26058 + struct i2c_client *client = to_i2c_client(dev);
26059 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
26060 + static const char *names_charger_type[] = {
26061 + [CHARGER_TYPE_NONE] = "none",
26062 + [CHARGER_TYPE_HOSTUSB] = "host/500mA usb",
26063 + [CHARGER_TYPE_1A] = "charger 1A",
26064 + };
26065 + static const char *names_charger_modes[] = {
26066 + [PCF50633_MBCC7_USB_1000mA] = "1A",
26067 + [PCF50633_MBCC7_USB_500mA] = "500mA",
26068 + [PCF50633_MBCC7_USB_100mA] = "100mA",
26069 + [PCF50633_MBCC7_USB_SUSPEND] = "suspend",
26070 + };
26071 + int mode = reg_read(pcf, PCF50633_REG_MBCC7) & PCF56033_MBCC7_USB_MASK;
26072 +
26073 + return sprintf(buf, "%s mode %s\n",
26074 + names_charger_type[pcf->charger_type],
26075 + names_charger_modes[mode]);
26076 +}
26077 +
26078 +static DEVICE_ATTR(charger_type, 0444, show_charger_type, NULL);
26079 +
26080 +static ssize_t force_usb_limit_dangerous(struct device *dev,
26081 + struct device_attribute *attr, const char *buf, size_t count)
26082 +{
26083 + struct i2c_client *client = to_i2c_client(dev);
26084 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
26085 + int ma = simple_strtoul(buf, NULL, 10);
26086 +
26087 + pcf50633_usb_curlim_set(pcf, ma);
26088 + return count;
26089 +}
26090 +
26091 +static DEVICE_ATTR(force_usb_limit_dangerous, 0600,
26092 + NULL, force_usb_limit_dangerous);
26093 +
26094 +/*
26095 + * Charger adc
26096 + */
26097 +
26098 +static ssize_t show_charger_adc(struct device *dev,
26099 + struct device_attribute *attr, char *buf)
26100 +{
26101 + struct i2c_client *client = to_i2c_client(dev);
26102 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
26103 +
26104 + return sprintf(buf, "%d\n", pcf->charger_adc_result_raw);
26105 +}
26106 +
26107 +static DEVICE_ATTR(charger_adc, 0444, show_charger_adc, NULL);
26108 +
26109 +/*
26110 + * Dump regs
26111 + */
26112 +
26113 +static ssize_t show_dump_regs(struct device *dev, struct device_attribute *attr,
26114 + char *buf)
26115 +{
26116 + struct i2c_client *client = to_i2c_client(dev);
26117 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
26118 + u8 dump[16];
26119 + int n, n1, idx = 0;
26120 + char *buf1 = buf;
26121 + static u8 address_no_read[] = { /* must be ascending */
26122 + PCF50633_REG_INT1,
26123 + PCF50633_REG_INT2,
26124 + PCF50633_REG_INT3,
26125 + PCF50633_REG_INT4,
26126 + PCF50633_REG_INT5,
26127 + 0 /* terminator */
26128 + };
26129 +
26130 + for (n = 0; n < 256; n += sizeof(dump)) {
26131 +
26132 + for (n1 = 0; n1 < sizeof(dump); n1++)
26133 + if (n == address_no_read[idx]) {
26134 + idx++;
26135 + dump[n1] = 0x00;
26136 + } else
26137 + dump[n1] = reg_read(pcf, n + n1);
26138 +
26139 + hex_dump_to_buffer(dump, sizeof(dump), 16, 1, buf1, 128, 0);
26140 + buf1 += strlen(buf1);
26141 + *buf1++ = '\n';
26142 + *buf1 = '\0';
26143 + }
26144 +
26145 + return buf1 - buf;
26146 +}
26147 +
26148 +static DEVICE_ATTR(dump_regs, 0400, show_dump_regs, NULL);
26149 +
26150 +
26151 +/***********************************************************************
26152 + * Driver initialization
26153 + ***********************************************************************/
26154 +
26155 +/*
26156 + * CARE! This table is modified at runtime!
26157 + */
26158 +static struct attribute *pcf_sysfs_entries[] = {
26159 + &dev_attr_voltage_auto.attr,
26160 + &dev_attr_voltage_down1.attr,
26161 + &dev_attr_voltage_down2.attr,
26162 + &dev_attr_voltage_memldo.attr,
26163 + &dev_attr_voltage_ldo1.attr,
26164 + &dev_attr_voltage_ldo2.attr,
26165 + &dev_attr_voltage_ldo3.attr,
26166 + &dev_attr_voltage_ldo4.attr,
26167 + &dev_attr_voltage_ldo5.attr,
26168 + &dev_attr_voltage_ldo6.attr,
26169 + &dev_attr_voltage_hcldo.attr,
26170 + &dev_attr_charger_type.attr,
26171 + &dev_attr_force_usb_limit_dangerous.attr,
26172 + &dev_attr_charger_adc.attr,
26173 + &dev_attr_dump_regs.attr,
26174 + NULL, /* going to add things at this point! */
26175 + NULL,
26176 + NULL,
26177 + NULL,
26178 + NULL,
26179 + NULL,
26180 + NULL,
26181 +};
26182 +
26183 +static struct attribute_group pcf_attr_group = {
26184 + .name = NULL, /* put in device directory */
26185 + .attrs = pcf_sysfs_entries,
26186 +};
26187 +
26188 +static void populate_sysfs_group(struct pcf50633_data *pcf)
26189 +{
26190 + int i = 0;
26191 + struct attribute **attr;
26192 +
26193 + for (attr = pcf_sysfs_entries; *attr; attr++)
26194 + i++;
26195 +
26196 + if (pcf->pdata->used_features & PCF50633_FEAT_MBC) {
26197 + pcf_sysfs_entries[i++] = &dev_attr_chgstate.attr;
26198 + pcf_sysfs_entries[i++] = &dev_attr_chgmode.attr;
26199 + pcf_sysfs_entries[i++] = &dev_attr_usb_curlim.attr;
26200 + }
26201 +
26202 + if (pcf->pdata->used_features & PCF50633_FEAT_CHGCUR)
26203 + pcf_sysfs_entries[i++] = &dev_attr_chgcur.attr;
26204 +
26205 + if (pcf->pdata->used_features & PCF50633_FEAT_BATVOLT)
26206 + pcf_sysfs_entries[i++] = &dev_attr_battvolt.attr;
26207 +
26208 + if (pcf->pdata->used_features & PCF50633_FEAT_BATTEMP)
26209 + pcf_sysfs_entries[i++] = &dev_attr_battemp.attr;
26210 +
26211 +}
26212 +
26213 +static int pcf50633_detect(struct i2c_adapter *adapter, int address, int kind)
26214 +{
26215 + struct i2c_client *new_client;
26216 + struct pcf50633_data *pcf;
26217 + int err = 0;
26218 + int irq;
26219 +
26220 + DEBUGP("entering\n");
26221 + if (!pcf50633_pdev) {
26222 + printk(KERN_ERR "pcf50633: driver needs a platform_device!\n");
26223 + return -EIO;
26224 + }
26225 +
26226 + irq = platform_get_irq(pcf50633_pdev, 0);
26227 + if (irq < 0) {
26228 + dev_err(&pcf50633_pdev->dev, "no irq in platform resources!\n");
26229 + return -EIO;
26230 + }
26231 +
26232 + /* At the moment, we only support one PCF50633 in a system */
26233 + if (pcf50633_global) {
26234 + dev_err(&pcf50633_pdev->dev,
26235 + "currently only one chip supported\n");
26236 + return -EBUSY;
26237 + }
26238 +
26239 + pcf = kzalloc(sizeof(*pcf), GFP_KERNEL);
26240 + if (!pcf)
26241 + return -ENOMEM;
26242 +
26243 + mutex_init(&pcf->lock);
26244 + mutex_init(&pcf->working_lock);
26245 + mutex_init(&pcf->working_lock_nobat);
26246 + mutex_init(&pcf->working_lock_usb_curlimit);
26247 + INIT_WORK(&pcf->work, pcf50633_work);
26248 + INIT_WORK(&pcf->work_nobat, pcf50633_work_nobat);
26249 + INIT_WORK(&pcf->work_usb_curlimit, pcf50633_work_usbcurlim);
26250 + pcf->irq = irq;
26251 + pcf->working = 0;
26252 + pcf->suppress_onkey_events = 0;
26253 + pcf->onkey_seconds = -1;
26254 + pcf->pdata = pcf50633_pdev->dev.platform_data;
26255 +
26256 + new_client = &pcf->client;
26257 + i2c_set_clientdata(new_client, pcf);
26258 + new_client->addr = address;
26259 + new_client->adapter = adapter;
26260 + new_client->driver = &pcf50633_driver;
26261 + new_client->flags = 0;
26262 + strlcpy(new_client->name, "pcf50633", I2C_NAME_SIZE);
26263 +
26264 + /* now we try to detect the chip */
26265 +
26266 + /* register with i2c core */
26267 + if ((err = i2c_attach_client(new_client))) {
26268 + dev_err(&new_client->dev,
26269 + "error during i2c_attach_client()\n");
26270 + goto exit_free;
26271 + }
26272 +
26273 + init_resume_dependency_list(&pcf->resume_dependency);
26274 +
26275 + populate_sysfs_group(pcf);
26276 +
26277 + err = sysfs_create_group(&new_client->dev.kobj, &pcf_attr_group);
26278 + if (err) {
26279 + dev_err(&new_client->dev, "error creating sysfs group\n");
26280 + goto exit_detach;
26281 + }
26282 +
26283 + /* create virtual charger 'device' */
26284 +
26285 + /* register power off handler with core power management */
26286 + pm_power_off = &pcf50633_go_standby;
26287 +
26288 + pcf->input_dev = input_allocate_device();
26289 + if (!pcf->input_dev)
26290 + goto exit_sysfs;
26291 +
26292 + pcf->input_dev->name = "GTA02 PMU events";
26293 + pcf->input_dev->phys = "FIXME";
26294 + pcf->input_dev->id.bustype = BUS_I2C;
26295 + pcf->input_dev->cdev.dev = &new_client->dev;
26296 +
26297 + pcf->input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_PWR);
26298 + set_bit(KEY_POWER, pcf->input_dev->keybit);
26299 + set_bit(KEY_POWER2, pcf->input_dev->keybit);
26300 + set_bit(KEY_BATTERY, pcf->input_dev->keybit);
26301 +
26302 + err = input_register_device(pcf->input_dev);
26303 + if (err)
26304 + goto exit_sysfs;
26305 +
26306 + /* configure interrupt mask */
26307 + /* we want SECOND to kick for the coldplug initialisation */
26308 + reg_write(pcf, PCF50633_REG_INT1M, 0x00);
26309 + reg_write(pcf, PCF50633_REG_INT2M, 0x00);
26310 + reg_write(pcf, PCF50633_REG_INT3M, 0x00);
26311 + reg_write(pcf, PCF50633_REG_INT4M, 0x00);
26312 + reg_write(pcf, PCF50633_REG_INT5M, 0x00);
26313 +
26314 + err = request_irq(irq, pcf50633_irq, IRQF_TRIGGER_FALLING,
26315 + "pcf50633", pcf);
26316 + if (err < 0)
26317 + goto exit_input;
26318 +
26319 + if (enable_irq_wake(irq) < 0)
26320 + dev_err(&new_client->dev, "IRQ %u cannot be enabled as wake-up"
26321 + "source in this hardware revision!", irq);
26322 +
26323 + if (pcf->pdata->used_features & PCF50633_FEAT_RTC) {
26324 + pcf->rtc = rtc_device_register("pcf50633", &new_client->dev,
26325 + &pcf50633_rtc_ops, THIS_MODULE);
26326 + if (IS_ERR(pcf->rtc)) {
26327 + err = PTR_ERR(pcf->rtc);
26328 + goto exit_irq;
26329 + }
26330 + }
26331 +
26332 + if (pcf->pdata->used_features & PCF50633_FEAT_PWM_BL) {
26333 + pcf->backlight = backlight_device_register("pcf50633-bl",
26334 + &new_client->dev,
26335 + pcf,
26336 + &pcf50633bl_ops);
26337 + if (!pcf->backlight)
26338 + goto exit_rtc;
26339 + /* FIXME: are we sure we want default == off? */
26340 + pcf->backlight->props.max_brightness = 0x3f;
26341 + pcf->backlight->props.power = FB_BLANK_UNBLANK;
26342 + pcf->backlight->props.fb_blank = FB_BLANK_UNBLANK;
26343 + pcf->backlight->props.brightness =
26344 + pcf->backlight->props.max_brightness;
26345 + backlight_update_status(pcf->backlight);
26346 + }
26347 +
26348 + if (pcf->pdata->flag_use_apm_emulation)
26349 + apm_get_power_status = pcf50633_get_power_status;
26350 +
26351 + pcf->probe_completed = 1;
26352 + pcf50633_global = pcf;
26353 + dev_info(&new_client->dev, "probe completed\n");
26354 +
26355 + /* if platform was interested, give him a chance to register
26356 + * platform devices that switch power with us as the parent
26357 + * at registration time -- ensures suspend / resume ordering
26358 + */
26359 + if (pcf->pdata->attach_child_devices)
26360 + (pcf->pdata->attach_child_devices)(&new_client->dev);
26361 +
26362 + return 0;
26363 +exit_rtc:
26364 + if (pcf->pdata->used_features & PCF50633_FEAT_RTC)
26365 + rtc_device_unregister(pcf50633_global->rtc);
26366 +exit_irq:
26367 + free_irq(pcf50633_global->irq, pcf50633_global);
26368 +exit_input:
26369 + input_unregister_device(pcf->input_dev);
26370 +exit_sysfs:
26371 + pm_power_off = NULL;
26372 + sysfs_remove_group(&new_client->dev.kobj, &pcf_attr_group);
26373 +exit_detach:
26374 + i2c_detach_client(new_client);
26375 +exit_free:
26376 + kfree(pcf);
26377 + pcf50633_global = NULL;
26378 + return err;
26379 +}
26380 +
26381 +static int pcf50633_attach_adapter(struct i2c_adapter *adapter)
26382 +{
26383 + DEBUGP("entering, calling i2c_probe\n");
26384 + return i2c_probe(adapter, &addr_data, &pcf50633_detect);
26385 +}
26386 +
26387 +static int pcf50633_detach_client(struct i2c_client *client)
26388 +{
26389 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
26390 +
26391 + DEBUGP("entering\n");
26392 +
26393 + apm_get_power_status = NULL;
26394 +
26395 + free_irq(pcf->irq, pcf);
26396 +
26397 + input_unregister_device(pcf->input_dev);
26398 +
26399 + if (pcf->pdata->used_features & PCF50633_FEAT_PWM_BL)
26400 + backlight_device_unregister(pcf->backlight);
26401 +
26402 + if (pcf->pdata->used_features & PCF50633_FEAT_RTC)
26403 + rtc_device_unregister(pcf->rtc);
26404 +
26405 + sysfs_remove_group(&client->dev.kobj, &pcf_attr_group);
26406 +
26407 + pm_power_off = NULL;
26408 +
26409 + kfree(pcf);
26410 +
26411 + return 0;
26412 +}
26413 +
26414 +/* you're going to need >300 bytes in buf */
26415 +
26416 +int pcf50633_report_resumers(struct pcf50633_data *pcf, char *buf)
26417 +{
26418 + static char *int_names[] = {
26419 + "adpins",
26420 + "adprem",
26421 + "usbins",
26422 + "usbrem",
26423 + NULL,
26424 + NULL,
26425 + "rtcalarm",
26426 + "second",
26427 +
26428 + "onkeyr",
26429 + "onkeyf",
26430 + "exton1r",
26431 + "exton1f",
26432 + "exton2r",
26433 + "exton2f",
26434 + "exton3r",
26435 + "exton3f",
26436 +
26437 + "batfull",
26438 + "chghalt",
26439 + "thlimon",
26440 + "thlimoff",
26441 + "usblimon",
26442 + "usblimoff",
26443 + "adcrdy",
26444 + "onkey1s",
26445 +
26446 + "lowsys",
26447 + "lowbat",
26448 + "hightmp",
26449 + "autopwrfail",
26450 + "dwn1pwrfail",
26451 + "dwn2pwrfail",
26452 + "ledpwrfail",
26453 + "ledovp",
26454 +
26455 + "ldo1pwrfail",
26456 + "ldo2pwrfail",
26457 + "ldo3pwrfail",
26458 + "ldo4pwrfail",
26459 + "ldo5pwrfail",
26460 + "ldo6pwrfail",
26461 + "hcidopwrfail",
26462 + "hcidoovl"
26463 + };
26464 + char *end = buf;
26465 + int n;
26466 +
26467 + for (n = 0; n < ARRAY_SIZE(int_names); n++)
26468 + if (int_names[n]) {
26469 + if (pcf->pcfirq_resume[n >> 3] & (1 >> (n & 7)))
26470 + end += sprintf(end, " * %s\n", int_names[n]);
26471 + else
26472 + end += sprintf(end, " %s\n", int_names[n]);
26473 + }
26474 +
26475 + return end - buf;
26476 +}
26477 +
26478 +
26479 +#ifdef CONFIG_PM
26480 +
26481 +/*
26482 + * we need to export this because pcf50633_data is kept opaque
26483 + */
26484 +
26485 +void pcf50633_register_resume_dependency(struct pcf50633_data *pcf,
26486 + struct resume_dependency *dep)
26487 +{
26488 + register_resume_dependency(&pcf->resume_dependency, dep);
26489 + if (pcf->is_suspended)
26490 + activate_all_resume_dependencies(&pcf->resume_dependency);
26491 +}
26492 +EXPORT_SYMBOL_GPL(pcf50633_register_resume_dependency);
26493 +
26494 +
26495 +static int pcf50633_suspend(struct device *dev, pm_message_t state)
26496 +{
26497 + struct i2c_client *client = to_i2c_client(dev);
26498 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
26499 + int i;
26500 + int ret;
26501 + u_int8_t tmp;
26502 + u_int8_t res[5];
26503 +
26504 + dev_err(dev, "pcf50633_suspend\n");
26505 +
26506 + /* we suspend once (!) as late as possible in the suspend sequencing */
26507 +
26508 + if ((state.event != PM_EVENT_SUSPEND) ||
26509 + (pcf->suspend_state != PCF50633_SS_RUNNING))
26510 + return -EBUSY;
26511 +
26512 + /* The general idea is to power down all unused power supplies,
26513 + * and then mask all PCF50633 interrupt sources but EXTONR, ONKEYF
26514 + * and ALARM */
26515 +
26516 + mutex_lock(&pcf->lock);
26517 +
26518 + pcf->suspend_state = PCF50633_SS_STARTING_SUSPEND;
26519 +
26520 + /* we are not going to service any further interrupts until we
26521 + * resume. If the IRQ workqueue is still pending in the background,
26522 + * it will bail when it sees we set suspend state above
26523 + */
26524 +
26525 + disable_irq(pcf->irq);
26526 +
26527 + /* Save all registers that don't "survive" standby state */
26528 + pcf->standby_regs.ooctim2 = __reg_read(pcf, PCF50633_REG_OOCTIM2);
26529 +
26530 + ret = i2c_smbus_read_i2c_block_data(&pcf->client,
26531 + PCF50633_REG_AUTOOUT,
26532 + sizeof(pcf->standby_regs.misc),
26533 + &pcf->standby_regs.misc[0]);
26534 + if (ret != sizeof(pcf->standby_regs.misc))
26535 + dev_err(dev, "Failed to save misc levels and enables :-(\n");
26536 +
26537 + /* regulator voltages and enable states */
26538 + ret = i2c_smbus_read_i2c_block_data(&pcf->client,
26539 + PCF50633_REG_LDO1OUT,
26540 + sizeof(pcf->standby_regs.ldo),
26541 + &pcf->standby_regs.ldo[0]);
26542 + if (ret != sizeof(pcf->standby_regs.ldo))
26543 + dev_err(dev, "Failed to save LDO levels and enables :-(\n");
26544 +
26545 + /* switch off power supplies that are not needed during suspend */
26546 + for (i = 0; i < __NUM_PCF50633_REGULATORS; i++) {
26547 + if ((pcf->pdata->rails[i].flags & PMU_VRAIL_F_SUSPEND_ON))
26548 + continue;
26549 +
26550 + /* we can save ourselves the read part of a read-modify-write
26551 + * here because we captured all these already
26552 + */
26553 + if (i < 4)
26554 + tmp = pcf->standby_regs.misc[i * 4 + 1];
26555 + else
26556 + tmp = pcf->standby_regs.ldo[(i - 4) * 2 + 1];
26557 +
26558 + dev_dbg(dev, "disabling reg %s by setting ENA %d to 0x%02X\n",
26559 + pcf->pdata->rails[i].name,
26560 + regulator_registers[i] + 1, tmp & 0xfe);
26561 +
26562 + /* associated enable is always +1 from OUT reg */
26563 + __reg_write(pcf, regulator_registers[i] + 1, tmp & 0xfe);
26564 + }
26565 +
26566 + /* turn off the backlight */
26567 + __reg_write(pcf, PCF50633_REG_LEDDIM, 0);
26568 + __reg_write(pcf, PCF50633_REG_LEDOUT, 2);
26569 + __reg_write(pcf, PCF50633_REG_LEDENA, 0x00);
26570 +
26571 + /* set interrupt masks so only those sources we want to wake
26572 + * us are able to
26573 + */
26574 + for (i = 0; i < 5; i++)
26575 + res[i] = ~pcf->pdata->resumers[i];
26576 +
26577 + ret = i2c_smbus_write_i2c_block_data(&pcf->client,
26578 + PCF50633_REG_INT1M,
26579 + 5, &res[0]);
26580 + if (ret)
26581 + dev_err(dev, "Failed to set wake masks :-( %d\n", ret);
26582 +
26583 + pcf->suspend_state = PCF50633_SS_COMPLETED_SUSPEND;
26584 +
26585 + mutex_unlock(&pcf->lock);
26586 +
26587 + pcf->is_suspended = 1;
26588 + activate_all_resume_dependencies(&pcf->resume_dependency);
26589 + return 0;
26590 +}
26591 +
26592 +
26593 +int pcf50633_ready(struct pcf50633_data *pcf)
26594 +{
26595 + if (!pcf)
26596 + return -EACCES;
26597 +
26598 + /* this was seen during boot with Qi, mmc_rescan racing us */
26599 + if (!pcf->probe_completed)
26600 + return -EACCES;
26601 +
26602 + if ((pcf->suspend_state != PCF50633_SS_RUNNING) &&
26603 + (pcf->suspend_state < PCF50633_SS_COMPLETED_RESUME))
26604 + return -EBUSY;
26605 +
26606 + return 0;
26607 +}
26608 +EXPORT_SYMBOL_GPL(pcf50633_ready);
26609 +
26610 +int pcf50633_wait_for_ready(struct pcf50633_data *pcf, int timeout_ms,
26611 + char *name)
26612 +{
26613 + /* so we always go once */
26614 + timeout_ms += 5;
26615 +
26616 + while ((timeout_ms >= 5) && (pcf50633_ready(pcf))) {
26617 + timeout_ms -= 5; /* well, it isn't very accurate, but OK */
26618 + msleep(5);
26619 + }
26620 +
26621 + if (timeout_ms < 5) {
26622 + printk(KERN_ERR"pcf50633_wait_for_ready: "
26623 + "%s BAILING on timeout\n", name);
26624 + return -EBUSY;
26625 + }
26626 +
26627 + return 0;
26628 +}
26629 +EXPORT_SYMBOL_GPL(pcf50633_wait_for_ready);
26630 +
26631 +/*
26632 + * if backlight resume is selected to be deferred by platform, then it
26633 + * can call this to finally reset backlight status (after LCM is resumed
26634 + * for example
26635 + */
26636 +
26637 +void pcf50633_backlight_resume(struct pcf50633_data *pcf)
26638 +{
26639 + dev_dbg(&pcf->client.dev, "pcf50633_backlight_resume\n");
26640 +
26641 + /* platform defines resume ramp speed */
26642 + reg_write(pcf, PCF50633_REG_LEDDIM,
26643 + pcf->pdata->resume_backlight_ramp_speed);
26644 +
26645 + __pcf50633bl_set_intensity(pcf, pcf->backlight->props.brightness);
26646 +}
26647 +EXPORT_SYMBOL_GPL(pcf50633_backlight_resume);
26648 +
26649 +
26650 +static int pcf50633_resume(struct device *dev)
26651 +{
26652 + struct i2c_client *client = to_i2c_client(dev);
26653 + struct pcf50633_data *pcf = i2c_get_clientdata(client);
26654 + int ret;
26655 + u8 res[5];
26656 + u8 misc[PCF50633_REG_LEDDIM - PCF50633_REG_AUTOOUT + 1];
26657 +
26658 + dev_dbg(dev, "pcf50633_resume suspended on entry = %d\n",
26659 + (int)pcf->suspend_state);
26660 + mutex_lock(&pcf->lock);
26661 +
26662 + pcf->suspend_state = PCF50633_SS_STARTING_RESUME;
26663 +
26664 + /* these guys get reset while pcf50633 is suspend state, refresh */
26665 +
26666 + __reg_write(pcf, PCF50633_REG_OOCTIM2, pcf->standby_regs.ooctim2);
26667 +
26668 + memcpy(misc, pcf->standby_regs.misc, sizeof(pcf->standby_regs.misc));
26669 +
26670 + if (pcf->pdata->defer_resume_backlight) {
26671 + misc[PCF50633_REG_LEDOUT - PCF50633_REG_AUTOOUT] = 1;
26672 + misc[PCF50633_REG_LEDENA - PCF50633_REG_AUTOOUT] = 0x20;
26673 + misc[PCF50633_REG_LEDCTL - PCF50633_REG_AUTOOUT] = 1;
26674 + misc[PCF50633_REG_LEDDIM - PCF50633_REG_AUTOOUT] = 1;
26675 + }
26676 +
26677 + /* regulator voltages and enable states */
26678 + ret = i2c_smbus_write_i2c_block_data(&pcf->client,
26679 + PCF50633_REG_AUTOOUT,
26680 + sizeof(misc),
26681 + &misc[0]);
26682 + if (ret)
26683 + dev_err(dev, "Failed to restore misc :-( %d\n", ret);
26684 +
26685 + /* platform can choose to defer backlight bringup */
26686 + if (!pcf->pdata->defer_resume_backlight)
26687 + pcf50633_backlight_resume(pcf);
26688 +
26689 + /* regulator voltages and enable states */
26690 + ret = i2c_smbus_write_i2c_block_data(&pcf->client,
26691 + PCF50633_REG_LDO1OUT,
26692 + sizeof(pcf->standby_regs.ldo),
26693 + &pcf->standby_regs.ldo[0]);
26694 + if (ret)
26695 + dev_err(dev, "Failed to restore LDOs :-( %d\n", ret);
26696 +
26697 + memset(res, 0, sizeof(res));
26698 + /* not interested in second on resume */
26699 + res[0] = PCF50633_INT1_SECOND;
26700 + ret = i2c_smbus_write_i2c_block_data(&pcf->client,
26701 + PCF50633_REG_INT1M,
26702 + 5, &res[0]);
26703 + if (ret)
26704 + dev_err(dev, "Failed to set int masks :-( %d\n", ret);
26705 +
26706 + pcf->suspend_state = PCF50633_SS_COMPLETED_RESUME;
26707 +
26708 + enable_irq(pcf->irq);
26709 +
26710 + mutex_unlock(&pcf->lock);
26711 +
26712 + /* gratuitous call to PCF work function, in the case that the PCF
26713 + * interrupt edge was missed during resume, this forces the pending
26714 + * register clear and lifts the interrupt back high again. In the
26715 + * case nothing is waiting for service, no harm done.
26716 + */
26717 +
26718 + get_device(&pcf->client.dev);
26719 + pcf50633_work(&pcf->work);
26720 +
26721 + pcf->is_suspended = 0;
26722 + callback_all_resume_dependencies(&pcf->resume_dependency);
26723 +
26724 + return 0;
26725 +}
26726 +#else
26727 +#define pcf50633_suspend NULL
26728 +#define pcf50633_resume NULL
26729 +#endif
26730 +
26731 +static struct i2c_driver pcf50633_driver = {
26732 + .driver = {
26733 + .name = "pcf50633",
26734 + .suspend= pcf50633_suspend,
26735 + .resume = pcf50633_resume,
26736 + },
26737 + .id = I2C_DRIVERID_PCF50633,
26738 + .attach_adapter = pcf50633_attach_adapter,
26739 + .detach_client = pcf50633_detach_client,
26740 +};
26741 +
26742 +/* we have this purely to capture an early indication that we are coming out
26743 + * of suspend, before our device resume got called; async interrupt service is
26744 + * interested in this
26745 + */
26746 +
26747 +static int pcf50633_plat_resume(struct platform_device *pdev)
26748 +{
26749 + /* i2c_get_clientdata(to_i2c_client(&pdev->dev)) returns NULL at this
26750 + * early resume time so we have to use pcf50633_global
26751 + */
26752 + pcf50633_global->suspend_state = PCF50633_SS_RESUMING_BUT_NOT_US_YET;
26753 +
26754 + return 0;
26755 +}
26756 +
26757 +/* platform driver, since i2c devices don't have platform_data */
26758 +static int __init pcf50633_plat_probe(struct platform_device *pdev)
26759 +{
26760 + struct pcf50633_platform_data *pdata = pdev->dev.platform_data;
26761 +
26762 + if (!pdata)
26763 + return -ENODEV;
26764 +
26765 + pcf50633_pdev = pdev;
26766 +
26767 + return 0;
26768 +}
26769 +
26770 +static int pcf50633_plat_remove(struct platform_device *pdev)
26771 +{
26772 + return 0;
26773 +}
26774 +
26775 +static struct platform_driver pcf50633_plat_driver = {
26776 + .probe = pcf50633_plat_probe,
26777 + .remove = pcf50633_plat_remove,
26778 + .resume_early = pcf50633_plat_resume,
26779 + .driver = {
26780 + .owner = THIS_MODULE,
26781 + .name = "pcf50633",
26782 + },
26783 +};
26784 +
26785 +static int __init pcf50633_init(void)
26786 +{
26787 + int rc;
26788 +
26789 + if (!(rc = platform_driver_register(&pcf50633_plat_driver)))
26790 + rc = i2c_add_driver(&pcf50633_driver);
26791 +
26792 + return rc;
26793 +}
26794 +
26795 +static void pcf50633_exit(void)
26796 +{
26797 + i2c_del_driver(&pcf50633_driver);
26798 + platform_driver_unregister(&pcf50633_plat_driver);
26799 +}
26800 +
26801 +MODULE_DESCRIPTION("I2C chip driver for NXP PCF50633 power management unit");
26802 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
26803 +MODULE_LICENSE("GPL");
26804 +
26805 +module_init(pcf50633_init);
26806 +module_exit(pcf50633_exit);
26807 Index: linux-2.6.24.7/drivers/i2c/chips/pcf50633.h
26808 ===================================================================
26809 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
26810 +++ linux-2.6.24.7/drivers/i2c/chips/pcf50633.h 2008-12-11 22:46:49.000000000 +0100
26811 @@ -0,0 +1,349 @@
26812 +#ifndef _PCF50633_H
26813 +#define _PCF50633_H
26814 +
26815 +/* Philips PCF50633 Power Managemnt Unit (PMU) driver
26816 + * (C) 2006-2007 by Openmoko, Inc.
26817 + * Author: Harald Welte <laforge@openmoko.org>
26818 + *
26819 + */
26820 +
26821 +enum pfc50633_regs {
26822 + PCF50633_REG_VERSION = 0x00,
26823 + PCF50633_REG_VARIANT = 0x01,
26824 + PCF50633_REG_INT1 = 0x02, /* Interrupt Status */
26825 + PCF50633_REG_INT2 = 0x03, /* Interrupt Status */
26826 + PCF50633_REG_INT3 = 0x04, /* Interrupt Status */
26827 + PCF50633_REG_INT4 = 0x05, /* Interrupt Status */
26828 + PCF50633_REG_INT5 = 0x06, /* Interrupt Status */
26829 + PCF50633_REG_INT1M = 0x07, /* Interrupt Mask */
26830 + PCF50633_REG_INT2M = 0x08, /* Interrupt Mask */
26831 + PCF50633_REG_INT3M = 0x09, /* Interrupt Mask */
26832 + PCF50633_REG_INT4M = 0x0a, /* Interrupt Mask */
26833 + PCF50633_REG_INT5M = 0x0b, /* Interrupt Mask */
26834 + PCF50633_REG_OOCSHDWN = 0x0c,
26835 + PCF50633_REG_OOCWAKE = 0x0d,
26836 + PCF50633_REG_OOCTIM1 = 0x0e,
26837 + PCF50633_REG_OOCTIM2 = 0x0f,
26838 + PCF50633_REG_OOCMODE = 0x10,
26839 + PCF50633_REG_OOCCTL = 0x11,
26840 + PCF50633_REG_OOCSTAT = 0x12,
26841 + PCF50633_REG_GPIOCTL = 0x13,
26842 + PCF50633_REG_GPIO1CFG = 0x14,
26843 + PCF50633_REG_GPIO2CFG = 0x15,
26844 + PCF50633_REG_GPIO3CFG = 0x16,
26845 + PCF50633_REG_GPOCFG = 0x17,
26846 + PCF50633_REG_BVMCTL = 0x18,
26847 + PCF50633_REG_SVMCTL = 0x19,
26848 + PCF50633_REG_AUTOOUT = 0x1a,
26849 + PCF50633_REG_AUTOENA = 0x1b,
26850 + PCF50633_REG_AUTOCTL = 0x1c,
26851 + PCF50633_REG_AUTOMXC = 0x1d,
26852 + PCF50633_REG_DOWN1OUT = 0x1e,
26853 + PCF50633_REG_DOWN1ENA = 0x1f,
26854 + PCF50633_REG_DOWN1CTL = 0x20,
26855 + PCF50633_REG_DOWN1MXC = 0x21,
26856 + PCF50633_REG_DOWN2OUT = 0x22,
26857 + PCF50633_REG_DOWN2ENA = 0x23,
26858 + PCF50633_REG_DOWN2CTL = 0x24,
26859 + PCF50633_REG_DOWN2MXC = 0x25,
26860 + PCF50633_REG_MEMLDOOUT = 0x26,
26861 + PCF50633_REG_MEMLDOENA = 0x27,
26862 + PCF50633_REG_LEDOUT = 0x28,
26863 + PCF50633_REG_LEDENA = 0x29,
26864 + PCF50633_REG_LEDCTL = 0x2a,
26865 + PCF50633_REG_LEDDIM = 0x2b,
26866 + /* reserved */
26867 + PCF50633_REG_LDO1OUT = 0x2d,
26868 + PCF50633_REG_LDO1ENA = 0x2e,
26869 + PCF50633_REG_LDO2OUT = 0x2f,
26870 + PCF50633_REG_LDO2ENA = 0x30,
26871 + PCF50633_REG_LDO3OUT = 0x31,
26872 + PCF50633_REG_LDO3ENA = 0x32,
26873 + PCF50633_REG_LDO4OUT = 0x33,
26874 + PCF50633_REG_LDO4ENA = 0x34,
26875 + PCF50633_REG_LDO5OUT = 0x35,
26876 + PCF50633_REG_LDO5ENA = 0x36,
26877 + PCF50633_REG_LDO6OUT = 0x37,
26878 + PCF50633_REG_LDO6ENA = 0x38,
26879 + PCF50633_REG_HCLDOOUT = 0x39,
26880 + PCF50633_REG_HCLDOENA = 0x3a,
26881 + PCF50633_REG_STBYCTL1 = 0x3b,
26882 + PCF50633_REG_STBYCTL2 = 0x3c,
26883 + PCF50633_REG_DEBPF1 = 0x3d,
26884 + PCF50633_REG_DEBPF2 = 0x3e,
26885 + PCF50633_REG_DEBPF3 = 0x3f,
26886 + PCF50633_REG_HCLDOOVL = 0x40,
26887 + PCF50633_REG_DCDCSTAT = 0x41,
26888 + PCF50633_REG_LDOSTAT = 0x42,
26889 + PCF50633_REG_MBCC1 = 0x43,
26890 + PCF50633_REG_MBCC2 = 0x44,
26891 + PCF50633_REG_MBCC3 = 0x45,
26892 + PCF50633_REG_MBCC4 = 0x46,
26893 + PCF50633_REG_MBCC5 = 0x47,
26894 + PCF50633_REG_MBCC6 = 0x48,
26895 + PCF50633_REG_MBCC7 = 0x49,
26896 + PCF50633_REG_MBCC8 = 0x4a,
26897 + PCF50633_REG_MBCS1 = 0x4b,
26898 + PCF50633_REG_MBCS2 = 0x4c,
26899 + PCF50633_REG_MBCS3 = 0x4d,
26900 + PCF50633_REG_BBCCTL = 0x4e,
26901 + PCF50633_REG_ALMGAIN = 0x4f,
26902 + PCF50633_REG_ALMDATA = 0x50,
26903 + /* reserved */
26904 + PCF50633_REG_ADCC3 = 0x52,
26905 + PCF50633_REG_ADCC2 = 0x53,
26906 + PCF50633_REG_ADCC1 = 0x54,
26907 + PCF50633_REG_ADCS1 = 0x55,
26908 + PCF50633_REG_ADCS2 = 0x56,
26909 + PCF50633_REG_ADCS3 = 0x57,
26910 + /* reserved */
26911 + PCF50633_REG_RTCSC = 0x59, /* Second */
26912 + PCF50633_REG_RTCMN = 0x5a, /* Minute */
26913 + PCF50633_REG_RTCHR = 0x5b, /* Hour */
26914 + PCF50633_REG_RTCWD = 0x5c, /* Weekday */
26915 + PCF50633_REG_RTCDT = 0x5d, /* Day */
26916 + PCF50633_REG_RTCMT = 0x5e, /* Month */
26917 + PCF50633_REG_RTCYR = 0x5f, /* Year */
26918 + PCF50633_REG_RTCSCA = 0x60, /* Alarm Second */
26919 + PCF50633_REG_RTCMNA = 0x61, /* Alarm Minute */
26920 + PCF50633_REG_RTCHRA = 0x62, /* Alarm Hour */
26921 + PCF50633_REG_RTCWDA = 0x63, /* Alarm Weekday */
26922 + PCF50633_REG_RTCDTA = 0x64, /* Alarm Day */
26923 + PCF50633_REG_RTCMTA = 0x65, /* Alarm Month */
26924 + PCF50633_REG_RTCYRA = 0x66, /* Alarm Year */
26925 +
26926 + PCF50633_REG_MEMBYTE0 = 0x67,
26927 + PCF50633_REG_MEMBYTE1 = 0x68,
26928 + PCF50633_REG_MEMBYTE2 = 0x69,
26929 + PCF50633_REG_MEMBYTE3 = 0x6a,
26930 + PCF50633_REG_MEMBYTE4 = 0x6b,
26931 + PCF50633_REG_MEMBYTE5 = 0x6c,
26932 + PCF50633_REG_MEMBYTE6 = 0x6d,
26933 + PCF50633_REG_MEMBYTE7 = 0x6e,
26934 + /* reserved */
26935 + PCF50633_REG_DCDCPFM = 0x84,
26936 + __NUM_PCF50633_REGS
26937 +};
26938 +
26939 +
26940 +enum pcf50633_reg_oocshdwn {
26941 + PCF50633_OOCSHDWN_GOSTDBY = 0x01,
26942 + PCF50633_OOCSHDWN_TOTRST = 0x04,
26943 + PCF50633_OOCSHDWN_COLDBOOT = 0x08,
26944 +};
26945 +
26946 +enum pcf50633_reg_oocwake {
26947 + PCF50633_OOCWAKE_ONKEY = 0x01,
26948 + PCF50633_OOCWAKE_EXTON1 = 0x02,
26949 + PCF50633_OOCWAKE_EXTON2 = 0x04,
26950 + PCF50633_OOCWAKE_EXTON3 = 0x08,
26951 + PCF50633_OOCWAKE_RTC = 0x10,
26952 + /* reserved */
26953 + PCF50633_OOCWAKE_USB = 0x40,
26954 + PCF50633_OOCWAKE_ADP = 0x80,
26955 +};
26956 +
26957 +enum pcf50633_reg_mbcc1 {
26958 + PCF50633_MBCC1_CHGENA = 0x01, /* Charger enable */
26959 + PCF50633_MBCC1_AUTOSTOP = 0x02,
26960 + PCF50633_MBCC1_AUTORES = 0x04, /* automatic resume */
26961 + PCF50633_MBCC1_RESUME = 0x08, /* explicit resume cmd */
26962 + PCF50633_MBCC1_RESTART = 0x10, /* restart charging */
26963 + PCF50633_MBCC1_PREWDTIME_60M = 0x20, /* max. precharging time */
26964 + PCF50633_MBCC1_WDTIME_1H = 0x00,
26965 + PCF50633_MBCC1_WDTIME_2H = 0x40,
26966 + PCF50633_MBCC1_WDTIME_4H = 0x80,
26967 + PCF50633_MBCC1_WDTIME_6H = 0xc0,
26968 +};
26969 +#define PCF50633_MBCC1_WDTIME_MASK 0xc0
26970 +
26971 +enum pcf50633_reg_mbcc2 {
26972 + PCF50633_MBCC2_VBATCOND_2V7 = 0x00,
26973 + PCF50633_MBCC2_VBATCOND_2V85 = 0x01,
26974 + PCF50633_MBCC2_VBATCOND_3V0 = 0x02,
26975 + PCF50633_MBCC2_VBATCOND_3V15 = 0x03,
26976 + PCF50633_MBCC2_VMAX_4V = 0x00,
26977 + PCF50633_MBCC2_VMAX_4V20 = 0x28,
26978 + PCF50633_MBCC2_VRESDEBTIME_64S = 0x80, /* debounce time (32/64sec) */
26979 +};
26980 +#define PCF50633_MBCC2_VBATCOND_MASK 0x03
26981 +#define PCF50633_MBCC2_VMAX_MASK 0x3c
26982 +
26983 +enum pcf50633_reg_adcc1 {
26984 + PCF50633_ADCC1_ADCSTART = 0x01,
26985 + PCF50633_ADCC1_RES_10BIT = 0x02,
26986 + PCF50633_ADCC1_AVERAGE_NO = 0x00,
26987 + PCF50633_ADCC1_AVERAGE_4 = 0x04,
26988 + PCF50633_ADCC1_AVERAGE_8 = 0x08,
26989 + PCF50633_ADCC1_AVERAGE_16 = 0x0c,
26990 +
26991 + PCF50633_ADCC1_MUX_BATSNS_RES = 0x00,
26992 + PCF50633_ADCC1_MUX_BATSNS_SUBTR = 0x10,
26993 + PCF50633_ADCC1_MUX_ADCIN2_RES = 0x20,
26994 + PCF50633_ADCC1_MUX_ADCIN2_SUBTR = 0x30,
26995 + PCF50633_ADCC1_MUX_BATTEMP = 0x60,
26996 + PCF50633_ADCC1_MUX_ADCIN1 = 0x70,
26997 +};
26998 +#define PCF50633_ADCC1_AVERAGE_MASK 0x0c
26999 +#define PCF50633_ADCC1_ADCMUX_MASK 0xf0
27000 +
27001 +enum pcf50633_reg_adcc2 {
27002 + PCF50633_ADCC2_RATIO_NONE = 0x00,
27003 + PCF50633_ADCC2_RATIO_BATTEMP = 0x01,
27004 + PCF50633_ADCC2_RATIO_ADCIN1 = 0x02,
27005 + PCF50633_ADCC2_RATIO_BOTH = 0x03,
27006 + PCF50633_ADCC2_RATIOSETTL_100US = 0x04,
27007 +};
27008 +#define PCF50633_ADCC2_RATIO_MASK 0x03
27009 +
27010 +enum pcf50633_reg_adcc3 {
27011 + PCF50633_ADCC3_ACCSW_EN = 0x01,
27012 + PCF50633_ADCC3_NTCSW_EN = 0x04,
27013 + PCF50633_ADCC3_RES_DIV_TWO = 0x10,
27014 + PCF50633_ADCC3_RES_DIV_THREE = 0x00,
27015 +};
27016 +
27017 +enum pcf50633_reg_adcs3 {
27018 + PCF50633_ADCS3_REF_NTCSW = 0x00,
27019 + PCF50633_ADCS3_REF_ACCSW = 0x10,
27020 + PCF50633_ADCS3_REF_2V0 = 0x20,
27021 + PCF50633_ADCS3_REF_VISA = 0x30,
27022 + PCF50633_ADCS3_REF_2V0_2 = 0x70,
27023 + PCF50633_ADCS3_ADCRDY = 0x80,
27024 +};
27025 +#define PCF50633_ADCS3_ADCDAT1L_MASK 0x03
27026 +#define PCF50633_ADCS3_ADCDAT2L_MASK 0x0c
27027 +#define PCF50633_ADCS3_ADCDAT2L_SHIFT 2
27028 +#define PCF50633_ASCS3_REF_MASK 0x70
27029 +
27030 +enum pcf50633_regulator_enable {
27031 + PCF50633_REGULATOR_ON = 0x01,
27032 + PCF50633_REGULATOR_ON_GPIO1 = 0x02,
27033 + PCF50633_REGULATOR_ON_GPIO2 = 0x04,
27034 + PCF50633_REGULATOR_ON_GPIO3 = 0x08,
27035 +};
27036 +#define PCF50633_REGULATOR_ON_MASK 0x0f
27037 +
27038 +enum pcf50633_regulator_phase {
27039 + PCF50633_REGULATOR_ACTPH1 = 0x00,
27040 + PCF50633_REGULATOR_ACTPH2 = 0x10,
27041 + PCF50633_REGULATOR_ACTPH3 = 0x20,
27042 + PCF50633_REGULATOR_ACTPH4 = 0x30,
27043 +};
27044 +#define PCF50633_REGULATOR_ACTPH_MASK 0x30
27045 +
27046 +enum pcf50633_reg_gpocfg {
27047 + PCF50633_GPOCFG_GPOSEL_0 = 0x00,
27048 + PCF50633_GPOCFG_GPOSEL_LED_NFET = 0x01,
27049 + PCF50633_GPOCFG_GPOSEL_SYSxOK = 0x02,
27050 + PCF50633_GPOCFG_GPOSEL_CLK32K = 0x03,
27051 + PCF50633_GPOCFG_GPOSEL_ADAPUSB = 0x04,
27052 + PCF50633_GPOCFG_GPOSEL_USBxOK = 0x05,
27053 + PCF50633_GPOCFG_GPOSEL_ACTPH4 = 0x06,
27054 + PCF50633_GPOCFG_GPOSEL_1 = 0x07,
27055 + PCF50633_GPOCFG_GPOSEL_INVERSE = 0x08,
27056 +};
27057 +#define PCF50633_GPOCFG_GPOSEL_MASK 0x07
27058 +
27059 +#if 0
27060 +enum pcf50633_reg_mbcc1 {
27061 + PCF50633_MBCC1_CHGENA = 0x01,
27062 + PCF50633_MBCC1_AUTOSTOP = 0x02,
27063 + PCF50633_MBCC1_AUTORES = 0x04,
27064 + PCF50633_MBCC1_RESUME = 0x08,
27065 + PCF50633_MBCC1_RESTART = 0x10,
27066 + PCF50633_MBCC1_PREWDTIME_30MIN = 0x00,
27067 + PCF50633_MBCC1_PREWDTIME_60MIN = 0x20,
27068 + PCF50633_MBCC1_WDTIME_2HRS = 0x40,
27069 + PCF50633_MBCC1_WDTIME_4HRS = 0x80,
27070 + PCF50633_MBCC1_WDTIME_6HRS = 0xc0,
27071 +};
27072 +
27073 +enum pcf50633_reg_mbcc2 {
27074 + PCF50633_MBCC2_VBATCOND_2V7 = 0x00,
27075 + PCF50633_MBCC2_VBATCOND_2V85 = 0x01,
27076 + PCF50633_MBCC2_VBATCOND_3V0 = 0x02,
27077 + PCF50633_MBCC2_VBATCOND_3V15 = 0x03,
27078 + PCF50633_MBCC2_VRESDEBTIME_64S = 0x80,
27079 +};
27080 +#define PCF50633_MBCC2_VMAX_MASK 0x3c
27081 +#endif
27082 +
27083 +enum pcf50633_reg_mbcc7 {
27084 + PCF50633_MBCC7_USB_100mA = 0x00,
27085 + PCF50633_MBCC7_USB_500mA = 0x01,
27086 + PCF50633_MBCC7_USB_1000mA = 0x02,
27087 + PCF50633_MBCC7_USB_SUSPEND = 0x03,
27088 + PCF50633_MBCC7_BATTEMP_EN = 0x04,
27089 + PCF50633_MBCC7_BATSYSIMAX_1A6 = 0x00,
27090 + PCF50633_MBCC7_BATSYSIMAX_1A8 = 0x40,
27091 + PCF50633_MBCC7_BATSYSIMAX_2A0 = 0x80,
27092 + PCF50633_MBCC7_BATSYSIMAX_2A2 = 0xc0,
27093 +};
27094 +#define PCF56033_MBCC7_USB_MASK 0x03
27095 +
27096 +enum pcf50633_reg_mbcc8 {
27097 + PCF50633_MBCC8_USBENASUS = 0x10,
27098 +};
27099 +
27100 +enum pcf50633_reg_mbcs1 {
27101 + PCF50633_MBCS1_USBPRES = 0x01,
27102 + PCF50633_MBCS1_USBOK = 0x02,
27103 + PCF50633_MBCS1_ADAPTPRES = 0x04,
27104 + PCF50633_MBCS1_ADAPTOK = 0x08,
27105 + PCF50633_MBCS1_TBAT_OK = 0x00,
27106 + PCF50633_MBCS1_TBAT_ABOVE = 0x10,
27107 + PCF50633_MBCS1_TBAT_BELOW = 0x20,
27108 + PCF50633_MBCS1_TBAT_UNDEF = 0x30,
27109 + PCF50633_MBCS1_PREWDTEXP = 0x40,
27110 + PCF50633_MBCS1_WDTEXP = 0x80,
27111 +};
27112 +
27113 +enum pcf50633_reg_mbcs2_mbcmod {
27114 + PCF50633_MBCS2_MBC_PLAY = 0x00,
27115 + PCF50633_MBCS2_MBC_USB_PRE = 0x01,
27116 + PCF50633_MBCS2_MBC_USB_PRE_WAIT = 0x02,
27117 + PCF50633_MBCS2_MBC_USB_FAST = 0x03,
27118 + PCF50633_MBCS2_MBC_USB_FAST_WAIT= 0x04,
27119 + PCF50633_MBCS2_MBC_USB_SUSPEND = 0x05,
27120 + PCF50633_MBCS2_MBC_ADP_PRE = 0x06,
27121 + PCF50633_MBCS2_MBC_ADP_PRE_WAIT = 0x07,
27122 + PCF50633_MBCS2_MBC_ADP_FAST = 0x08,
27123 + PCF50633_MBCS2_MBC_ADP_FAST_WAIT= 0x09,
27124 + PCF50633_MBCS2_MBC_BAT_FULL = 0x0a,
27125 + PCF50633_MBCS2_MBC_HALT = 0x0b,
27126 +};
27127 +#define PCF50633_MBCS2_MBC_MASK 0x0f
27128 +enum pcf50633_reg_mbcs2_chgstat {
27129 + PCF50633_MBCS2_CHGS_NONE = 0x00,
27130 + PCF50633_MBCS2_CHGS_ADAPTER = 0x10,
27131 + PCF50633_MBCS2_CHGS_USB = 0x20,
27132 + PCF50633_MBCS2_CHGS_BOTH = 0x30,
27133 +};
27134 +#define PCF50633_MBCS2_RESSTAT_AUTO 0x40
27135 +
27136 +enum pcf50633_reg_mbcs3 {
27137 + PCF50633_MBCS3_USBLIM_PLAY = 0x01,
27138 + PCF50633_MBCS3_USBLIM_CGH = 0x02,
27139 + PCF50633_MBCS3_TLIM_PLAY = 0x04,
27140 + PCF50633_MBCS3_TLIM_CHG = 0x08,
27141 + PCF50633_MBCS3_ILIM = 0x10, /* 1: Ibat > Icutoff */
27142 + PCF50633_MBCS3_VLIM = 0x20, /* 1: Vbat == Vmax */
27143 + PCF50633_MBCS3_VBATSTAT = 0x40, /* 1: Vbat > Vbatcond */
27144 + PCF50633_MBCS3_VRES = 0x80, /* 1: Vbat > Vth(RES) */
27145 +};
27146 +
27147 +/* this is to be provided by the board implementation */
27148 +extern const u_int8_t pcf50633_initial_regs[__NUM_PCF50633_REGS];
27149 +
27150 +void pcf50633_reg_write(u_int8_t reg, u_int8_t val);
27151 +
27152 +u_int8_t pcf50633_reg_read(u_int8_t reg);
27153 +
27154 +void pcf50633_reg_set_bit_mask(u_int8_t reg, u_int8_t mask, u_int8_t val);
27155 +void pcf50633_reg_clear_bits(u_int8_t reg, u_int8_t bits);
27156 +
27157 +void pcf50633_charge_autofast(int on);
27158 +
27159 +#endif /* _PCF50606_H */
27160 +
27161 Index: linux-2.6.24.7/drivers/i2c/chips/tsl256x.c
27162 ===================================================================
27163 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
27164 +++ linux-2.6.24.7/drivers/i2c/chips/tsl256x.c 2008-12-11 22:46:49.000000000 +0100
27165 @@ -0,0 +1,310 @@
27166 +/*
27167 + * tsl256x.c -- TSL256x Light Sensor driver
27168 + *
27169 + * Copyright 2007 by Fiwin.
27170 + * Author: Alec Tsai <alec_tsai@fiwin.com.tw>
27171 + *
27172 + * This program is free software; you can redistribute it and/or modify
27173 + * it under the terms of the GNU General Public License version 2 as
27174 + * published by the Free Software Foundation.
27175 + *
27176 + * This I2C client driver refers to pcf50606.c.
27177 + */
27178 +
27179 +#include <linux/module.h>
27180 +#include <linux/init.h>
27181 +#include <linux/i2c.h>
27182 +#include <linux/types.h>
27183 +#include <linux/input.h>
27184 +
27185 +#include "tsl256x.h"
27186 +
27187 +static unsigned short normal_i2c[] = { 0x39, I2C_CLIENT_END };
27188 +/* Magic definition of all other variables and things */
27189 +I2C_CLIENT_INSMOD;
27190 +
27191 +struct tsl256x_data {
27192 + struct i2c_client client;
27193 + struct mutex lock;
27194 + struct input_dev *input_dev;
27195 +};
27196 +
27197 +static struct i2c_driver tsl256x_driver;
27198 +
27199 +/******************************************************************************
27200 + * Low-Level routines
27201 + *****************************************************************************/
27202 +static inline int __reg_write(struct tsl256x_data *tsl, u_int8_t reg,
27203 + u_int8_t val)
27204 +{
27205 + return i2c_smbus_write_byte_data(&tsl->client, reg, val);
27206 +}
27207 +
27208 +static int reg_write(struct tsl256x_data *tsl, u_int8_t reg, u_int8_t val)
27209 +{
27210 + int ret;
27211 +
27212 + mutex_lock(&tsl->lock);
27213 + ret = __reg_write(tsl, reg, val);
27214 + mutex_unlock(&tsl->lock);
27215 +
27216 + return ret;
27217 +}
27218 +
27219 +static inline int32_t __reg_read(struct tsl256x_data *tsl, u_int8_t reg)
27220 +{
27221 + int32_t ret;
27222 +
27223 + ret = i2c_smbus_read_byte_data(&tsl->client, reg);
27224 +
27225 + return ret;
27226 +}
27227 +
27228 +static u_int8_t reg_read(struct tsl256x_data *tsl, u_int8_t reg)
27229 +{
27230 + int32_t ret;
27231 +
27232 + mutex_lock(&tsl->lock);
27233 + ret = __reg_read(tsl, reg);
27234 + mutex_unlock(&tsl->lock);
27235 +
27236 + return ret & 0xff;
27237 +}
27238 +
27239 +u_int32_t calculate_lux(u_int32_t iGain, u_int32_t iType, u_int32_t ch0,
27240 + u_int32_t ch1)
27241 +{
27242 + u_int32_t channel0 = ch0 * 636 / 10;
27243 + u_int32_t channel1 = ch1 * 636 / 10;
27244 + u_int32_t lux_value = 0;
27245 + u_int32_t ratio = (channel1 * (2^RATIO_SCALE)) / channel0;
27246 + u_int32_t b = 0, m = 0;
27247 +
27248 + if (0 == ch0)
27249 + return 0;
27250 + else {
27251 + if (ratio > (13 * (2^RATIO_SCALE) / 10))
27252 + return 0;
27253 + }
27254 +
27255 + switch (iType) {
27256 + case 0: // T package
27257 + if ((ratio >= 0) && (ratio <= K1T)) {
27258 + b = B1T;
27259 + m = M1T;
27260 + } else if (ratio <= K2T) {
27261 + b = B2T;
27262 + m = M2T;
27263 + } else if (ratio <= K3T) {
27264 + b = B3T;
27265 + m = M3T;
27266 + } else if (ratio <= K4T) {
27267 + b = B4T;
27268 + m = M4T;
27269 + } else if (ratio <= K5T) {
27270 + b = B5T;
27271 + m = M5T;
27272 + } else if (ratio <= K6T) {
27273 + b = B6T;
27274 + m = M6T;
27275 + } else if (ratio <= K7T) {
27276 + b = B7T;
27277 + m = M7T;
27278 + } else if (ratio > K8T) {
27279 + b = B8T;
27280 + m = M8T;
27281 + }
27282 + break;
27283 + case 1:// CS package
27284 + if ((ratio >= 0) && (ratio <= K1C)) {
27285 + b = B1C;
27286 + m = M1C;
27287 + } else if (ratio <= K2C) {
27288 + b = B2C;
27289 + m = M2C;
27290 + } else if (ratio <= K3C) {
27291 + b = B3C;
27292 + m = M3C;
27293 + } else if (ratio <= K4C) {
27294 + b = B4C;
27295 + m = M4C;
27296 + } else if (ratio <= K5C) {
27297 + b = B5C;
27298 + m = M5C;
27299 + } else if (ratio <= K6C) {
27300 + b = B6C;
27301 + m = M6C;
27302 + } else if (ratio <= K7C) {
27303 + b = B7C;
27304 + m = M7C;
27305 + } else if (ratio > K8C) {
27306 + b = B8C;
27307 + m = M8C;
27308 + }
27309 + break;
27310 + default:
27311 + return 0;
27312 + break;
27313 + }
27314 +
27315 + lux_value = ((channel0 * b) - (channel1 * m)) / 16384;
27316 + return(lux_value);
27317 +}
27318 +
27319 +static ssize_t tsl256x_show_light_lux(struct device *dev,
27320 + struct device_attribute *attr, char *buf)
27321 +{
27322 + struct i2c_client *client = to_i2c_client(dev);
27323 + struct tsl256x_data *tsl = i2c_get_clientdata(client);
27324 + u_int8_t low_byte_of_ch0 = 0, high_byte_of_ch0 = 0;
27325 + u_int8_t low_byte_of_ch1 = 0, high_byte_of_ch1 = 0;
27326 + u_int32_t adc_value_ch0, adc_value_ch1, adc_value;
27327 +
27328 + low_byte_of_ch0 = reg_read(tsl, TSL256X_REG_DATA0LOW);
27329 + high_byte_of_ch0 = reg_read(tsl, TSL256X_REG_DATA0HIGH);
27330 + low_byte_of_ch1 = reg_read(tsl, TSL256X_REG_DATA1LOW);
27331 + high_byte_of_ch1 = reg_read(tsl, TSL256X_REG_DATA1HIGH);
27332 +
27333 + adc_value_ch0 = (high_byte_of_ch0 * 256 + low_byte_of_ch0) * 16;
27334 + adc_value_ch1 = (high_byte_of_ch1 * 256 + low_byte_of_ch1) * 16;
27335 +
27336 + adc_value = calculate_lux(0, 0, adc_value_ch0, adc_value_ch1);
27337 + return sprintf(buf, "%d\n", adc_value);
27338 +}
27339 +
27340 +static DEVICE_ATTR(light_lux, S_IRUGO, tsl256x_show_light_lux, NULL);
27341 +
27342 +static int tsl256x_detect(struct i2c_adapter *adapter, int address, int kind)
27343 +{
27344 + struct i2c_client *new_client = NULL;
27345 + struct tsl256x_data *tsl256x = NULL;
27346 + u_int8_t id = 0;
27347 + int res = 0;
27348 +
27349 + if (!(tsl256x = kzalloc(sizeof(*tsl256x), GFP_KERNEL)))
27350 + return -ENOMEM;
27351 +
27352 + mutex_init(&tsl256x->lock);
27353 + new_client = &tsl256x->client;
27354 + i2c_set_clientdata(new_client, tsl256x);
27355 + new_client->addr = address;
27356 + new_client->adapter = adapter;
27357 + new_client->driver = &tsl256x_driver;
27358 + new_client->flags = 0;
27359 + strlcpy(new_client->name, "tsl256x", I2C_NAME_SIZE);
27360 +
27361 + /* now we try to detect the chip */
27362 + /* register with i2c core */
27363 + res = i2c_attach_client(new_client);
27364 + if (res) {
27365 + printk(KERN_DEBUG "[%s]Error: during i2c_attach_client()\n",
27366 + new_client->name);
27367 + goto exit_free;
27368 + } else {
27369 + printk(KERN_INFO "TSL256X is attached to I2C bus.\n");
27370 + }
27371 +
27372 + /* Configure TSL256X. */
27373 + {
27374 + /* Power up TSL256X. */
27375 + reg_write(tsl256x, TSL256X_REG_CONTROL, 0x03);
27376 +
27377 + /* Check TSL256X ID. */
27378 + id = reg_read(tsl256x, TSL256X_REG_ID);
27379 + if (TSL2561_ID == (id & 0xF0)) {
27380 + /* Configuring the Timing Register.
27381 + High Gain (16x), integration time of 101ms. */
27382 + reg_write(tsl256x, TSL256X_REG_TIMING, 0x11);
27383 + } else {
27384 + goto exit_free;
27385 + }
27386 + }
27387 +
27388 + res = device_create_file(&new_client->dev, &dev_attr_light_lux);
27389 + if (res)
27390 + goto exit_detach;
27391 +
27392 + return 0;
27393 +
27394 +exit_free:
27395 + kfree(tsl256x);
27396 + return res;
27397 +exit_detach:
27398 + i2c_detach_client(new_client);
27399 + return res;
27400 +}
27401 +
27402 +static int tsl256x_attach_adapter(struct i2c_adapter *adapter)
27403 +{
27404 + return i2c_probe(adapter, &addr_data, &tsl256x_detect);
27405 +}
27406 +
27407 +static int tsl256x_detach_client(struct i2c_client *client)
27408 +{
27409 + struct tsl256x_data *tsl256x = i2c_get_clientdata(client);
27410 +
27411 + printk(KERN_INFO "Detach TSL256X from I2C bus.\n");
27412 +
27413 + /* Power down TSL256X. */
27414 + reg_write(tsl256x, TSL256X_REG_CONTROL, 0x00);
27415 +
27416 + device_remove_file(&client->dev, &dev_attr_light_lux);
27417 + kfree(tsl256x);
27418 +
27419 + return 0;
27420 +}
27421 +
27422 +#ifdef CONFIG_PM
27423 +static int tsl256x_suspend(struct device *dev, pm_message_t state)
27424 +{
27425 + struct i2c_client *client = to_i2c_client(dev);
27426 + struct tsl256x_data *tsl256x = i2c_get_clientdata(client);
27427 +
27428 + /* Power down TSL256X. */
27429 + reg_write(tsl256x, TSL256X_REG_CONTROL, 0x00);
27430 +
27431 + return 0;
27432 +}
27433 +
27434 +static int tsl256x_resume(struct device *dev)
27435 +{
27436 + struct i2c_client *client = to_i2c_client(dev);
27437 + struct tsl256x_data *tsl256x = i2c_get_clientdata(client);
27438 +
27439 + /* Power up TSL256X. */
27440 + reg_write(tsl256x, TSL256X_REG_CONTROL, 0x03);
27441 +
27442 + return 0;
27443 +}
27444 +#endif
27445 +
27446 +static struct i2c_driver tsl256x_driver = {
27447 + .driver = {
27448 + .name = "tsl256x",
27449 + .owner = THIS_MODULE,
27450 +#ifdef CONFIG_PM
27451 + .suspend = tsl256x_suspend,
27452 + .resume = tsl256x_resume,
27453 +#endif
27454 + },
27455 + .id = I2C_DRIVERID_TSL256X,
27456 + .attach_adapter = tsl256x_attach_adapter,
27457 + .detach_client = tsl256x_detach_client,
27458 +};
27459 +
27460 +static int __init tsl256x_init(void)
27461 +{
27462 + return i2c_add_driver(&tsl256x_driver);
27463 +}
27464 +
27465 +static void __exit tsl256x_exit(void)
27466 +{
27467 + i2c_del_driver(&tsl256x_driver);
27468 +}
27469 +
27470 +MODULE_AUTHOR("Alec Tsai <alec_tsai@fiwin.com.tw>");
27471 +MODULE_LICENSE("GPL");
27472 +
27473 +module_init(tsl256x_init);
27474 +module_exit(tsl256x_exit);
27475 +
27476 Index: linux-2.6.24.7/drivers/i2c/chips/tsl256x.h
27477 ===================================================================
27478 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
27479 +++ linux-2.6.24.7/drivers/i2c/chips/tsl256x.h 2008-12-11 22:46:49.000000000 +0100
27480 @@ -0,0 +1,154 @@
27481 +/*
27482 + * tsl256x.h -- TSL256x Light Sensor driver
27483 + *
27484 + * Copyright 2007 by Fiwin.
27485 + * Author: Alec Tsai <alec_tsai@fiwin.com.tw>
27486 + *
27487 + * This program is free software; you can redistribute it and/or modify
27488 + * it under the terms of the GNU General Public License version 2 as
27489 + * published by the Free Software Foundation.
27490 + *
27491 + * The contents of header file is copied from TSL256x Datasheet.
27492 + */
27493 +
27494 +#ifndef _TSL256X_H
27495 +#define _TSL256X_H
27496 +
27497 +#define TSL2560_ID 0x00
27498 +#define TSL2561_ID 0x10
27499 +
27500 +#define LUX_SCALE 14 /* scale by 2^14 */
27501 +#define RATIO_SCALE 9 /*scale ratio by 2^9 */
27502 +
27503 +/******************************************************************************
27504 + * Integration time scaling factors
27505 + *****************************************************************************/
27506 +#define CH_SCALE 10 /* scale channel values by 2^10 */
27507 +#define CHSCALE_TINT0 0x7517 /* 322/11 * 2^CH_SCALE */
27508 +#define CHSCALE_TINT1 0x0fe7 /* 322/81 * 2^CH_SCALE */
27509 +
27510 +/******************************************************************************
27511 + * T Package coefficients
27512 + *****************************************************************************/
27513 +/*
27514 + * For Ch1/Ch0=0.00 to 0.50
27515 + * Lux/Ch0=0.0304.0.062*((Ch1/Ch0)^1.4)
27516 + * piecewise approximation
27517 + * For Ch1/Ch0=0.00 to 0.125:
27518 + * Lux/Ch0=0.0304.0.0272*(Ch1/Ch0)
27519 + *
27520 + * For Ch1/Ch0=0.125 to 0.250:
27521 + * Lux/Ch0=0.0325.0.0440*(Ch1/Ch0)
27522 + *
27523 + * For Ch1/Ch0=0.250 to 0.375:
27524 + * Lux/Ch0=0.0351.0.0544*(Ch1/Ch0)
27525 + *
27526 + * For Ch1/Ch0=0.375 to 0.50:
27527 + * Lux/Ch0=0.0381.0.0624*(Ch1/Ch0)
27528 + *
27529 + * For Ch1/Ch0=0.50 to 0.61:
27530 + * Lux/Ch0=0.0224.0.031*(Ch1/Ch0)
27531 + *
27532 + * For Ch1/Ch0=0.61 to 0.80:
27533 + * Lux/Ch0=0.0128.0.0153*(Ch1/Ch0)
27534 + *
27535 + * For Ch1/Ch0=0.80 to 1.30:
27536 + * Lux/Ch0=0.00146.0.00112*(Ch1/Ch0)
27537 + *
27538 + * For Ch1/Ch0>1.3:
27539 + * Lux/Ch0=0
27540 + */
27541 +#define K1T 0x0040 /* 0.125 * 2^RATIO_SCALE */
27542 +#define B1T 0x01f2 /* 0.0304 * 2^LUX_SCALE */
27543 +#define M1T 0x01be /* 0.0272 * 2^LUX_SCALE */
27544 +#define K2T 0x0080 /* 0.250 * 2^RATIO_SCALE */
27545 +#define B2T 0x0214 /* 0.0325 * 2^LUX_SCALE */
27546 +#define M2T 0x02d1 /* 0.0440 * 2^LUX_SCALE */
27547 +#define K3T 0x00c0 /* 0.375 * 2^RATIO_SCALE */
27548 +#define B3T 0x023f /* 0.0351 * 2^LUX_SCALE */
27549 +#define M3T 0x037b /* 0.0544 * 2^LUX_SCALE */
27550 +#define K4T 0x0100 /* 0.50 * 2^RATIO_SCALE */
27551 +#define B4T 0x0270 /* 0.0381 * 2^LUX_SCALE */
27552 +#define M4T 0x03fe /* 0.0624 * 2^LUX_SCALE */
27553 +#define K5T 0x0138 /* 0.61 * 2^RATIO_SCALE */
27554 +#define B5T 0x016f /* 0.0224 * 2^LUX_SCALE */
27555 +#define M5T 0x01fc /* 0.0310 * 2^LUX_SCALE */
27556 +#define K6T 0x019a /* 0.80 * 2^RATIO_SCALE */
27557 +#define B6T 0x00d2 /* 0.0128 * 2^LUX_SCALE */
27558 +#define M6T 0x00fb /* 0.0153 * 2^LUX_SCALE */
27559 +#define K7T 0x029a /* 1.3 * 2^RATIO_SCALE */
27560 +#define B7T 0x0018 /* 0.00146 * 2^LUX_SCALE */
27561 +#define M7T 0x0012 /* 0.00112 * 2^LUX_SCALE */
27562 +#define K8T 0x029a /* 1.3 * 2^RATIO_SCALE */
27563 +#define B8T 0x0000 /* 0.000 * 2^LUX_SCALE */
27564 +#define M8T 0x0000 /* 0.000 * 2^LUX_SCALE */
27565 +
27566 +/******************************************************************************
27567 + * CS package coefficients
27568 + *****************************************************************************/
27569 +/*
27570 + * For 0 <= Ch1/Ch0 <= 0.52
27571 + * Lux/Ch0 = 0.0315.0.0593*((Ch1/Ch0)^1.4)
27572 + * piecewise approximation
27573 + * For 0 <= Ch1/Ch0 <= 0.13
27574 + * Lux/Ch0 = 0.0315.0.0262*(Ch1/Ch0)
27575 + * For 0.13 <= Ch1/Ch0 <= 0.26
27576 + * Lux/Ch0 = 0.0337.0.0430*(Ch1/Ch0)
27577 + * For 0.26 <= Ch1/Ch0 <= 0.39
27578 + * Lux/Ch0 = 0.0363.0.0529*(Ch1/Ch0)
27579 + * For 0.39 <= Ch1/Ch0 <= 0.52
27580 + * Lux/Ch0 = 0.0392.0.0605*(Ch1/Ch0)
27581 + * For 0.52 < Ch1/Ch0 <= 0.65
27582 + * Lux/Ch0 = 0.0229.0.0291*(Ch1/Ch0)
27583 + * For 0.65 < Ch1/Ch0 <= 0.80
27584 + * Lux/Ch0 = 0.00157.0.00180*(Ch1/Ch0)
27585 + * For 0.80 < Ch1/Ch0 <= 1.30
27586 + * Lux/Ch0 = 0.00338.0.00260*(Ch1/Ch0)
27587 + * For Ch1/Ch0 > 1.30
27588 + * Lux = 0
27589 + */
27590 +#define K1C 0x0043 /* 0.130 * 2^RATIO_SCALE */
27591 +#define B1C 0x0204 /* 0.0315 * 2^LUX_SCALE */
27592 +#define M1C 0x01ad /* 0.0262 * 2^LUX_SCALE */
27593 +#define K2C 0x0085 /* 0.260 * 2^RATIO_SCALE */
27594 +#define B2C 0x0228 /* 0.0337 * 2^LUX_SCALE */
27595 +#define M2C 0x02c1 /* 0.0430 * 2^LUX_SCALE */
27596 +#define K3C 0x00c8 /* 0.390 * 2^RATIO_SCALE */
27597 +#define B3C 0x0253 /* 0.0363 * 2^LUX_SCALE */
27598 +#define M3C 0x0363 /* 0.0529 * 2^LUX_SCALE */
27599 +#define K4C 0x010a /* 0.520 * 2^RATIO_SCALE */
27600 +#define B4C 0x0282 /* 0.0392 * 2^LUX_SCALE */
27601 +#define M4C 0x03df /* 0.0605 * 2^LUX_SCALE */
27602 +#define K5C 0x014d /* 0.65 * 2^RATIO_SCALE */
27603 +#define B5C 0x0177 /* 0.0229 * 2^LUX_SCALE */
27604 +#define M5C 0x01dd /* 0.0291 * 2^LUX_SCALE */
27605 +#define K6C 0x019a /* 0.80 * 2^RATIO_SCALE */
27606 +#define B6C 0x0101 /* 0.0157 * 2^LUX_SCALE */
27607 +#define M6C 0x0127 /* 0.0180 * 2^LUX_SCALE */
27608 +#define K7C 0x029a /* 1.3 * 2^RATIO_SCALE */
27609 +#define B7C 0x0037 /* 0.00338 * 2^LUX_SCALE */
27610 +#define M7C 0x002b /* 0.00260 * 2^LUX_SCALE */
27611 +#define K8C 0x029a /* 1.3 * 2^RATIO_SCALE */
27612 +#define B8C 0x0000 /* 0.000 * 2^LUX_SCALE */
27613 +#define M8C 0x0000 /* 0.000 * 2^LUX_SCALE */
27614 +
27615 +/* TSL256x registers definition . */
27616 +enum tsl256x_regs {
27617 + TSL256X_REG_CONTROL = 0x80, /* Control of basic functions */
27618 + TSL256X_REG_TIMING = 0x81, /* Integration time/gain control */
27619 + TSL256X_REG_THRESHLOWLOW = 0x82, /* Low byte of low interrupt threshold */
27620 + TSL256X_REG_THRESHLOWHIGH = 0x83, /* High byte of low interrupt threshold */
27621 + TSL256X_REG_THRESHHIGHLOW = 0x84, /* Low byte of high interrupt threshold */
27622 + TSL256X_REG_THRESHHIGHHIGH = 0x85, /* High byte of high interrupt threshold */
27623 + TSL256X_REG_INTERRUPT = 0x86, /* Interrupt control */
27624 + TSL256X_REG_CRC = 0x88, /* Factory test - not a user register */
27625 + TSL256X_REG_ID = 0x8A, /* Part number/ Rev ID */
27626 + TSL256X_REG_DATA0LOW = 0x8C, /* Low byte of ADC channel 0 */
27627 + TSL256X_REG_DATA0HIGH = 0x8D, /* High byte of ADC channel 0 */
27628 + TSL256X_REG_DATA1LOW = 0x8E, /* Low byte of ADC channel 1 */
27629 + TSL256X_REG_DATA1HIGH = 0x8F, /* High byte of ADC channel 1 */
27630 + __NUM_TSL256X_REGS
27631 +};
27632 +
27633 +#endif /* _TSL256X_H */
27634 +
27635 Index: linux-2.6.24.7/drivers/i2c/i2c-core.c
27636 ===================================================================
27637 --- linux-2.6.24.7.orig/drivers/i2c/i2c-core.c 2008-12-11 22:46:07.000000000 +0100
27638 +++ linux-2.6.24.7/drivers/i2c/i2c-core.c 2008-12-11 22:46:49.000000000 +0100
27639 @@ -1,4 +1,3 @@
27640 -/* i2c-core.c - a device driver for the iic-bus interface */
27641 /* ------------------------------------------------------------------------- */
27642 /* Copyright (C) 1995-99 Simon G. Vogl
27643
27644 @@ -136,10 +135,16 @@ static int i2c_device_suspend(struct dev
27645
27646 if (!dev->driver)
27647 return 0;
27648 +#if 0
27649 driver = to_i2c_driver(dev->driver);
27650 if (!driver->suspend)
27651 return 0;
27652 return driver->suspend(to_i2c_client(dev), mesg);
27653 +#else
27654 + if (!dev->driver->suspend)
27655 + return 0;
27656 + return dev->driver->suspend(dev, mesg);
27657 +#endif
27658 }
27659
27660 static int i2c_device_resume(struct device * dev)
27661 @@ -148,10 +153,16 @@ static int i2c_device_resume(struct devi
27662
27663 if (!dev->driver)
27664 return 0;
27665 +#if 0
27666 driver = to_i2c_driver(dev->driver);
27667 if (!driver->resume)
27668 return 0;
27669 return driver->resume(to_i2c_client(dev));
27670 +#else
27671 + if (!dev->driver->resume)
27672 + return 0;
27673 + return dev->driver->resume(dev);
27674 +#endif
27675 }
27676
27677 static void i2c_client_release(struct device *dev)
27678 @@ -941,11 +952,11 @@ static int i2c_probe_address(struct i2c_
27679 int err;
27680
27681 /* Make sure the address is valid */
27682 - if (addr < 0x03 || addr > 0x77) {
27683 + /*if (addr < 0x03 || addr > 0x77) {
27684 dev_warn(&adapter->dev, "Invalid probe address 0x%02x\n",
27685 addr);
27686 return -EINVAL;
27687 - }
27688 + }*/
27689
27690 /* Skip if already in use */
27691 if (i2c_check_addr(adapter, addr))
27692 Index: linux-2.6.24.7/drivers/input/evdev.c
27693 ===================================================================
27694 --- linux-2.6.24.7.orig/drivers/input/evdev.c 2008-12-11 22:46:07.000000000 +0100
27695 +++ linux-2.6.24.7/drivers/input/evdev.c 2008-12-11 22:46:49.000000000 +0100
27696 @@ -28,7 +28,7 @@ struct evdev {
27697 char name[16];
27698 struct input_handle handle;
27699 wait_queue_head_t wait;
27700 - struct evdev_client *grab;
27701 + int *grab;
27702 struct list_head client_list;
27703 spinlock_t client_lock; /* protects client_list */
27704 struct mutex mutex;
27705 @@ -39,6 +39,7 @@ struct evdev_client {
27706 struct input_event buffer[EVDEV_BUFFER_SIZE];
27707 int head;
27708 int tail;
27709 + int grab;
27710 spinlock_t buffer_lock; /* protects access to buffer, head and tail */
27711 struct fasync_struct *fasync;
27712 struct evdev *evdev;
27713 @@ -79,12 +80,8 @@ static void evdev_event(struct input_han
27714
27715 rcu_read_lock();
27716
27717 - client = rcu_dereference(evdev->grab);
27718 - if (client)
27719 + list_for_each_entry_rcu(client, &evdev->client_list, node)
27720 evdev_pass_event(client, &event);
27721 - else
27722 - list_for_each_entry_rcu(client, &evdev->client_list, node)
27723 - evdev_pass_event(client, &event);
27724
27725 rcu_read_unlock();
27726
27727 @@ -135,14 +132,15 @@ static int evdev_grab(struct evdev *evde
27728 {
27729 int error;
27730
27731 - if (evdev->grab)
27732 + if (client->grab)
27733 return -EBUSY;
27734
27735 - error = input_grab_device(&evdev->handle);
27736 - if (error)
27737 - return error;
27738 -
27739 - rcu_assign_pointer(evdev->grab, client);
27740 + if (!evdev->grab++) {
27741 + error = input_grab_device(&evdev->handle);
27742 + if (error)
27743 + return error;
27744 + }
27745 + client->grab = 1;
27746 synchronize_rcu();
27747
27748 return 0;
27749 @@ -150,12 +148,12 @@ static int evdev_grab(struct evdev *evde
27750
27751 static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client)
27752 {
27753 - if (evdev->grab != client)
27754 + if (!client->grab)
27755 return -EINVAL;
27756
27757 - rcu_assign_pointer(evdev->grab, NULL);
27758 - synchronize_rcu();
27759 - input_release_device(&evdev->handle);
27760 + if (!--evdev->grab && evdev->exist)
27761 + input_release_device(&evdev->handle);
27762 + client->grab = 0;
27763
27764 return 0;
27765 }
27766 @@ -230,7 +228,7 @@ static int evdev_release(struct inode *i
27767 struct evdev *evdev = client->evdev;
27768
27769 mutex_lock(&evdev->mutex);
27770 - if (evdev->grab == client)
27771 + if (client->grab)
27772 evdev_ungrab(evdev, client);
27773 mutex_unlock(&evdev->mutex);
27774
27775 Index: linux-2.6.24.7/drivers/input/keyboard/Kconfig
27776 ===================================================================
27777 --- linux-2.6.24.7.orig/drivers/input/keyboard/Kconfig 2008-12-11 22:46:07.000000000 +0100
27778 +++ linux-2.6.24.7/drivers/input/keyboard/Kconfig 2008-12-11 22:46:49.000000000 +0100
27779 @@ -293,4 +293,32 @@ config KEYBOARD_BFIN
27780 To compile this driver as a module, choose M here: the
27781 module will be called bf54x-keys.
27782
27783 +config KEYBOARD_NEO1973
27784 + tristate "FIC Neo1973 buttons"
27785 + depends on MACH_NEO1973
27786 + default y
27787 + help
27788 + Say Y here to enable the buttons on the FIC Neo1973
27789 + GSM phone.
27790 +
27791 + To compile this driver as a module, choose M here: the
27792 + module will be called neo1973kbd.
27793 +
27794 +config KEYBOARD_M800
27795 + tristate "E-TEN glofiish M800 buttons"
27796 + depends on MACH_M800
27797 + default y
27798 + help
27799 + Say Y here to enable the buttons on the E-TEN glofiish
27800 + M800 GSM phone.
27801 +
27802 + To compile this driver as a module, choose M here: the
27803 + module will be called m800kbd.
27804 +
27805 +config KEYBOARD_QT2410
27806 + tristate "QT2410 buttons"
27807 + depends on MACH_QT2410
27808 + default y
27809 +
27810 +
27811 endif
27812 Index: linux-2.6.24.7/drivers/input/keyboard/m800kbd.c
27813 ===================================================================
27814 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
27815 +++ linux-2.6.24.7/drivers/input/keyboard/m800kbd.c 2008-12-11 22:46:49.000000000 +0100
27816 @@ -0,0 +1,330 @@
27817 +/*
27818 + * Keyboard driver for E-TEN M800 GSM phone
27819 + *
27820 + * (C) 2008 by Harald Welte <laforge@gnumonks.org>
27821 + * All rights reserved.
27822 + *
27823 + * inspired by corkgbd.c by Richard Purdie
27824 + *
27825 + * This program is free software; you can redistribute it and/or modify
27826 + * it under the terms of the GNU General Public License version 2 as
27827 + * published by the Free Software Foundation.
27828 + *
27829 + */
27830 +
27831 +#include <linux/delay.h>
27832 +#include <linux/platform_device.h>
27833 +#include <linux/init.h>
27834 +#include <linux/input.h>
27835 +#include <linux/interrupt.h>
27836 +#include <linux/jiffies.h>
27837 +#include <linux/module.h>
27838 +#include <linux/slab.h>
27839 +#include <linux/workqueue.h>
27840 +
27841 +#include <asm/gpio.h>
27842 +#include <asm/mach-types.h>
27843 +
27844 +struct m800kbd {
27845 + struct input_dev *input;
27846 + unsigned int suspended;
27847 + struct work_struct work;
27848 + int work_in_progress;
27849 + int hp_irq_count_in_work;
27850 + int hp_irq_count;
27851 + int jack_irq;
27852 +};
27853 +
27854 +static irqreturn_t m800kbd_power_irq(int irq, void *dev_id)
27855 +{
27856 + struct m800kbd *m800kbd_data = dev_id;
27857 + int key_pressed = !gpio_get_value(irq_to_gpio(irq));
27858 +
27859 + input_report_key(m800kbd_data->input, KEY_POWER, key_pressed);
27860 + input_sync(m800kbd_data->input);
27861 +
27862 + return IRQ_HANDLED;
27863 +}
27864 +
27865 +static irqreturn_t m800kbd_cam_irq(int irq, void *dev_id)
27866 +{
27867 + struct m800kbd *m800kbd_data = dev_id;
27868 +
27869 + int key_pressed = !gpio_get_value(irq_to_gpio(irq));
27870 + input_report_key(m800kbd_data->input, KEY_CAMERA, key_pressed);
27871 + input_sync(m800kbd_data->input);
27872 +
27873 + return IRQ_HANDLED;
27874 +}
27875 +
27876 +static irqreturn_t m800kbd_rec_irq(int irq, void *dev_id)
27877 +{
27878 + struct m800kbd *m800kbd_data = dev_id;
27879 +
27880 + int key_pressed = !gpio_get_value(irq_to_gpio(irq));
27881 + input_report_key(m800kbd_data->input, KEY_RECORD, key_pressed);
27882 + input_sync(m800kbd_data->input);
27883 +
27884 + return IRQ_HANDLED;
27885 +}
27886 +
27887 +static irqreturn_t m800kbd_slide_irq(int irq, void *dev_id)
27888 +{
27889 + struct m800kbd *m800kbd_data = dev_id;
27890 +
27891 + int key_pressed = gpio_get_value(irq_to_gpio(irq));
27892 + input_report_key(m800kbd_data->input, SW_LID, key_pressed);
27893 + input_sync(m800kbd_data->input);
27894 +
27895 + return IRQ_HANDLED;
27896 +}
27897 +
27898 +#if 0
27899 +static void m800kbd_debounce_jack(struct work_struct *work)
27900 +{
27901 + struct m800kbd *kbd = container_of(work, struct m800kbd, work);
27902 + unsigned long flags;
27903 + int loop = 0;
27904 +
27905 + do {
27906 + /*
27907 + * we wait out any multiple interrupt
27908 + * stuttering in 100ms lumps
27909 + */
27910 + do {
27911 + kbd->hp_irq_count_in_work = kbd->hp_irq_count;
27912 + msleep(100);
27913 + } while (kbd->hp_irq_count != kbd->hp_irq_count_in_work);
27914 + /*
27915 + * no new interrupts on jack for 100ms...
27916 + * ok we will report it
27917 + */
27918 + input_report_switch(kbd->input, SW_HEADPHONE_INSERT,
27919 + gpio_get_value(irq_to_gpio(kbd->jack_irq)));
27920 + input_sync(kbd->input);
27921 + /*
27922 + * we go around the outer loop again if we detect that more
27923 + * interrupts came while we are servicing here. But we have
27924 + * to sequence it carefully with interrupts off
27925 + */
27926 + local_save_flags(flags);
27927 + /* no interrupts during this work means we can exit the work */
27928 + loop = !!(kbd->hp_irq_count != kbd->hp_irq_count_in_work);
27929 + if (!loop)
27930 + kbd->work_in_progress = 0;
27931 + local_irq_restore(flags);
27932 + /*
27933 + * interrupt that comes here will either queue a new work action
27934 + * since work_in_progress is cleared now, or be dealt with
27935 + * when we loop.
27936 + */
27937 + } while (loop);
27938 +}
27939 +
27940 +
27941 +static irqreturn_t m800kbd_headphone_irq(int irq, void *dev_id)
27942 +{
27943 + struct m800kbd *m800kbd_data = dev_id;
27944 +
27945 + /*
27946 + * this interrupt is prone to bouncing and userspace doesn't like
27947 + * to have to deal with that kind of thing. So we do not accept
27948 + * that a jack interrupt is equal to a jack event. Instead we fire
27949 + * some work on the first interrupt, and it hangs about in 100ms units
27950 + * until no more interrupts come. Then it accepts the state it finds
27951 + * for jack insert and reports it once
27952 + */
27953 +
27954 + m800kbd_data->hp_irq_count++;
27955 + /*
27956 + * the first interrupt we see for a while, we fire the work item
27957 + * and record the interrupt count when we did that. If more interrupts
27958 + * come in the meanwhile, we can tell by the difference in that
27959 + * stored count and hp_irq_count which increments every interrupt
27960 + */
27961 + if (!m800kbd_data->work_in_progress) {
27962 + m800kbd_data->jack_irq = irq;
27963 + m800kbd_data->hp_irq_count_in_work =
27964 + m800kbd_data->hp_irq_count;
27965 + if (!schedule_work(&m800kbd_data->work))
27966 + printk(KERN_ERR
27967 + "Unable to schedule headphone debounce\n");
27968 + else
27969 + m800kbd_data->work_in_progress = 1;
27970 + }
27971 +
27972 + return IRQ_HANDLED;
27973 +}
27974 +#endif
27975 +
27976 +#ifdef CONFIG_PM
27977 +static int m800kbd_suspend(struct platform_device *dev, pm_message_t state)
27978 +{
27979 + struct m800kbd *m800kbd = platform_get_drvdata(dev);
27980 +
27981 + m800kbd->suspended = 1;
27982 +
27983 + return 0;
27984 +}
27985 +
27986 +static int m800kbd_resume(struct platform_device *dev)
27987 +{
27988 + struct m800kbd *m800kbd = platform_get_drvdata(dev);
27989 +
27990 + m800kbd->suspended = 0;
27991 +
27992 + return 0;
27993 +}
27994 +#else
27995 +#define m800kbd_suspend NULL
27996 +#define m800kbd_resume NULL
27997 +#endif
27998 +
27999 +static int m800kbd_probe(struct platform_device *pdev)
28000 +{
28001 + struct m800kbd *m800kbd;
28002 + struct input_dev *input_dev;
28003 + int rc, irq_power, irq_cam, irq_rec, irq_slide;
28004 +
28005 + m800kbd = kzalloc(sizeof(struct m800kbd), GFP_KERNEL);
28006 + input_dev = input_allocate_device();
28007 + if (!m800kbd || !input_dev) {
28008 + kfree(m800kbd);
28009 + input_free_device(input_dev);
28010 + return -ENOMEM;
28011 + }
28012 +
28013 + if (pdev->resource[0].flags != 0)
28014 + return -EINVAL;
28015 +
28016 + irq_power = gpio_to_irq(pdev->resource[0].start);
28017 + if (irq_power < 0)
28018 + return -EINVAL;
28019 +
28020 + irq_cam = gpio_to_irq(pdev->resource[1].start);
28021 + if (irq_cam < 0)
28022 + return -EINVAL;
28023 +
28024 + irq_rec = gpio_to_irq(pdev->resource[2].start);
28025 + if (irq_rec < 0)
28026 + return -EINVAL;
28027 +
28028 + irq_slide = gpio_to_irq(pdev->resource[3].start);
28029 + if (irq_slide < 0)
28030 + return -EINVAL;
28031 +
28032 + platform_set_drvdata(pdev, m800kbd);
28033 +
28034 + m800kbd->input = input_dev;
28035 +
28036 + //INIT_WORK(&m800kbd->work, m800kbd_debounce_jack);
28037 +
28038 + input_dev->name = "M800 Buttons";
28039 + input_dev->phys = "m800kbd/input0";
28040 + input_dev->id.bustype = BUS_HOST;
28041 + input_dev->id.vendor = 0x0001;
28042 + input_dev->id.product = 0x0001;
28043 + input_dev->id.version = 0x0100;
28044 + input_dev->cdev.dev = &pdev->dev;
28045 + input_dev->private = m800kbd;
28046 +
28047 + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_SW);
28048 + set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
28049 + set_bit(SW_LID, input_dev->swbit);
28050 + set_bit(KEY_POWER, input_dev->keybit);
28051 + set_bit(KEY_CAMERA, input_dev->keybit);
28052 + set_bit(KEY_RECORD, input_dev->keybit);
28053 +
28054 + rc = input_register_device(m800kbd->input);
28055 + if (rc)
28056 + goto out_register;
28057 +
28058 + if (request_irq(irq_power, m800kbd_power_irq, IRQF_DISABLED |
28059 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
28060 + "M800 Power button", m800kbd)) {
28061 + dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_power);
28062 + goto out_aux;
28063 + }
28064 +
28065 + enable_irq_wake(irq_power);
28066 +
28067 + if (request_irq(irq_cam, m800kbd_cam_irq, IRQF_DISABLED |
28068 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
28069 + "M800 Camera button", m800kbd)) {
28070 + dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_cam);
28071 + goto out_hold;
28072 + }
28073 +
28074 + if (request_irq(irq_rec, m800kbd_rec_irq, IRQF_DISABLED |
28075 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
28076 + "M800 Record button", m800kbd)) {
28077 + dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_rec);
28078 + goto out_hold;
28079 + }
28080 +
28081 + if (request_irq(irq_slide, m800kbd_slide_irq, IRQF_DISABLED |
28082 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
28083 + "M800 Slide", m800kbd)) {
28084 + dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_slide);
28085 + goto out_jack;
28086 + }
28087 + enable_irq_wake(irq_slide);
28088 +
28089 + return 0;
28090 +
28091 +out_jack:
28092 + free_irq(irq_cam, m800kbd);
28093 +out_hold:
28094 + free_irq(irq_power, m800kbd);
28095 +out_aux:
28096 + input_unregister_device(m800kbd->input);
28097 +out_register:
28098 + input_free_device(m800kbd->input);
28099 + platform_set_drvdata(pdev, NULL);
28100 + kfree(m800kbd);
28101 +
28102 + return -ENODEV;
28103 +}
28104 +
28105 +static int m800kbd_remove(struct platform_device *pdev)
28106 +{
28107 + struct m800kbd *m800kbd = platform_get_drvdata(pdev);
28108 +
28109 + free_irq(gpio_to_irq(pdev->resource[2].start), m800kbd);
28110 + free_irq(gpio_to_irq(pdev->resource[1].start), m800kbd);
28111 + free_irq(gpio_to_irq(pdev->resource[0].start), m800kbd);
28112 +
28113 + input_unregister_device(m800kbd->input);
28114 + input_free_device(m800kbd->input);
28115 + platform_set_drvdata(pdev, NULL);
28116 + kfree(m800kbd);
28117 +
28118 + return 0;
28119 +}
28120 +
28121 +static struct platform_driver m800kbd_driver = {
28122 + .probe = m800kbd_probe,
28123 + .remove = m800kbd_remove,
28124 + .suspend = m800kbd_suspend,
28125 + .resume = m800kbd_resume,
28126 + .driver = {
28127 + .name = "m800-button",
28128 + },
28129 +};
28130 +
28131 +static int __devinit m800kbd_init(void)
28132 +{
28133 + return platform_driver_register(&m800kbd_driver);
28134 +}
28135 +
28136 +static void __exit m800kbd_exit(void)
28137 +{
28138 + platform_driver_unregister(&m800kbd_driver);
28139 +}
28140 +
28141 +module_init(m800kbd_init);
28142 +module_exit(m800kbd_exit);
28143 +
28144 +MODULE_AUTHOR("Harald Welte <laforge@gnumonks.org>");
28145 +MODULE_DESCRIPTION("E-TEN glofiish M800 GPIO buttons input driver");
28146 +MODULE_LICENSE("GPL");
28147 Index: linux-2.6.24.7/drivers/input/keyboard/Makefile
28148 ===================================================================
28149 --- linux-2.6.24.7.orig/drivers/input/keyboard/Makefile 2008-12-11 22:46:07.000000000 +0100
28150 +++ linux-2.6.24.7/drivers/input/keyboard/Makefile 2008-12-11 22:46:49.000000000 +0100
28151 @@ -14,6 +14,9 @@ obj-$(CONFIG_KEYBOARD_LOCOMO) += locomo
28152 obj-$(CONFIG_KEYBOARD_NEWTON) += newtonkbd.o
28153 obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o
28154 obj-$(CONFIG_KEYBOARD_CORGI) += corgikbd.o
28155 +obj-$(CONFIG_KEYBOARD_NEO1973) += neo1973kbd.o
28156 +obj-$(CONFIG_KEYBOARD_M800) += m800kbd.o
28157 +obj-$(CONFIG_KEYBOARD_QT2410) += qt2410kbd.o
28158 obj-$(CONFIG_KEYBOARD_SPITZ) += spitzkbd.o
28159 obj-$(CONFIG_KEYBOARD_HIL) += hil_kbd.o
28160 obj-$(CONFIG_KEYBOARD_HIL_OLD) += hilkbd.o
28161 Index: linux-2.6.24.7/drivers/input/keyboard/neo1973kbd.c
28162 ===================================================================
28163 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
28164 +++ linux-2.6.24.7/drivers/input/keyboard/neo1973kbd.c 2008-12-11 22:46:49.000000000 +0100
28165 @@ -0,0 +1,303 @@
28166 +/*
28167 + * Keyboard driver for FIC Neo1973 GSM phone
28168 + *
28169 + * (C) 2006-2007 by Openmoko, Inc.
28170 + * Author: Harald Welte <laforge@openmoko.org>
28171 + * All rights reserved.
28172 + *
28173 + * inspired by corkgbd.c by Richard Purdie
28174 + *
28175 + * This program is free software; you can redistribute it and/or modify
28176 + * it under the terms of the GNU General Public License version 2 as
28177 + * published by the Free Software Foundation.
28178 + *
28179 + */
28180 +
28181 +#include <linux/delay.h>
28182 +#include <linux/platform_device.h>
28183 +#include <linux/init.h>
28184 +#include <linux/input.h>
28185 +#include <linux/interrupt.h>
28186 +#include <linux/jiffies.h>
28187 +#include <linux/module.h>
28188 +#include <linux/slab.h>
28189 +#include <linux/workqueue.h>
28190 +
28191 +#include <asm/gpio.h>
28192 +#include <asm/mach-types.h>
28193 +
28194 +struct neo1973kbd {
28195 + struct input_dev *input;
28196 + unsigned int suspended;
28197 + struct work_struct work;
28198 + int work_in_progress;
28199 + int hp_irq_count_in_work;
28200 + int hp_irq_count;
28201 + int jack_irq;
28202 +};
28203 +
28204 +static irqreturn_t neo1973kbd_aux_irq(int irq, void *dev_id)
28205 +{
28206 + struct neo1973kbd *neo1973kbd_data = dev_id;
28207 + int key_pressed = !gpio_get_value(irq_to_gpio(irq));
28208 +
28209 + /* GTA02 has inverted sense level compared to GTA01 */
28210 + if (machine_is_neo1973_gta02())
28211 + key_pressed = !key_pressed;
28212 + input_report_key(neo1973kbd_data->input, KEY_PHONE, key_pressed);
28213 + input_sync(neo1973kbd_data->input);
28214 +
28215 + return IRQ_HANDLED;
28216 +}
28217 +
28218 +static irqreturn_t neo1973kbd_hold_irq(int irq, void *dev_id)
28219 +{
28220 + struct neo1973kbd *neo1973kbd_data = dev_id;
28221 +
28222 + int key_pressed = gpio_get_value(irq_to_gpio(irq));
28223 + input_report_key(neo1973kbd_data->input, KEY_PAUSE, key_pressed);
28224 + input_sync(neo1973kbd_data->input);
28225 +
28226 + return IRQ_HANDLED;
28227 +}
28228 +
28229 +
28230 +static void neo1973kbd_debounce_jack(struct work_struct *work)
28231 +{
28232 + struct neo1973kbd *kbd = container_of(work, struct neo1973kbd, work);
28233 + unsigned long flags;
28234 + int loop = 0;
28235 +
28236 + do {
28237 + /*
28238 + * we wait out any multiple interrupt
28239 + * stuttering in 100ms lumps
28240 + */
28241 + do {
28242 + kbd->hp_irq_count_in_work = kbd->hp_irq_count;
28243 + msleep(100);
28244 + } while (kbd->hp_irq_count != kbd->hp_irq_count_in_work);
28245 + /*
28246 + * no new interrupts on jack for 100ms...
28247 + * ok we will report it
28248 + */
28249 + input_report_switch(kbd->input, SW_HEADPHONE_INSERT,
28250 + gpio_get_value(irq_to_gpio(kbd->jack_irq)));
28251 + input_sync(kbd->input);
28252 + /*
28253 + * we go around the outer loop again if we detect that more
28254 + * interrupts came while we are servicing here. But we have
28255 + * to sequence it carefully with interrupts off
28256 + */
28257 + local_save_flags(flags);
28258 + /* no interrupts during this work means we can exit the work */
28259 + loop = !!(kbd->hp_irq_count != kbd->hp_irq_count_in_work);
28260 + if (!loop)
28261 + kbd->work_in_progress = 0;
28262 + local_irq_restore(flags);
28263 + /*
28264 + * interrupt that comes here will either queue a new work action
28265 + * since work_in_progress is cleared now, or be dealt with
28266 + * when we loop.
28267 + */
28268 + } while (loop);
28269 +}
28270 +
28271 +
28272 +static irqreturn_t neo1973kbd_headphone_irq(int irq, void *dev_id)
28273 +{
28274 + struct neo1973kbd *neo1973kbd_data = dev_id;
28275 +
28276 + /*
28277 + * this interrupt is prone to bouncing and userspace doesn't like
28278 + * to have to deal with that kind of thing. So we do not accept
28279 + * that a jack interrupt is equal to a jack event. Instead we fire
28280 + * some work on the first interrupt, and it hangs about in 100ms units
28281 + * until no more interrupts come. Then it accepts the state it finds
28282 + * for jack insert and reports it once
28283 + */
28284 +
28285 + neo1973kbd_data->hp_irq_count++;
28286 + /*
28287 + * the first interrupt we see for a while, we fire the work item
28288 + * and record the interrupt count when we did that. If more interrupts
28289 + * come in the meanwhile, we can tell by the difference in that
28290 + * stored count and hp_irq_count which increments every interrupt
28291 + */
28292 + if (!neo1973kbd_data->work_in_progress) {
28293 + neo1973kbd_data->jack_irq = irq;
28294 + neo1973kbd_data->hp_irq_count_in_work =
28295 + neo1973kbd_data->hp_irq_count;
28296 + if (!schedule_work(&neo1973kbd_data->work))
28297 + printk(KERN_ERR
28298 + "Unable to schedule headphone debounce\n");
28299 + else
28300 + neo1973kbd_data->work_in_progress = 1;
28301 + }
28302 +
28303 + return IRQ_HANDLED;
28304 +}
28305 +
28306 +#ifdef CONFIG_PM
28307 +static int neo1973kbd_suspend(struct platform_device *dev, pm_message_t state)
28308 +{
28309 + struct neo1973kbd *neo1973kbd = platform_get_drvdata(dev);
28310 +
28311 + neo1973kbd->suspended = 1;
28312 +
28313 + return 0;
28314 +}
28315 +
28316 +static int neo1973kbd_resume(struct platform_device *dev)
28317 +{
28318 + struct neo1973kbd *neo1973kbd = platform_get_drvdata(dev);
28319 +
28320 + neo1973kbd->suspended = 0;
28321 +
28322 + return 0;
28323 +}
28324 +#else
28325 +#define neo1973kbd_suspend NULL
28326 +#define neo1973kbd_resume NULL
28327 +#endif
28328 +
28329 +static int neo1973kbd_probe(struct platform_device *pdev)
28330 +{
28331 + struct neo1973kbd *neo1973kbd;
28332 + struct input_dev *input_dev;
28333 + int rc, irq_aux, irq_hold, irq_jack;
28334 +
28335 + neo1973kbd = kzalloc(sizeof(struct neo1973kbd), GFP_KERNEL);
28336 + input_dev = input_allocate_device();
28337 + if (!neo1973kbd || !input_dev) {
28338 + kfree(neo1973kbd);
28339 + input_free_device(input_dev);
28340 + return -ENOMEM;
28341 + }
28342 +
28343 + if (pdev->resource[0].flags != 0)
28344 + return -EINVAL;
28345 +
28346 + irq_aux = gpio_to_irq(pdev->resource[0].start);
28347 + if (irq_aux < 0)
28348 + return -EINVAL;
28349 +
28350 + irq_hold = gpio_to_irq(pdev->resource[1].start);
28351 + if (irq_hold < 0)
28352 + return -EINVAL;
28353 +
28354 + irq_jack = gpio_to_irq(pdev->resource[2].start);
28355 + if (irq_jack < 0)
28356 + return -EINVAL;
28357 +
28358 + platform_set_drvdata(pdev, neo1973kbd);
28359 +
28360 + neo1973kbd->input = input_dev;
28361 +
28362 + INIT_WORK(&neo1973kbd->work, neo1973kbd_debounce_jack);
28363 +
28364 + input_dev->name = "Neo1973 Buttons";
28365 + input_dev->phys = "neo1973kbd/input0";
28366 + input_dev->id.bustype = BUS_HOST;
28367 + input_dev->id.vendor = 0x0001;
28368 + input_dev->id.product = 0x0001;
28369 + input_dev->id.version = 0x0100;
28370 + input_dev->cdev.dev = &pdev->dev;
28371 + input_dev->private = neo1973kbd;
28372 +
28373 + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_SW);
28374 + set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
28375 + set_bit(KEY_PHONE, input_dev->keybit);
28376 + set_bit(KEY_PAUSE, input_dev->keybit);
28377 +
28378 + rc = input_register_device(neo1973kbd->input);
28379 + if (rc)
28380 + goto out_register;
28381 +
28382 + if (request_irq(irq_aux, neo1973kbd_aux_irq, IRQF_DISABLED |
28383 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
28384 + "Neo1973 AUX button", neo1973kbd)) {
28385 + dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_aux);
28386 + goto out_aux;
28387 + }
28388 +
28389 + /*
28390 + * GTA01 revisions before Bv4 can't be resumed by the PMU, so we use
28391 + * resume by AUX.
28392 + */
28393 + if (machine_is_neo1973_gta01())
28394 + enable_irq_wake(irq_aux);
28395 +
28396 + if (request_irq(irq_hold, neo1973kbd_hold_irq, IRQF_DISABLED |
28397 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
28398 + "Neo1973 HOLD button", neo1973kbd)) {
28399 + dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_hold);
28400 + goto out_hold;
28401 + }
28402 +
28403 + if (request_irq(irq_jack, neo1973kbd_headphone_irq, IRQF_DISABLED |
28404 + IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
28405 + "Neo1973 Headphone Jack", neo1973kbd)) {
28406 + dev_err(&pdev->dev, "Can't get IRQ %u\n", irq_jack);
28407 + goto out_jack;
28408 + }
28409 + enable_irq_wake(irq_jack);
28410 +
28411 + return 0;
28412 +
28413 +out_jack:
28414 + free_irq(irq_hold, neo1973kbd);
28415 +out_hold:
28416 + free_irq(irq_aux, neo1973kbd);
28417 +out_aux:
28418 + input_unregister_device(neo1973kbd->input);
28419 +out_register:
28420 + input_free_device(neo1973kbd->input);
28421 + platform_set_drvdata(pdev, NULL);
28422 + kfree(neo1973kbd);
28423 +
28424 + return -ENODEV;
28425 +}
28426 +
28427 +static int neo1973kbd_remove(struct platform_device *pdev)
28428 +{
28429 + struct neo1973kbd *neo1973kbd = platform_get_drvdata(pdev);
28430 +
28431 + free_irq(gpio_to_irq(pdev->resource[2].start), neo1973kbd);
28432 + free_irq(gpio_to_irq(pdev->resource[1].start), neo1973kbd);
28433 + free_irq(gpio_to_irq(pdev->resource[0].start), neo1973kbd);
28434 +
28435 + input_unregister_device(neo1973kbd->input);
28436 + input_free_device(neo1973kbd->input);
28437 + platform_set_drvdata(pdev, NULL);
28438 + kfree(neo1973kbd);
28439 +
28440 + return 0;
28441 +}
28442 +
28443 +static struct platform_driver neo1973kbd_driver = {
28444 + .probe = neo1973kbd_probe,
28445 + .remove = neo1973kbd_remove,
28446 + .suspend = neo1973kbd_suspend,
28447 + .resume = neo1973kbd_resume,
28448 + .driver = {
28449 + .name = "neo1973-button",
28450 + },
28451 +};
28452 +
28453 +static int __devinit neo1973kbd_init(void)
28454 +{
28455 + return platform_driver_register(&neo1973kbd_driver);
28456 +}
28457 +
28458 +static void __exit neo1973kbd_exit(void)
28459 +{
28460 + platform_driver_unregister(&neo1973kbd_driver);
28461 +}
28462 +
28463 +module_init(neo1973kbd_init);
28464 +module_exit(neo1973kbd_exit);
28465 +
28466 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
28467 +MODULE_DESCRIPTION("FIC Neo1973 buttons input driver");
28468 +MODULE_LICENSE("GPL");
28469 Index: linux-2.6.24.7/drivers/input/keyboard/qt2410kbd.c
28470 ===================================================================
28471 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
28472 +++ linux-2.6.24.7/drivers/input/keyboard/qt2410kbd.c 2008-12-11 22:46:49.000000000 +0100
28473 @@ -0,0 +1,233 @@
28474 +/*
28475 + * Keyboard driver for Armzone QT2410
28476 + *
28477 + * (C) 2006 by Openmoko, Inc.
28478 + * Author: Harald Welte <laforge@openmoko.org>
28479 + * All rights reserved.
28480 + *
28481 + * This program is free software; you can redistribute it and/or modify
28482 + * it under the terms of the GNU General Public License version 2 as
28483 + * published by the Free Software Foundation.
28484 + *
28485 + */
28486 +
28487 +#include <linux/delay.h>
28488 +#include <linux/platform_device.h>
28489 +#include <linux/init.h>
28490 +#include <linux/input.h>
28491 +#include <linux/interrupt.h>
28492 +#include <linux/jiffies.h>
28493 +#include <linux/module.h>
28494 +#include <linux/slab.h>
28495 +
28496 +#include <asm/hardware.h>
28497 +#include <asm/arch/gta01.h>
28498 +
28499 +struct gta01kbd {
28500 + struct input_dev *input;
28501 + unsigned int suspended;
28502 + unsigned long suspend_jiffies;
28503 +};
28504 +
28505 +static irqreturn_t gta01kbd_interrupt(int irq, void *dev_id)
28506 +{
28507 + struct gta01kbd *gta01kbd_data = dev_id;
28508 +
28509 + /* FIXME: use GPIO from platform_dev resources */
28510 + if (s3c2410_gpio_getpin(S3C2410_GPF0))
28511 + input_report_key(gta01kbd_data->input, KEY_PHONE, 1);
28512 + else
28513 + input_report_key(gta01kbd_data->input, KEY_PHONE, 0);
28514 +
28515 + input_sync(gta01kbd_data->input);
28516 +
28517 + return IRQ_HANDLED;
28518 +}
28519 +
28520 +
28521 +#ifdef CONFIG_PM
28522 +static int gta01kbd_suspend(struct platform_device *dev, pm_message_t state)
28523 +{
28524 + struct gta01kbd *gta01kbd = platform_get_drvdata(dev);
28525 +
28526 + gta01kbd->suspended = 1;
28527 +
28528 + return 0;
28529 +}
28530 +
28531 +static int gta01kbd_resume(struct platform_device *dev)
28532 +{
28533 + struct gta01kbd *gta01kbd = platform_get_drvdata(dev);
28534 +
28535 + gta01kbd->suspended = 0;
28536 +
28537 + return 0;
28538 +}
28539 +#else
28540 +#define gta01kbd_suspend NULL
28541 +#define gta01kbd_resume NULL
28542 +#endif
28543 +
28544 +static int gta01kbd_probe(struct platform_device *pdev)
28545 +{
28546 + struct gta01kbd *gta01kbd;
28547 + struct input_dev *input_dev;
28548 + int irq_911;
28549 + int rc = 0;
28550 +
28551 + gta01kbd = kzalloc(sizeof(struct gta01kbd), GFP_KERNEL);
28552 + if (!gta01kbd) {
28553 + rc = -ENOMEM;
28554 + goto bail;
28555 + }
28556 + input_dev = input_allocate_device();
28557 + if (!gta01kbd || !input_dev) {
28558 + rc = -ENOMEM;
28559 + goto bail_free;
28560 + }
28561 +
28562 + if (pdev->resource[0].flags != 0) {\
28563 + rc = -EINVAL;
28564 + goto bail_free_dev;
28565 + }
28566 +
28567 + irq_911 = s3c2410_gpio_getirq(pdev->resource[0].start);
28568 + if (irq_911 < 0) {
28569 + rc = -EINVAL;
28570 + goto bail_free_dev;
28571 + }
28572 +
28573 + platform_set_drvdata(pdev, gta01kbd);
28574 +
28575 + gta01kbd->input = input_dev;
28576 +
28577 +#if 0
28578 + spin_lock_init(&gta01kbd->lock);
28579 + /* Init Keyboard rescan timer */
28580 + init_timer(&corgikbd->timer);
28581 + corgikbd->timer.function = corgikbd_timer_callback;
28582 + corgikbd->timer.data = (unsigned long) corgikbd;
28583 +
28584 + /* Init Hinge Timer */
28585 + init_timer(&corgikbd->htimer);
28586 + corgikbd->htimer.function = corgikbd_hinge_timer;
28587 + corgikbd->htimer.data = (unsigned long) corgikbd;
28588 +
28589 + corgikbd->suspend_jiffies=jiffies;
28590 +
28591 + memcpy(corgikbd->keycode, corgikbd_keycode, sizeof(corgikbd->keycode));
28592 +#endif
28593 +
28594 + input_dev->name = "QT2410 Buttons";
28595 + input_dev->phys = "qt2410kbd/input0";
28596 + input_dev->id.bustype = BUS_HOST;
28597 + input_dev->id.vendor = 0x0001;
28598 + input_dev->id.product = 0x0001;
28599 + input_dev->id.version = 0x0100;
28600 + input_dev->cdev.dev = &pdev->dev;
28601 + input_dev->private = gta01kbd;
28602 +
28603 + input_dev->evbit[0] = BIT(EV_KEY);
28604 +#if 0
28605 + input_dev->keycode = gta01kbd->keycode;
28606 + input_dev->keycodesize = sizeof(unsigned char);
28607 + input_dev->keycodemax = ARRAY_SIZE(corgikbd_keycode);
28608 +
28609 + for (i = 0; i < ARRAY_SIZE(corgikbd_keycode); i++)
28610 + set_bit(corgikbd->keycode[i], input_dev->keybit);
28611 + clear_bit(0, input_dev->keybit);
28612 + set_bit(SW_LID, input_dev->swbit);
28613 + set_bit(SW_TABLET_MODE, input_dev->swbit);
28614 + set_bit(SW_HEADPHONE_INSERT, input_dev->swbit);
28615 +#endif
28616 +
28617 + rc = input_register_device(gta01kbd->input);
28618 + if (rc)
28619 + goto bail_free_dev;
28620 +
28621 + s3c2410_gpio_cfgpin(S3C2410_GPF0, S3C2410_GPF0_EINT0);
28622 + if (request_irq(irq_911, gta01kbd_interrupt,
28623 + IRQF_DISABLED | IRQF_TRIGGER_RISING |
28624 + IRQF_TRIGGER_FALLING, "qt2410kbd_eint0", gta01kbd))
28625 + printk(KERN_WARNING "gta01kbd: Can't get IRQ\n");
28626 + enable_irq_wake(irq_911);
28627 +
28628 + /* FIXME: headphone insert */
28629 +
28630 +#if 0
28631 + mod_timer(&corgikbd->htimer, jiffies + msecs_to_jiffies(HINGE_SCAN_INTERVAL));
28632 +
28633 + /* Setup sense interrupts - RisingEdge Detect, sense lines as inputs */
28634 + for (i = 0; i < CORGI_KEY_SENSE_NUM; i++) {
28635 + pxa_gpio_mode(CORGI_GPIO_KEY_SENSE(i) | GPIO_IN);
28636 + if (request_irq(CORGI_IRQ_GPIO_KEY_SENSE(i), corgikbd_interrupt,
28637 + SA_INTERRUPT | SA_TRIGGER_RISING,
28638 + "corgikbd", corgikbd))
28639 + printk(KERN_WARNING "corgikbd: Can't get IRQ: %d!\n", i);
28640 + }
28641 +
28642 + /* Set Strobe lines as outputs - set high */
28643 + for (i = 0; i < CORGI_KEY_STROBE_NUM; i++)
28644 + pxa_gpio_mode(CORGI_GPIO_KEY_STROBE(i) | GPIO_OUT | GPIO_DFLT_HIGH);
28645 +
28646 + /* Setup the headphone jack as an input */
28647 + pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN);
28648 +#endif
28649 +
28650 + return 0;
28651 +
28652 +bail_free_dev:
28653 + input_free_device(input_dev);
28654 +bail_free:
28655 + kfree(gta01kbd);
28656 +bail:
28657 + return rc;
28658 +}
28659 +
28660 +static int gta01kbd_remove(struct platform_device *pdev)
28661 +{
28662 + struct gta01kbd *gta01kbd = platform_get_drvdata(pdev);
28663 +
28664 + free_irq(s3c2410_gpio_getirq(pdev->resource[0].start), gta01kbd);
28665 +#if 0
28666 + int i;
28667 +
28668 + for (i = 0; i < CORGI_KEY_SENSE_NUM; i++)
28669 + free_irq(CORGI_IRQ_GPIO_KEY_SENSE(i), corgikbd);
28670 +
28671 + del_timer_sync(&corgikbd->htimer);
28672 + del_timer_sync(&corgikbd->timer);
28673 +#endif
28674 + input_unregister_device(gta01kbd->input);
28675 +
28676 + kfree(gta01kbd);
28677 +
28678 + return 0;
28679 +}
28680 +
28681 +static struct platform_driver gta01kbd_driver = {
28682 + .probe = gta01kbd_probe,
28683 + .remove = gta01kbd_remove,
28684 + .suspend = gta01kbd_suspend,
28685 + .resume = gta01kbd_resume,
28686 + .driver = {
28687 + .name = "qt2410-button",
28688 + },
28689 +};
28690 +
28691 +static int __devinit gta01kbd_init(void)
28692 +{
28693 + return platform_driver_register(&gta01kbd_driver);
28694 +}
28695 +
28696 +static void __exit gta01kbd_exit(void)
28697 +{
28698 + platform_driver_unregister(&gta01kbd_driver);
28699 +}
28700 +
28701 +module_init(gta01kbd_init);
28702 +module_exit(gta01kbd_exit);
28703 +
28704 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
28705 +MODULE_DESCRIPTION("Armzone QT2410 Buttons Driver");
28706 +MODULE_LICENSE("GPL");
28707 Index: linux-2.6.24.7/drivers/input/misc/Kconfig
28708 ===================================================================
28709 --- linux-2.6.24.7.orig/drivers/input/misc/Kconfig 2008-12-11 22:46:09.000000000 +0100
28710 +++ linux-2.6.24.7/drivers/input/misc/Kconfig 2008-12-11 22:46:49.000000000 +0100
28711 @@ -199,4 +199,13 @@ config INPUT_GPIO_BUTTONS
28712 To compile this driver as a module, choose M here: the
28713 module will be called gpio-buttons.
28714
28715 +config INPUT_LIS302DL
28716 + tristate "STmicro LIS302DL 3-axis accelerometer"
28717 + depends on SPI_MASTER
28718 + help
28719 + SPI driver for the STmicro LIS302DL 3-axis accelerometer.
28720 +
28721 + The userspece interface is a 3-axis (X/Y/Z) relative movement
28722 + Linux input device, reporting REL_[XYZ] events.
28723 +
28724 endif
28725 Index: linux-2.6.24.7/drivers/input/misc/lis302dl.c
28726 ===================================================================
28727 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
28728 +++ linux-2.6.24.7/drivers/input/misc/lis302dl.c 2008-12-11 22:46:49.000000000 +0100
28729 @@ -0,0 +1,863 @@
28730 +/* Linux kernel driver for the ST LIS302D 3-axis accelerometer
28731 + *
28732 + * Copyright (C) 2007-2008 by Openmoko, Inc.
28733 + * Author: Harald Welte <laforge@openmoko.org>
28734 + * converted to private bitbang by:
28735 + * Andy Green <andy@openmoko.com>
28736 + * ability to set acceleration threshold added by:
28737 + * Simon Kagstrom <simon.kagstrom@gmail.com>
28738 + * All rights reserved.
28739 + *
28740 + * This program is free software; you can redistribute it and/or
28741 + * modify it under the terms of the GNU General Public License as
28742 + * published by the Free Software Foundation; either version 2 of
28743 + * the License, or (at your option) any later version.
28744 + *
28745 + * This program is distributed in the hope that it will be useful,
28746 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
28747 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28748 + * GNU General Public License for more details.
28749 + *
28750 + * You should have received a copy of the GNU General Public License
28751 + * along with this program; if not, write to the Free Software
28752 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
28753 + * MA 02111-1307 USA
28754 + *
28755 + * TODO
28756 + * * statistics for overflow events
28757 + * * configuration interface (sysfs) for
28758 + * * enable/disable x/y/z axis data ready
28759 + * * enable/disable resume from freee fall / click
28760 + * * free fall / click parameters
28761 + * * high pass filter parameters
28762 + */
28763 +#include <linux/kernel.h>
28764 +#include <linux/types.h>
28765 +#include <linux/module.h>
28766 +#include <linux/device.h>
28767 +#include <linux/platform_device.h>
28768 +#include <linux/delay.h>
28769 +#include <linux/irq.h>
28770 +#include <linux/interrupt.h>
28771 +#include <linux/sysfs.h>
28772 +
28773 +#include <linux/lis302dl.h>
28774 +
28775 +/* Utility functions */
28776 +
28777 +static u8 __reg_read(struct lis302dl_info *lis, u8 reg)
28778 +{
28779 + return (lis->pdata->lis302dl_bitbang_reg_read)(lis, reg);
28780 +}
28781 +
28782 +static void __reg_write(struct lis302dl_info *lis, u8 reg, u8 val)
28783 +{
28784 + (lis->pdata->lis302dl_bitbang_reg_write)(lis, reg, val);
28785 +}
28786 +
28787 +static void __reg_set_bit_mask(struct lis302dl_info *lis, u8 reg, u8 mask,
28788 + u8 val)
28789 +{
28790 + u_int8_t tmp;
28791 +
28792 + val &= mask;
28793 +
28794 + tmp = __reg_read(lis, reg);
28795 + tmp &= ~mask;
28796 + tmp |= val;
28797 + __reg_write(lis, reg, tmp);
28798 +}
28799 +
28800 +static int __ms_to_duration(struct lis302dl_info *lis, int ms)
28801 +{
28802 + /* If we have 400 ms sampling rate, the stepping is 2.5 ms,
28803 + * on 100 ms the stepping is 10ms */
28804 + if (lis->flags & LIS302DL_F_DR)
28805 + return min((ms * 10) / 25, 637);
28806 +
28807 + return min(ms / 10, 2550);
28808 +}
28809 +
28810 +static int __duration_to_ms(struct lis302dl_info *lis, int duration)
28811 +{
28812 + if (lis->flags & LIS302DL_F_DR)
28813 + return (duration * 25) / 10;
28814 +
28815 + return duration * 10;
28816 +}
28817 +
28818 +static u8 __mg_to_threshold(struct lis302dl_info *lis, int mg)
28819 +{
28820 + /* If FS is set each bit is 71mg, otherwise 18mg. The THS register
28821 + * has 7 bits for the threshold value */
28822 + if (lis->flags & LIS302DL_F_FS)
28823 + return min(mg / 71, 127);
28824 +
28825 + return min(mg / 18, 127);
28826 +}
28827 +
28828 +static int __threshold_to_mg(struct lis302dl_info *lis, u8 threshold)
28829 +{
28830 + if (lis->flags & LIS302DL_F_FS)
28831 + return threshold * 71;
28832 +
28833 + return threshold * 18;
28834 +}
28835 +
28836 +/* interrupt handling related */
28837 +
28838 +enum lis302dl_intmode {
28839 + LIS302DL_INTMODE_GND = 0x00,
28840 + LIS302DL_INTMODE_FF_WU_1 = 0x01,
28841 + LIS302DL_INTMODE_FF_WU_2 = 0x02,
28842 + LIS302DL_INTMODE_FF_WU_12 = 0x03,
28843 + LIS302DL_INTMODE_DATA_READY = 0x04,
28844 + LIS302DL_INTMODE_CLICK = 0x07,
28845 +};
28846 +
28847 +
28848 +static void __lis302dl_int_mode(struct device *dev, int int_pin,
28849 + enum lis302dl_intmode mode)
28850 +{
28851 + struct lis302dl_info *lis = dev_get_drvdata(dev);
28852 +
28853 + switch (int_pin) {
28854 + case 1:
28855 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL3, 0x07, mode);
28856 + break;
28857 + case 2:
28858 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL3, 0x38, mode << 3);
28859 + break;
28860 + default:
28861 + BUG();
28862 + }
28863 +}
28864 +
28865 +static void __enable_wakeup(struct lis302dl_info *lis)
28866 +{
28867 + /* First zero to get to a known state */
28868 + __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1,
28869 + lis->wakeup.cfg);
28870 + __reg_write(lis, LIS302DL_REG_FF_WU_THS_1,
28871 + lis->wakeup.threshold);
28872 + __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1,
28873 + lis->wakeup.duration);
28874 +
28875 + /* Route the interrupt for wakeup */
28876 + __lis302dl_int_mode(lis->dev, 1,
28877 + LIS302DL_INTMODE_FF_WU_1);
28878 +
28879 + __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD);
28880 +}
28881 +
28882 +static void __enable_data_collection(struct lis302dl_info *lis)
28883 +{
28884 + u_int8_t ctrl1 = LIS302DL_CTRL1_PD | LIS302DL_CTRL1_Xen |
28885 + LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen;
28886 +
28887 + /* make sure we're powered up and generate data ready */
28888 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, ctrl1);
28889 +
28890 + /* If the threshold is zero, let the device generated an interrupt
28891 + * on each datum */
28892 + if (lis->threshold == 0) {
28893 + __reg_write(lis, LIS302DL_REG_CTRL2, 0);
28894 + __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_DATA_READY);
28895 + __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_DATA_READY);
28896 + } else {
28897 + __reg_write(lis, LIS302DL_REG_CTRL2,
28898 + LIS302DL_CTRL2_HPFF1);
28899 + __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, lis->threshold);
28900 + __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, lis->duration);
28901 +
28902 + /* Clear the HP filter "starting point" */
28903 + __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET);
28904 + __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1,
28905 + LIS302DL_FFWUCFG_XHIE | LIS302DL_FFWUCFG_YHIE |
28906 + LIS302DL_FFWUCFG_ZHIE);
28907 + __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_FF_WU_12);
28908 + __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_FF_WU_12);
28909 + }
28910 +}
28911 +
28912 +#if 0
28913 +static void _report_btn_single(struct input_dev *inp, int btn)
28914 +{
28915 + input_report_key(inp, btn, 1);
28916 + input_sync(inp);
28917 + input_report_key(inp, btn, 0);
28918 +}
28919 +
28920 +static void _report_btn_double(struct input_dev *inp, int btn)
28921 +{
28922 + input_report_key(inp, btn, 1);
28923 + input_sync(inp);
28924 + input_report_key(inp, btn, 0);
28925 + input_sync(inp);
28926 + input_report_key(inp, btn, 1);
28927 + input_sync(inp);
28928 + input_report_key(inp, btn, 0);
28929 +}
28930 +#endif
28931 +
28932 +
28933 +static void lis302dl_bitbang_read_sample(struct lis302dl_info *lis)
28934 +{
28935 + u8 data = 0xc0 | LIS302DL_REG_OUT_X; /* read, autoincrement */
28936 + u8 read[5];
28937 + unsigned long flags;
28938 + int mg_per_sample;
28939 +
28940 + local_irq_save(flags);
28941 + mg_per_sample = __threshold_to_mg(lis, 1);
28942 +
28943 + (lis->pdata->lis302dl_bitbang)(lis, &data, 1, &read[0], 5);
28944 +
28945 + local_irq_restore(flags);
28946 +
28947 + input_report_rel(lis->input_dev, REL_X, mg_per_sample * (s8)read[0]);
28948 + input_report_rel(lis->input_dev, REL_Y, mg_per_sample * (s8)read[2]);
28949 + input_report_rel(lis->input_dev, REL_Z, mg_per_sample * (s8)read[4]);
28950 +
28951 + input_sync(lis->input_dev);
28952 +
28953 + /* Reset the HP filter */
28954 + __reg_read(lis, LIS302DL_REG_HP_FILTER_RESET);
28955 +}
28956 +
28957 +static irqreturn_t lis302dl_interrupt(int irq, void *_lis)
28958 +{
28959 + struct lis302dl_info *lis = _lis;
28960 +
28961 + lis302dl_bitbang_read_sample(lis);
28962 + return IRQ_HANDLED;
28963 +}
28964 +
28965 +/* sysfs */
28966 +
28967 +static ssize_t show_rate(struct device *dev, struct device_attribute *attr,
28968 + char *buf)
28969 +{
28970 + struct lis302dl_info *lis = dev_get_drvdata(dev);
28971 + u8 ctrl1;
28972 + unsigned long flags;
28973 +
28974 + local_irq_save(flags);
28975 + ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1);
28976 + local_irq_restore(flags);
28977 +
28978 + return sprintf(buf, "%d\n", ctrl1 & LIS302DL_CTRL1_DR ? 400 : 100);
28979 +}
28980 +
28981 +static ssize_t set_rate(struct device *dev, struct device_attribute *attr,
28982 + const char *buf, size_t count)
28983 +{
28984 + struct lis302dl_info *lis = dev_get_drvdata(dev);
28985 + unsigned long flags;
28986 + int duration_ms = __duration_to_ms(lis, lis->duration);
28987 +
28988 + local_irq_save(flags);
28989 +
28990 + if (!strcmp(buf, "400\n")) {
28991 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_DR,
28992 + LIS302DL_CTRL1_DR);
28993 + lis->flags |= LIS302DL_F_DR;
28994 + } else {
28995 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_DR,
28996 + 0);
28997 + lis->flags &= ~LIS302DL_F_DR;
28998 + }
28999 + lis->duration = __ms_to_duration(lis, duration_ms);
29000 + local_irq_restore(flags);
29001 +
29002 + return count;
29003 +}
29004 +
29005 +static DEVICE_ATTR(sample_rate, S_IRUGO | S_IWUSR, show_rate, set_rate);
29006 +
29007 +static ssize_t show_scale(struct device *dev, struct device_attribute *attr,
29008 + char *buf)
29009 +{
29010 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29011 + u_int8_t ctrl1;
29012 + unsigned long flags;
29013 +
29014 + local_irq_save(flags);
29015 + ctrl1 = __reg_read(lis, LIS302DL_REG_CTRL1);
29016 + local_irq_restore(flags);
29017 +
29018 + return sprintf(buf, "%s\n", ctrl1 & LIS302DL_CTRL1_FS ? "9.2" : "2.3");
29019 +}
29020 +
29021 +static ssize_t set_scale(struct device *dev, struct device_attribute *attr,
29022 + const char *buf, size_t count)
29023 +{
29024 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29025 + unsigned long flags;
29026 + int threshold_mg = __threshold_to_mg(lis, lis->threshold);
29027 +
29028 + local_irq_save(flags);
29029 +
29030 + if (!strcmp(buf, "9.2\n")) {
29031 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_FS,
29032 + LIS302DL_CTRL1_FS);
29033 + lis->flags |= LIS302DL_F_FS;
29034 + } else {
29035 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_FS,
29036 + 0);
29037 + lis->flags &= ~LIS302DL_F_FS;
29038 + }
29039 +
29040 + /* Adjust the threshold */
29041 + lis->threshold = __mg_to_threshold(lis, threshold_mg);
29042 + if (lis->flags & LIS302DL_F_INPUT_OPEN)
29043 + __enable_data_collection(lis);
29044 +
29045 + local_irq_restore(flags);
29046 +
29047 + return count;
29048 +}
29049 +
29050 +static DEVICE_ATTR(full_scale, S_IRUGO | S_IWUSR, show_scale, set_scale);
29051 +
29052 +static ssize_t show_threshold(struct device *dev, struct device_attribute *attr,
29053 + char *buf)
29054 +{
29055 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29056 +
29057 + return sprintf(buf, "%d\n", __threshold_to_mg(lis, lis->threshold));
29058 +}
29059 +
29060 +static ssize_t set_threshold(struct device *dev, struct device_attribute *attr,
29061 + const char *buf, size_t count)
29062 +{
29063 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29064 + u32 val;
29065 +
29066 + if (sscanf(buf, "%d\n", &val) != 1)
29067 + return -EINVAL;
29068 + /* 8g is the maximum if FS is 1 */
29069 + if (val < 0 || val > 8000)
29070 + return -ERANGE;
29071 +
29072 + /* Set the threshold and write it out if the device is used */
29073 + lis->threshold = __mg_to_threshold(lis, val);
29074 +
29075 + if (lis->flags & LIS302DL_F_INPUT_OPEN) {
29076 + unsigned long flags;
29077 +
29078 + local_irq_save(flags);
29079 + __enable_data_collection(lis);
29080 + local_irq_restore(flags);
29081 + }
29082 +
29083 + return count;
29084 +}
29085 +
29086 +static DEVICE_ATTR(threshold, S_IRUGO | S_IWUSR, show_threshold, set_threshold);
29087 +
29088 +static ssize_t show_duration(struct device *dev, struct device_attribute *attr,
29089 + char *buf)
29090 +{
29091 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29092 +
29093 + return sprintf(buf, "%d\n", __duration_to_ms(lis, lis->duration));
29094 +}
29095 +
29096 +static ssize_t set_duration(struct device *dev, struct device_attribute *attr,
29097 + const char *buf, size_t count)
29098 +{
29099 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29100 + u32 val;
29101 +
29102 + if (sscanf(buf, "%d\n", &val) != 1)
29103 + return -EINVAL;
29104 + if (val < 0 || val > 2550)
29105 + return -ERANGE;
29106 +
29107 + lis->duration = __ms_to_duration(lis, val);
29108 + if (lis->flags & LIS302DL_F_INPUT_OPEN)
29109 + __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, lis->duration);
29110 +
29111 + return count;
29112 +}
29113 +
29114 +static DEVICE_ATTR(duration, S_IRUGO | S_IWUSR, show_duration, set_duration);
29115 +
29116 +static ssize_t lis302dl_dump(struct device *dev, struct device_attribute *attr,
29117 + char *buf)
29118 +{
29119 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29120 + int n = 0;
29121 + u8 reg[0x40];
29122 + char *end = buf;
29123 + unsigned long flags;
29124 +
29125 + local_irq_save(flags);
29126 +
29127 + for (n = 0; n < sizeof(reg); n++)
29128 + reg[n] = __reg_read(lis, n);
29129 +
29130 + local_irq_restore(flags);
29131 +
29132 + for (n = 0; n < sizeof(reg); n += 16) {
29133 + hex_dump_to_buffer(reg + n, 16, 16, 1, end, 128, 0);
29134 + end += strlen(end);
29135 + *end++ = '\n';
29136 + *end++ = '\0';
29137 + }
29138 +
29139 + return end - buf;
29140 +}
29141 +static DEVICE_ATTR(dump, S_IRUGO, lis302dl_dump, NULL);
29142 +
29143 +/* Configure freefall/wakeup interrupts */
29144 +static ssize_t set_wakeup(struct device *dev, struct device_attribute *attr,
29145 + const char *buf, size_t count)
29146 +{
29147 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29148 + u_int8_t x_lo, y_lo, z_lo;
29149 + u_int8_t x_hi, y_hi, z_hi;
29150 + int duration, threshold, and_events;
29151 + int x, y, z;
29152 +
29153 + /* Zero turns the feature off */
29154 + if (strcmp(buf, "0\n") == 0) {
29155 + lis->wakeup.active = 0;
29156 +
29157 + if (lis->flags & LIS302DL_F_IRQ_WAKE) {
29158 + disable_irq_wake(lis->pdata->interrupt);
29159 + lis->flags &= ~LIS302DL_F_IRQ_WAKE;
29160 + }
29161 +
29162 + return count;
29163 + }
29164 +
29165 + if (sscanf(buf, "%d %d %d %d %d %d", &x, &y, &z, &threshold, &duration,
29166 + &and_events) != 6)
29167 + return -EINVAL;
29168 +
29169 + if (duration < 0 || duration > 2550 ||
29170 + threshold < 0 || threshold > 8000)
29171 + return -ERANGE;
29172 +
29173 + /* Interrupt flags */
29174 + x_lo = x < 0 ? LIS302DL_FFWUCFG_XLIE : 0;
29175 + y_lo = y < 0 ? LIS302DL_FFWUCFG_YLIE : 0;
29176 + z_lo = z < 0 ? LIS302DL_FFWUCFG_ZLIE : 0;
29177 + x_hi = x > 0 ? LIS302DL_FFWUCFG_XHIE : 0;
29178 + y_hi = y > 0 ? LIS302DL_FFWUCFG_YHIE : 0;
29179 + z_hi = z > 0 ? LIS302DL_FFWUCFG_ZHIE : 0;
29180 +
29181 + lis->wakeup.duration = __ms_to_duration(lis, duration);
29182 + lis->wakeup.threshold = __mg_to_threshold(lis, threshold);
29183 + lis->wakeup.cfg = (and_events ? LIS302DL_FFWUCFG_AOI : 0) |
29184 + x_lo | x_hi | y_lo | y_hi | z_lo | z_hi;
29185 +
29186 + if (!(lis->flags & LIS302DL_F_IRQ_WAKE)) {
29187 + enable_irq_wake(lis->pdata->interrupt);
29188 + lis->flags |= LIS302DL_F_IRQ_WAKE;
29189 + }
29190 + lis->wakeup.active = 1;
29191 +
29192 + return count;
29193 +}
29194 +
29195 +static ssize_t show_wakeup(struct device *dev,
29196 + struct device_attribute *attr, char *buf)
29197 +{
29198 + struct lis302dl_info *lis = dev_get_drvdata(dev);
29199 + u8 config;
29200 +
29201 + /* All events off? */
29202 + if (!lis->wakeup.active)
29203 + return sprintf(buf, "off\n");
29204 +
29205 + config = lis->wakeup.cfg;
29206 +
29207 + return sprintf(buf,
29208 + "%s events, duration %d, threshold %d, "
29209 + "enabled: %s %s %s %s %s %s\n",
29210 + (config & LIS302DL_FFWUCFG_AOI) == 0 ? "or" : "and",
29211 + __duration_to_ms(lis, lis->wakeup.duration),
29212 + __threshold_to_mg(lis, lis->wakeup.threshold),
29213 + (config & LIS302DL_FFWUCFG_XLIE) == 0 ? "---" : "xlo",
29214 + (config & LIS302DL_FFWUCFG_XHIE) == 0 ? "---" : "xhi",
29215 + (config & LIS302DL_FFWUCFG_YLIE) == 0 ? "---" : "ylo",
29216 + (config & LIS302DL_FFWUCFG_YHIE) == 0 ? "---" : "yhi",
29217 + (config & LIS302DL_FFWUCFG_ZLIE) == 0 ? "---" : "zlo",
29218 + (config & LIS302DL_FFWUCFG_ZHIE) == 0 ? "---" : "zhi");
29219 +}
29220 +
29221 +static DEVICE_ATTR(wakeup, S_IRUGO | S_IWUSR, show_wakeup, set_wakeup);
29222 +
29223 +static struct attribute *lis302dl_sysfs_entries[] = {
29224 + &dev_attr_sample_rate.attr,
29225 + &dev_attr_full_scale.attr,
29226 + &dev_attr_threshold.attr,
29227 + &dev_attr_duration.attr,
29228 + &dev_attr_dump.attr,
29229 + &dev_attr_wakeup.attr,
29230 + NULL
29231 +};
29232 +
29233 +static struct attribute_group lis302dl_attr_group = {
29234 + .name = NULL,
29235 + .attrs = lis302dl_sysfs_entries,
29236 +};
29237 +
29238 +/* input device handling and driver core interaction */
29239 +static int lis302dl_input_open(struct input_dev *inp)
29240 +{
29241 + struct lis302dl_info *lis = inp->private;
29242 + unsigned long flags;
29243 +
29244 + local_irq_save(flags);
29245 +
29246 + __enable_data_collection(lis);
29247 + lis->flags |= LIS302DL_F_INPUT_OPEN;
29248 +
29249 + /* kick it off -- since we are edge triggered, if we missed the edge
29250 + * permanent low interrupt is death for us */
29251 + lis302dl_bitbang_read_sample(lis);
29252 +
29253 + local_irq_restore(flags);
29254 +
29255 + return 0;
29256 +}
29257 +
29258 +static void lis302dl_input_close(struct input_dev *inp)
29259 +{
29260 + struct lis302dl_info *lis = inp->private;
29261 + u_int8_t ctrl1 = LIS302DL_CTRL1_Xen | LIS302DL_CTRL1_Yen |
29262 + LIS302DL_CTRL1_Zen;
29263 + unsigned long flags;
29264 +
29265 + local_irq_save(flags);
29266 +
29267 + /* since the input core already serializes access and makes sure we
29268 + * only see close() for the close of the last user, we can safely
29269 + * disable the data ready events */
29270 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, ctrl1, 0x00);
29271 + lis->flags &= ~LIS302DL_F_INPUT_OPEN;
29272 +
29273 + /* however, don't power down the whole device if still needed */
29274 + if (!(lis->flags & LIS302DL_F_WUP_FF ||
29275 + lis->flags & LIS302DL_F_WUP_CLICK)) {
29276 + __reg_set_bit_mask(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD,
29277 + 0x00);
29278 + }
29279 + local_irq_restore(flags);
29280 +}
29281 +
29282 +/* get the device to reload its coefficients from EEPROM and wait for it
29283 + * to complete
29284 + */
29285 +
29286 +static int __lis302dl_reset_device(struct lis302dl_info *lis)
29287 +{
29288 + int timeout = 10;
29289 +
29290 + __reg_write(lis, LIS302DL_REG_CTRL2,
29291 + LIS302DL_CTRL2_BOOT | LIS302DL_CTRL2_FDS);
29292 +
29293 + while ((__reg_read(lis, LIS302DL_REG_CTRL2)
29294 + & LIS302DL_CTRL2_BOOT) && (timeout--))
29295 + mdelay(1);
29296 +
29297 + return !!(timeout < 0);
29298 +}
29299 +
29300 +static int __devinit lis302dl_probe(struct platform_device *pdev)
29301 +{
29302 + int rc;
29303 + struct lis302dl_info *lis;
29304 + u_int8_t wai;
29305 + unsigned long flags;
29306 + struct lis302dl_platform_data *pdata = pdev->dev.platform_data;
29307 +
29308 + lis = kzalloc(sizeof(*lis), GFP_KERNEL);
29309 + if (!lis)
29310 + return -ENOMEM;
29311 +
29312 + local_irq_save(flags);
29313 +
29314 + lis->dev = &pdev->dev;
29315 +
29316 + dev_set_drvdata(lis->dev, lis);
29317 +
29318 + lis->pdata = pdata;
29319 +
29320 + /* Configure our IO */
29321 + (lis->pdata->lis302dl_suspend_io)(lis, 1);
29322 +
29323 + wai = __reg_read(lis, LIS302DL_REG_WHO_AM_I);
29324 + if (wai != LIS302DL_WHO_AM_I_MAGIC) {
29325 + dev_err(lis->dev, "unknown who_am_i signature 0x%02x\n", wai);
29326 + dev_set_drvdata(lis->dev, NULL);
29327 + rc = -ENODEV;
29328 + goto bail_free_lis;
29329 + }
29330 +
29331 + rc = sysfs_create_group(&lis->dev->kobj, &lis302dl_attr_group);
29332 + if (rc) {
29333 + dev_err(lis->dev, "error creating sysfs group\n");
29334 + goto bail_free_lis;
29335 + }
29336 +
29337 + /* initialize input layer details */
29338 + lis->input_dev = input_allocate_device();
29339 + if (!lis->input_dev) {
29340 + dev_err(lis->dev, "Unable to allocate input device\n");
29341 + goto bail_sysfs;
29342 + }
29343 +
29344 + set_bit(EV_REL, lis->input_dev->evbit);
29345 + set_bit(REL_X, lis->input_dev->relbit);
29346 + set_bit(REL_Y, lis->input_dev->relbit);
29347 + set_bit(REL_Z, lis->input_dev->relbit);
29348 +/* set_bit(EV_KEY, lis->input_dev->evbit);
29349 + set_bit(BTN_X, lis->input_dev->keybit);
29350 + set_bit(BTN_Y, lis->input_dev->keybit);
29351 + set_bit(BTN_Z, lis->input_dev->keybit);
29352 +*/
29353 + lis->threshold = 1;
29354 + lis->duration = 0;
29355 + memset(&lis->wakeup, 0, sizeof(lis->wakeup));
29356 +
29357 + lis->input_dev->private = lis;
29358 + lis->input_dev->name = pdata->name;
29359 + /* SPI Bus not defined as a valid bus for input subsystem*/
29360 + lis->input_dev->id.bustype = BUS_I2C; /* lie about it */
29361 + lis->input_dev->open = lis302dl_input_open;
29362 + lis->input_dev->close = lis302dl_input_close;
29363 +
29364 + rc = input_register_device(lis->input_dev);
29365 + if (rc) {
29366 + dev_err(lis->dev, "error %d registering input device\n", rc);
29367 + goto bail_inp_dev;
29368 + }
29369 +
29370 + if (__lis302dl_reset_device(lis))
29371 + dev_err(lis->dev, "device BOOT reload failed\n");
29372 +
29373 + /* force us powered */
29374 + __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_PD |
29375 + LIS302DL_CTRL1_Xen |
29376 + LIS302DL_CTRL1_Yen |
29377 + LIS302DL_CTRL1_Zen);
29378 + mdelay(1);
29379 +
29380 + __reg_write(lis, LIS302DL_REG_CTRL2, 0);
29381 + __reg_write(lis, LIS302DL_REG_CTRL3,
29382 + LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL);
29383 + __reg_write(lis, LIS302DL_REG_FF_WU_THS_1, 0x0);
29384 + __reg_write(lis, LIS302DL_REG_FF_WU_DURATION_1, 0x00);
29385 + __reg_write(lis, LIS302DL_REG_FF_WU_CFG_1, 0x0);
29386 +
29387 + /* start off in powered down mode; we power up when someone opens us */
29388 + __reg_write(lis, LIS302DL_REG_CTRL1, LIS302DL_CTRL1_Xen |
29389 + LIS302DL_CTRL1_Yen | LIS302DL_CTRL1_Zen);
29390 +
29391 + if (pdata->open_drain)
29392 + /* switch interrupt to open collector, active-low */
29393 + __reg_write(lis, LIS302DL_REG_CTRL3,
29394 + LIS302DL_CTRL3_PP_OD | LIS302DL_CTRL3_IHL);
29395 + else
29396 + /* push-pull, active-low */
29397 + __reg_write(lis, LIS302DL_REG_CTRL3, LIS302DL_CTRL3_IHL);
29398 +
29399 + __lis302dl_int_mode(lis->dev, 1, LIS302DL_INTMODE_GND);
29400 + __lis302dl_int_mode(lis->dev, 2, LIS302DL_INTMODE_GND);
29401 +
29402 + __reg_read(lis, LIS302DL_REG_STATUS);
29403 + __reg_read(lis, LIS302DL_REG_FF_WU_SRC_1);
29404 + __reg_read(lis, LIS302DL_REG_FF_WU_SRC_2);
29405 + __reg_read(lis, LIS302DL_REG_CLICK_SRC);
29406 +
29407 + dev_info(lis->dev, "Found %s\n", pdata->name);
29408 +
29409 + lis->pdata = pdata;
29410 +
29411 + rc = request_irq(pdata->interrupt, lis302dl_interrupt,
29412 + IRQF_TRIGGER_FALLING, "lis302dl", lis);
29413 + if (rc < 0) {
29414 + dev_err(lis->dev, "error requesting IRQ %d\n",
29415 + lis->pdata->interrupt);
29416 + goto bail_inp_reg;
29417 + }
29418 + local_irq_restore(flags);
29419 + return 0;
29420 +
29421 +bail_inp_reg:
29422 + input_unregister_device(lis->input_dev);
29423 +bail_inp_dev:
29424 + input_free_device(lis->input_dev);
29425 +bail_sysfs:
29426 + sysfs_remove_group(&lis->dev->kobj, &lis302dl_attr_group);
29427 +bail_free_lis:
29428 + kfree(lis);
29429 + local_irq_restore(flags);
29430 + return rc;
29431 +}
29432 +
29433 +static int __devexit lis302dl_remove(struct platform_device *pdev)
29434 +{
29435 + struct lis302dl_info *lis = dev_get_drvdata(&pdev->dev);
29436 + unsigned long flags;
29437 +
29438 + /* Reset and power down the device */
29439 + local_irq_save(flags);
29440 + __reg_write(lis, LIS302DL_REG_CTRL3, 0x00);
29441 + __reg_write(lis, LIS302DL_REG_CTRL2, 0x00);
29442 + __reg_write(lis, LIS302DL_REG_CTRL1, 0x00);
29443 + local_irq_restore(flags);
29444 +
29445 + /* Cleanup resources */
29446 + free_irq(lis->pdata->interrupt, lis);
29447 + sysfs_remove_group(&pdev->dev.kobj, &lis302dl_attr_group);
29448 + input_unregister_device(lis->input_dev);
29449 + if (lis->input_dev)
29450 + input_free_device(lis->input_dev);
29451 + dev_set_drvdata(lis->dev, NULL);
29452 + kfree(lis);
29453 +
29454 + return 0;
29455 +}
29456 +
29457 +#ifdef CONFIG_PM
29458 +
29459 +static u8 regs_to_save[] = {
29460 + LIS302DL_REG_CTRL1,
29461 + LIS302DL_REG_CTRL2,
29462 + LIS302DL_REG_CTRL3,
29463 + LIS302DL_REG_FF_WU_CFG_1,
29464 + LIS302DL_REG_FF_WU_THS_1,
29465 + LIS302DL_REG_FF_WU_DURATION_1,
29466 + LIS302DL_REG_FF_WU_CFG_2,
29467 + LIS302DL_REG_FF_WU_THS_2,
29468 + LIS302DL_REG_FF_WU_DURATION_2,
29469 + LIS302DL_REG_CLICK_CFG,
29470 + LIS302DL_REG_CLICK_THSY_X,
29471 + LIS302DL_REG_CLICK_THSZ,
29472 + LIS302DL_REG_CLICK_TIME_LIMIT,
29473 + LIS302DL_REG_CLICK_LATENCY,
29474 + LIS302DL_REG_CLICK_WINDOW,
29475 +
29476 +};
29477 +
29478 +static int lis302dl_suspend(struct platform_device *pdev, pm_message_t state)
29479 +{
29480 + struct lis302dl_info *lis = dev_get_drvdata(&pdev->dev);
29481 + unsigned long flags;
29482 + u_int8_t tmp;
29483 + int n;
29484 +
29485 + /* determine if we want to wake up from the accel. */
29486 + if (lis->flags & LIS302DL_F_WUP_CLICK)
29487 + return 0;
29488 +
29489 + disable_irq(lis->pdata->interrupt);
29490 + local_irq_save(flags);
29491 +
29492 + /*
29493 + * When we share SPI over multiple sensors, there is a race here
29494 + * that one or more sensors will lose. In that case, the shared
29495 + * SPI bus GPIO will be in sleep mode and partially pulled down. So
29496 + * we explicitly put our IO into "wake" mode here before the final
29497 + * traffic to the sensor.
29498 + */
29499 + (lis->pdata->lis302dl_suspend_io)(lis, 1);
29500 +
29501 + /* save registers */
29502 + for (n = 0; n < ARRAY_SIZE(regs_to_save); n++)
29503 + lis->regs[regs_to_save[n]] =
29504 + __reg_read(lis, regs_to_save[n]);
29505 +
29506 + /* power down or enable wakeup */
29507 + if (!lis->wakeup.active) {
29508 + tmp = __reg_read(lis, LIS302DL_REG_CTRL1);
29509 + tmp &= ~LIS302DL_CTRL1_PD;
29510 + __reg_write(lis, LIS302DL_REG_CTRL1, tmp);
29511 + } else
29512 + __enable_wakeup(lis);
29513 +
29514 + /* place our IO to the device in sleep-compatible states */
29515 + (lis->pdata->lis302dl_suspend_io)(lis, 0);
29516 +
29517 + local_irq_restore(flags);
29518 +
29519 + return 0;
29520 +}
29521 +
29522 +static int lis302dl_resume(struct platform_device *pdev)
29523 +{
29524 + struct lis302dl_info *lis = dev_get_drvdata(&pdev->dev);
29525 + unsigned long flags;
29526 + int n;
29527 +
29528 + if (lis->flags & LIS302DL_F_WUP_CLICK)
29529 + return 0;
29530 +
29531 + local_irq_save(flags);
29532 +
29533 + /* get our IO to the device back in operational states */
29534 + (lis->pdata->lis302dl_suspend_io)(lis, 1);
29535 +
29536 + /* resume from powerdown first! */
29537 + __reg_write(lis, LIS302DL_REG_CTRL1,
29538 + LIS302DL_CTRL1_PD |
29539 + LIS302DL_CTRL1_Xen |
29540 + LIS302DL_CTRL1_Yen |
29541 + LIS302DL_CTRL1_Zen);
29542 + mdelay(1);
29543 +
29544 + if (__lis302dl_reset_device(lis))
29545 + dev_err(&pdev->dev, "device BOOT reload failed\n");
29546 +
29547 + lis->regs[LIS302DL_REG_CTRL1] |= LIS302DL_CTRL1_PD |
29548 + LIS302DL_CTRL1_Xen |
29549 + LIS302DL_CTRL1_Yen |
29550 + LIS302DL_CTRL1_Zen;
29551 +
29552 + /* restore registers after resume */
29553 + for (n = 0; n < ARRAY_SIZE(regs_to_save); n++)
29554 + __reg_write(lis, regs_to_save[n], lis->regs[regs_to_save[n]]);
29555 +
29556 + local_irq_restore(flags);
29557 + enable_irq(lis->pdata->interrupt);
29558 +
29559 + return 0;
29560 +}
29561 +#else
29562 +#define lis302dl_suspend NULL
29563 +#define lis302dl_resume NULL
29564 +#endif
29565 +
29566 +static struct platform_driver lis302dl_driver = {
29567 + .driver = {
29568 + .name = "lis302dl",
29569 + .owner = THIS_MODULE,
29570 + },
29571 +
29572 + .probe = lis302dl_probe,
29573 + .remove = __devexit_p(lis302dl_remove),
29574 + .suspend = lis302dl_suspend,
29575 + .resume = lis302dl_resume,
29576 +};
29577 +
29578 +static int __devinit lis302dl_init(void)
29579 +{
29580 + return platform_driver_register(&lis302dl_driver);
29581 +}
29582 +
29583 +static void __exit lis302dl_exit(void)
29584 +{
29585 + platform_driver_unregister(&lis302dl_driver);
29586 +}
29587 +
29588 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
29589 +MODULE_LICENSE("GPL");
29590 +
29591 +module_init(lis302dl_init);
29592 +module_exit(lis302dl_exit);
29593 Index: linux-2.6.24.7/drivers/input/misc/Makefile
29594 ===================================================================
29595 --- linux-2.6.24.7.orig/drivers/input/misc/Makefile 2008-12-11 22:46:09.000000000 +0100
29596 +++ linux-2.6.24.7/drivers/input/misc/Makefile 2008-12-11 22:47:43.000000000 +0100
29597 @@ -19,3 +19,4 @@ obj-$(CONFIG_INPUT_YEALINK) += yealink.
29598 obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o
29599 obj-$(CONFIG_INPUT_UINPUT) += uinput.o
29600 obj-$(CONFIG_INPUT_GPIO_BUTTONS) += gpio_buttons.o
29601 +obj-$(CONFIG_INPUT_LIS302DL) += lis302dl.o
29602 Index: linux-2.6.24.7/drivers/input/mousedev.c
29603 ===================================================================
29604 --- linux-2.6.24.7.orig/drivers/input/mousedev.c 2008-12-11 22:46:07.000000000 +0100
29605 +++ linux-2.6.24.7/drivers/input/mousedev.c 2008-12-11 22:46:49.000000000 +0100
29606 @@ -1009,6 +1009,7 @@ static const struct input_device_id mous
29607 .evbit = { BIT_MASK(EV_KEY) | BIT_MASK(EV_REL) },
29608 .relbit = { BIT_MASK(REL_WHEEL) },
29609 }, /* A separate scrollwheel */
29610 +#if 0
29611 {
29612 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
29613 INPUT_DEVICE_ID_MATCH_KEYBIT |
29614 @@ -1018,6 +1019,7 @@ static const struct input_device_id mous
29615 .absbit = { BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) },
29616 }, /* A tablet like device, at least touch detection,
29617 two absolute axes */
29618 +#endif
29619 {
29620 .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
29621 INPUT_DEVICE_ID_MATCH_KEYBIT |
29622 Index: linux-2.6.24.7/drivers/input/touchscreen/Kconfig
29623 ===================================================================
29624 --- linux-2.6.24.7.orig/drivers/input/touchscreen/Kconfig 2008-12-11 22:46:07.000000000 +0100
29625 +++ linux-2.6.24.7/drivers/input/touchscreen/Kconfig 2008-12-11 22:46:49.000000000 +0100
29626 @@ -67,6 +67,24 @@ config TOUCHSCREEN_FUJITSU
29627 To compile this driver as a module, choose M here: the
29628 module will be called fujitsu-ts.
29629
29630 +config TOUCHSCREEN_S3C2410
29631 + tristate "Samsung S3C2410 touchscreen input driver"
29632 + depends on ARCH_S3C2410 && INPUT && INPUT_TOUCHSCREEN
29633 + select SERIO
29634 + help
29635 + Say Y here if you have the s3c2410 touchscreen.
29636 +
29637 + If unsure, say N.
29638 +
29639 + To compile this driver as a module, choose M here: the
29640 + module will be called s3c2410_ts.
29641 +
29642 +config TOUCHSCREEN_S3C2410_DEBUG
29643 + boolean "Samsung S3C2410 touchscreen debug messages"
29644 + depends on TOUCHSCREEN_S3C2410
29645 + help
29646 + Select this if you want debug messages
29647 +
29648 config TOUCHSCREEN_GUNZE
29649 tristate "Gunze AHL-51S touchscreen"
29650 select SERIO
29651 Index: linux-2.6.24.7/drivers/input/touchscreen/Makefile
29652 ===================================================================
29653 --- linux-2.6.24.7.orig/drivers/input/touchscreen/Makefile 2008-12-11 22:46:07.000000000 +0100
29654 +++ linux-2.6.24.7/drivers/input/touchscreen/Makefile 2008-12-11 22:46:49.000000000 +0100
29655 @@ -19,3 +19,4 @@ obj-$(CONFIG_TOUCHSCREEN_PENMOUNT) += pe
29656 obj-$(CONFIG_TOUCHSCREEN_TOUCHRIGHT) += touchright.o
29657 obj-$(CONFIG_TOUCHSCREEN_TOUCHWIN) += touchwin.o
29658 obj-$(CONFIG_TOUCHSCREEN_UCB1400) += ucb1400_ts.o
29659 +obj-$(CONFIG_TOUCHSCREEN_S3C2410) += s3c2410_ts.o
29660 Index: linux-2.6.24.7/drivers/input/touchscreen/s3c2410_ts.c
29661 ===================================================================
29662 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
29663 +++ linux-2.6.24.7/drivers/input/touchscreen/s3c2410_ts.c 2008-12-11 22:46:49.000000000 +0100
29664 @@ -0,0 +1,589 @@
29665 +/*
29666 + * This program is free software; you can redistribute it and/or modify
29667 + * it under the terms of the GNU General Public License as published by
29668 + * the Free Software Foundation; either version 2 of the License, or
29669 + * (at your option) any later version.
29670 + *
29671 + * This program is distributed in the hope that it will be useful,
29672 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
29673 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29674 + * GNU General Public License for more details.
29675 + *
29676 + * You should have received a copy of the GNU General Public License
29677 + * along with this program; if not, write to the Free Software
29678 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29679 + *
29680 + * Copyright (c) 2004 Arnaud Patard <arnaud.patard@rtp-net.org>
29681 + * iPAQ H1940 touchscreen support
29682 + *
29683 + * ChangeLog
29684 + *
29685 + * 2004-09-05: Herbert Pötzl <herbert@13thfloor.at>
29686 + * - added clock (de-)allocation code
29687 + *
29688 + * 2005-03-06: Arnaud Patard <arnaud.patard@rtp-net.org>
29689 + * - h1940_ -> s3c2410 (this driver is now also used on the n30
29690 + * machines :P)
29691 + * - Debug messages are now enabled with the config option
29692 + * TOUCHSCREEN_S3C2410_DEBUG
29693 + * - Changed the way the value are read
29694 + * - Input subsystem should now work
29695 + * - Use ioremap and readl/writel
29696 + *
29697 + * 2005-03-23: Arnaud Patard <arnaud.patard@rtp-net.org>
29698 + * - Make use of some undocumented features of the touchscreen
29699 + * controller
29700 + *
29701 + * 2007-05-23: Harald Welte <laforge@openmoko.org>
29702 + * - Add proper support for S32440
29703 + *
29704 + * 2008-06-18: Andy Green <andy@openmoko.com>
29705 + * - Outlier removal
29706 + */
29707 +
29708 +#include <linux/errno.h>
29709 +#include <linux/kernel.h>
29710 +#include <linux/module.h>
29711 +#include <linux/slab.h>
29712 +#include <linux/input.h>
29713 +#include <linux/init.h>
29714 +#include <linux/serio.h>
29715 +#include <linux/delay.h>
29716 +#include <linux/platform_device.h>
29717 +#include <linux/clk.h>
29718 +#include <asm/io.h>
29719 +#include <asm/irq.h>
29720 +
29721 +#include <asm/arch/regs-gpio.h>
29722 +#include <asm/arch/ts.h>
29723 +
29724 +#include <asm/plat-s3c/regs-adc.h>
29725 +
29726 +/* For ts.dev.id.version */
29727 +#define S3C2410TSVERSION 0x0101
29728 +
29729 +#define TSC_SLEEP (S3C2410_ADCTSC_PULL_UP_DISABLE | S3C2410_ADCTSC_XY_PST(0))
29730 +
29731 +#define WAIT4INT(x) (((x)<<8) | \
29732 + S3C2410_ADCTSC_YM_SEN | \
29733 + S3C2410_ADCTSC_YP_SEN | \
29734 + S3C2410_ADCTSC_XP_SEN | \
29735 + S3C2410_ADCTSC_XY_PST(3))
29736 +
29737 +#define AUTOPST (S3C2410_ADCTSC_YM_SEN | \
29738 + S3C2410_ADCTSC_YP_SEN | \
29739 + S3C2410_ADCTSC_XP_SEN | \
29740 + S3C2410_ADCTSC_AUTO_PST | \
29741 + S3C2410_ADCTSC_XY_PST(0))
29742 +
29743 +#define DEBUG_LVL KERN_DEBUG
29744 +
29745 +#define TOUCH_STANDBY_FLAG 0
29746 +#define TOUCH_PRESSED_FLAG 1
29747 +#define TOUCH_RELEASE_FLAG 2
29748 +
29749 +#define TOUCH_RELEASE_TIMEOUT (HZ >> 4)
29750 +
29751 +MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
29752 +MODULE_DESCRIPTION("s3c2410 touchscreen driver");
29753 +MODULE_LICENSE("GPL");
29754 +
29755 +/*
29756 + * Definitions & global arrays.
29757 + */
29758 +
29759 +
29760 +static char *s3c2410ts_name = "s3c2410 TouchScreen";
29761 +
29762 +/*
29763 + * Per-touchscreen data.
29764 + */
29765 +
29766 +struct s3c2410ts_sample {
29767 + int x;
29768 + int y;
29769 +};
29770 +
29771 +struct s3c2410ts {
29772 + struct input_dev *dev;
29773 + long xp;
29774 + long yp;
29775 + int count;
29776 + int shift;
29777 + int extent; /* 1 << shift */
29778 +
29779 + /* the raw sample fifo is a lightweight way to track a running average
29780 + * of all taken samples. "running average" here means that it gives
29781 + * correct average for each sample, not only at the end of block of
29782 + * samples
29783 + */
29784 + int excursion_filter_len;
29785 + struct s3c2410ts_sample *raw_sample_fifo;
29786 + int head_raw_fifo;
29787 + int tail_raw_fifo;
29788 + struct s3c2410ts_sample raw_running_avg;
29789 + int reject_threshold_vs_avg;
29790 + int flag_previous_exceeded_threshold;
29791 + int flag_first_touch_sent;
29792 +};
29793 +
29794 +static struct s3c2410ts ts;
29795 +static void __iomem *base_addr;
29796 +
29797 +static void clear_raw_fifo(void)
29798 +{
29799 + ts.head_raw_fifo = 0;
29800 + ts.tail_raw_fifo = 0;
29801 + ts.raw_running_avg.x = 0;
29802 + ts.raw_running_avg.y = 0;
29803 + ts.flag_previous_exceeded_threshold = 0;
29804 + ts.flag_first_touch_sent = TOUCH_STANDBY_FLAG;
29805 +}
29806 +
29807 +
29808 +static inline void s3c2410_ts_connect(void)
29809 +{
29810 + s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_XMON);
29811 + s3c2410_gpio_cfgpin(S3C2410_GPG13, S3C2410_GPG13_nXPON);
29812 + s3c2410_gpio_cfgpin(S3C2410_GPG14, S3C2410_GPG14_YMON);
29813 + s3c2410_gpio_cfgpin(S3C2410_GPG15, S3C2410_GPG15_nYPON);
29814 +}
29815 +
29816 +static void touch_timer_fire(unsigned long data);
29817 +static struct timer_list touch_timer =
29818 + TIMER_INITIALIZER(touch_timer_fire, 0, 0);
29819 +
29820 +static void touch_timer_fire(unsigned long data)
29821 +{
29822 + unsigned long data0;
29823 + unsigned long data1;
29824 + int updown;
29825 +
29826 + data0 = readl(base_addr + S3C2410_ADCDAT0);
29827 + data1 = readl(base_addr + S3C2410_ADCDAT1);
29828 +
29829 + updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) &&
29830 + (!(data1 & S3C2410_ADCDAT0_UPDOWN));
29831 +
29832 + if ( updown && ts.flag_first_touch_sent == TOUCH_RELEASE_FLAG ) {
29833 + ts.flag_first_touch_sent = TOUCH_PRESSED_FLAG;
29834 + }
29835 +
29836 + if (updown) {
29837 + if (ts.count != 0) {
29838 + ts.xp >>= ts.shift;
29839 + ts.yp >>= ts.shift;
29840 +
29841 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
29842 + {
29843 + struct timeval tv;
29844 +
29845 + do_gettimeofday(&tv);
29846 + printk(DEBUG_LVL "T:%06d, X:%03ld, Y:%03ld\n",
29847 + (int)tv.tv_usec, ts.xp, ts.yp);
29848 + }
29849 +#endif
29850 +
29851 + input_report_abs(ts.dev, ABS_X, ts.xp);
29852 + input_report_abs(ts.dev, ABS_Y, ts.yp);
29853 +
29854 + input_report_key(ts.dev, BTN_TOUCH, 1);
29855 + input_report_abs(ts.dev, ABS_PRESSURE, 1);
29856 + input_sync(ts.dev);
29857 + ts.flag_first_touch_sent = TOUCH_PRESSED_FLAG;
29858 + }
29859 +
29860 + ts.xp = 0;
29861 + ts.yp = 0;
29862 + ts.count = 0;
29863 +
29864 + writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST,
29865 + base_addr+S3C2410_ADCTSC);
29866 + writel(readl(base_addr+S3C2410_ADCCON) |
29867 + S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
29868 + } else {
29869 + ts.count = 0;
29870 +
29871 + if ( ts.flag_first_touch_sent == TOUCH_RELEASE_FLAG ) {
29872 + input_report_key(ts.dev, BTN_TOUCH, 0);
29873 + input_report_abs(ts.dev, ABS_PRESSURE, 0);
29874 + input_sync(ts.dev);
29875 + ts.flag_first_touch_sent = TOUCH_STANDBY_FLAG;
29876 + } if ( ts.flag_first_touch_sent == TOUCH_PRESSED_FLAG ) {
29877 + ts.flag_first_touch_sent = TOUCH_RELEASE_FLAG;
29878 + mod_timer(&touch_timer, jiffies + TOUCH_RELEASE_TIMEOUT);
29879 + }
29880 +
29881 + writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
29882 + }
29883 +}
29884 +
29885 +static irqreturn_t stylus_updown(int irq, void *dev_id)
29886 +{
29887 + unsigned long data0;
29888 + unsigned long data1;
29889 + int updown;
29890 +
29891 + data0 = readl(base_addr+S3C2410_ADCDAT0);
29892 + data1 = readl(base_addr+S3C2410_ADCDAT1);
29893 +
29894 + updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) &&
29895 + (!(data1 & S3C2410_ADCDAT0_UPDOWN));
29896 +
29897 + /* TODO we should never get an interrupt with updown set while
29898 + * the timer is running, but maybe we ought to verify that the
29899 + * timer isn't running anyways. */
29900 +
29901 + if (updown)
29902 + touch_timer_fire(0);
29903 +
29904 + return IRQ_HANDLED;
29905 +}
29906 +
29907 +
29908 +static irqreturn_t stylus_action(int irq, void *dev_id)
29909 +{
29910 + unsigned long x;
29911 + unsigned long y;
29912 + int length = (ts.head_raw_fifo - ts.tail_raw_fifo) & (ts.extent - 1);
29913 + int scaled_avg_x;
29914 + int scaled_avg_y;
29915 +
29916 + x = readl(base_addr + S3C2410_ADCDAT0) & S3C2410_ADCDAT0_XPDATA_MASK;
29917 + y = readl(base_addr + S3C2410_ADCDAT1) & S3C2410_ADCDAT1_YPDATA_MASK;
29918 +
29919 + if (!length)
29920 + goto store_sample;
29921 +
29922 + scaled_avg_x = ts.raw_running_avg.x / length;
29923 + scaled_avg_y = ts.raw_running_avg.y / length;
29924 +
29925 + /* we appear to accept every sample into both the running average FIFO
29926 + * and the summing average. BUT, if the last sample crossed a
29927 + * machine-set threshold, each time we do a beauty contest
29928 + * on the new sample comparing if it is closer to the running
29929 + * average and the previous sample. If it is closer to the previous
29930 + * suspicious sample, we assume the change is real and accept both
29931 + * if the new sample has returned to being closer to the average than
29932 + * the previous sample, we take the previous sample as an excursion
29933 + * and overwrite it in both the running average and summing average.
29934 + */
29935 +
29936 + if (ts.flag_previous_exceeded_threshold)
29937 + /* new one closer to "nonconformist" previous, or average?
29938 + * Pythagoras? Who? Don't need it because large excursion
29939 + * will be accounted for correctly this way
29940 + */
29941 + if ((abs(x - scaled_avg_x) + abs(y - scaled_avg_y)) <
29942 + (abs(x - ts.raw_sample_fifo[(ts.head_raw_fifo - 1) &
29943 + (ts.extent - 1)].x) +
29944 + abs(y - ts.raw_sample_fifo[(ts.head_raw_fifo - 1) &
29945 + (ts.extent - 1)].y))) {
29946 + /* it's closer to average, reject previous as a one-
29947 + * shot excursion, by overwriting it
29948 + */
29949 + ts.xp += x - ts.raw_sample_fifo[(ts.head_raw_fifo - 1) &
29950 + (ts.extent - 1)].x;
29951 + ts.yp += y - ts.raw_sample_fifo[(ts.head_raw_fifo - 1) &
29952 + (ts.extent - 1)].y;
29953 + ts.raw_sample_fifo[(ts.head_raw_fifo - 1) &
29954 + (ts.extent - 1)].x = x;
29955 + ts.raw_sample_fifo[(ts.head_raw_fifo - 1) &
29956 + (ts.extent - 1)].y = y;
29957 + /* no new sample: replaced previous, so we are done */
29958 + goto completed;
29959 + }
29960 + /* else it was closer to nonconformist previous: it's likely
29961 + * a genuine consistent move then.
29962 + * Keep previous and add new guy.
29963 + */
29964 +
29965 + if ((x >= scaled_avg_x - ts.reject_threshold_vs_avg) &&
29966 + (x <= scaled_avg_x + ts.reject_threshold_vs_avg) &&
29967 + (y >= scaled_avg_y - ts.reject_threshold_vs_avg) &&
29968 + (y <= scaled_avg_y + ts.reject_threshold_vs_avg))
29969 + ts.flag_previous_exceeded_threshold = 0;
29970 + else
29971 + ts.flag_previous_exceeded_threshold = 1;
29972 +
29973 +store_sample:
29974 + ts.xp += x;
29975 + ts.yp += y;
29976 + ts.count++;
29977 +
29978 + /* remove oldest sample from avg when we have full pipeline */
29979 + if (((ts.head_raw_fifo + 1) & (ts.extent - 1)) == ts.tail_raw_fifo) {
29980 + ts.raw_running_avg.x -= ts.raw_sample_fifo[ts.tail_raw_fifo].x;
29981 + ts.raw_running_avg.y -= ts.raw_sample_fifo[ts.tail_raw_fifo].y;
29982 + ts.tail_raw_fifo = (ts.tail_raw_fifo + 1) & (ts.extent - 1);
29983 + }
29984 + /* always add current sample to fifo and average */
29985 + ts.raw_sample_fifo[ts.head_raw_fifo].x = x;
29986 + ts.raw_sample_fifo[ts.head_raw_fifo].y = y;
29987 + ts.raw_running_avg.x += x;
29988 + ts.raw_running_avg.y += y;
29989 + ts.head_raw_fifo = (ts.head_raw_fifo + 1) & (ts.extent - 1);
29990 +
29991 +completed:
29992 + if (ts.count >= (1 << ts.shift)) {
29993 + mod_timer(&touch_timer, jiffies + 1);
29994 + writel(WAIT4INT(1), base_addr+S3C2410_ADCTSC);
29995 + goto bail;
29996 + }
29997 +
29998 + writel(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST,
29999 + base_addr+S3C2410_ADCTSC);
30000 + writel(readl(base_addr+S3C2410_ADCCON) |
30001 + S3C2410_ADCCON_ENABLE_START, base_addr+S3C2410_ADCCON);
30002 +
30003 +bail:
30004 + return IRQ_HANDLED;
30005 +}
30006 +
30007 +static struct clk *adc_clock;
30008 +
30009 +/*
30010 + * The functions for inserting/removing us as a module.
30011 + */
30012 +
30013 +static int __init s3c2410ts_probe(struct platform_device *pdev)
30014 +{
30015 + int rc;
30016 + struct s3c2410_ts_mach_info *info;
30017 + struct input_dev *input_dev;
30018 +
30019 + info = (struct s3c2410_ts_mach_info *)pdev->dev.platform_data;
30020 +
30021 + if (!info)
30022 + {
30023 + dev_err(&pdev->dev, "Hm... too bad: no platform data for ts\n");
30024 + return -EINVAL;
30025 + }
30026 +
30027 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
30028 + printk(DEBUG_LVL "Entering s3c2410ts_init\n");
30029 +#endif
30030 +
30031 + adc_clock = clk_get(NULL, "adc");
30032 + if (!adc_clock) {
30033 + dev_err(&pdev->dev, "failed to get adc clock source\n");
30034 + return -ENOENT;
30035 + }
30036 + clk_enable(adc_clock);
30037 +
30038 +#ifdef CONFIG_TOUCHSCREEN_S3C2410_DEBUG
30039 + printk(DEBUG_LVL "got and enabled clock\n");
30040 +#endif
30041 +
30042 + base_addr = ioremap(S3C2410_PA_ADC,0x20);
30043 + if (base_addr == NULL) {
30044 + dev_err(&pdev->dev, "Failed to remap register block\n");
30045 + return -ENOMEM;
30046 + }
30047 +
30048 +
30049 + /* If we acutally are a S3C2410: Configure GPIOs */
30050 + if (!strcmp(pdev->name, "s3c2410-ts"))
30051 + s3c2410_ts_connect();
30052 +
30053 + if ((info->presc & 0xff) > 0)
30054 + writel(S3C2410_ADCCON_PRSCEN |
30055 + S3C2410_ADCCON_PRSCVL(info->presc&0xFF),
30056 + base_addr + S3C2410_ADCCON);
30057 + else
30058 + writel(0, base_addr+S3C2410_ADCCON);
30059 +
30060 +
30061 + /* Initialise registers */
30062 + if ((info->delay & 0xffff) > 0)
30063 + writel(info->delay & 0xffff, base_addr + S3C2410_ADCDLY);
30064 +
30065 + writel(WAIT4INT(0), base_addr + S3C2410_ADCTSC);
30066 +
30067 + /* Initialise input stuff */
30068 + memset(&ts, 0, sizeof(struct s3c2410ts));
30069 + input_dev = input_allocate_device();
30070 +
30071 + if (!input_dev) {
30072 + dev_err(&pdev->dev, "Unable to allocate the input device\n");
30073 + return -ENOMEM;
30074 + }
30075 +
30076 + ts.dev = input_dev;
30077 + ts.dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) |
30078 + BIT_MASK(EV_ABS);
30079 + ts.dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
30080 + input_set_abs_params(ts.dev, ABS_X, 0, 0x3FF, 0, 0);
30081 + input_set_abs_params(ts.dev, ABS_Y, 0, 0x3FF, 0, 0);
30082 + input_set_abs_params(ts.dev, ABS_PRESSURE, 0, 1, 0, 0);
30083 +
30084 + ts.dev->private = &ts;
30085 + ts.dev->name = s3c2410ts_name;
30086 + ts.dev->id.bustype = BUS_RS232;
30087 + ts.dev->id.vendor = 0xDEAD;
30088 + ts.dev->id.product = 0xBEEF;
30089 + ts.dev->id.version = S3C2410TSVERSION;
30090 +
30091 + ts.shift = info->oversampling_shift;
30092 + ts.extent = 1 << info->oversampling_shift;
30093 + ts.reject_threshold_vs_avg = info->reject_threshold_vs_avg;
30094 + ts.excursion_filter_len = 1 << info->excursion_filter_len_bits;
30095 +
30096 + ts.raw_sample_fifo = kmalloc(sizeof(struct s3c2410ts_sample) *
30097 + ts.excursion_filter_len, GFP_KERNEL);
30098 + clear_raw_fifo();
30099 +
30100 + /* Get irqs */
30101 + if (request_irq(IRQ_ADC, stylus_action, IRQF_SAMPLE_RANDOM,
30102 + "s3c2410_action", ts.dev)) {
30103 + dev_err(&pdev->dev, "Could not allocate ts IRQ_ADC !\n");
30104 + iounmap(base_addr);
30105 + return -EIO;
30106 + }
30107 + if (request_irq(IRQ_TC, stylus_updown, IRQF_SAMPLE_RANDOM,
30108 + "s3c2410_action", ts.dev)) {
30109 + dev_err(&pdev->dev, "Could not allocate ts IRQ_TC !\n");
30110 + free_irq(IRQ_ADC, ts.dev);
30111 + iounmap(base_addr);
30112 + return -EIO;
30113 + }
30114 +
30115 + dev_info(&pdev->dev, "successfully loaded\n");
30116 +
30117 + /* All went ok, so register to the input system */
30118 + rc = input_register_device(ts.dev);
30119 + if (rc) {
30120 + free_irq(IRQ_TC, ts.dev);
30121 + free_irq(IRQ_ADC, ts.dev);
30122 + clk_disable(adc_clock);
30123 + iounmap(base_addr);
30124 + return -EIO;
30125 + }
30126 +
30127 + return 0;
30128 +}
30129 +
30130 +static int s3c2410ts_remove(struct platform_device *pdev)
30131 +{
30132 + disable_irq(IRQ_ADC);
30133 + disable_irq(IRQ_TC);
30134 + free_irq(IRQ_TC,ts.dev);
30135 + free_irq(IRQ_ADC,ts.dev);
30136 +
30137 + if (adc_clock) {
30138 + clk_disable(adc_clock);
30139 + clk_put(adc_clock);
30140 + adc_clock = NULL;
30141 + }
30142 +
30143 + kfree(ts.raw_sample_fifo);
30144 +
30145 + input_unregister_device(ts.dev);
30146 + iounmap(base_addr);
30147 +
30148 + return 0;
30149 +}
30150 +
30151 +#ifdef CONFIG_PM
30152 +static int s3c2410ts_suspend(struct platform_device *pdev, pm_message_t state)
30153 +{
30154 + writel(TSC_SLEEP, base_addr+S3C2410_ADCTSC);
30155 + writel(readl(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_STDBM,
30156 + base_addr+S3C2410_ADCCON);
30157 +
30158 + disable_irq(IRQ_ADC);
30159 + disable_irq(IRQ_TC);
30160 +
30161 + clk_disable(adc_clock);
30162 +
30163 + return 0;
30164 +}
30165 +
30166 +static int s3c2410ts_resume(struct platform_device *pdev)
30167 +{
30168 + struct s3c2410_ts_mach_info *info =
30169 + ( struct s3c2410_ts_mach_info *)pdev->dev.platform_data;
30170 +
30171 + clk_enable(adc_clock);
30172 + mdelay(1);
30173 +
30174 + clear_raw_fifo();
30175 +
30176 + enable_irq(IRQ_ADC);
30177 + enable_irq(IRQ_TC);
30178 +
30179 + if ((info->presc&0xff) > 0)
30180 + writel(S3C2410_ADCCON_PRSCEN |
30181 + S3C2410_ADCCON_PRSCVL(info->presc&0xFF),
30182 + base_addr+S3C2410_ADCCON);
30183 + else
30184 + writel(0,base_addr+S3C2410_ADCCON);
30185 +
30186 + /* Initialise registers */
30187 + if ((info->delay & 0xffff) > 0)
30188 + writel(info->delay & 0xffff, base_addr+S3C2410_ADCDLY);
30189 +
30190 + writel(WAIT4INT(0), base_addr+S3C2410_ADCTSC);
30191 +
30192 + return 0;
30193 +}
30194 +
30195 +#else
30196 +#define s3c2410ts_suspend NULL
30197 +#define s3c2410ts_resume NULL
30198 +#endif
30199 +
30200 +static struct platform_driver s3c2410ts_driver = {
30201 + .driver = {
30202 + .name = "s3c2410-ts",
30203 + .owner = THIS_MODULE,
30204 + },
30205 + .probe = s3c2410ts_probe,
30206 + .remove = s3c2410ts_remove,
30207 + .suspend = s3c2410ts_suspend,
30208 + .resume = s3c2410ts_resume,
30209 +
30210 +};
30211 +
30212 +static struct platform_driver s3c2440ts_driver = {
30213 + .driver = {
30214 + .name = "s3c2440-ts",
30215 + .owner = THIS_MODULE,
30216 + },
30217 + .probe = s3c2410ts_probe,
30218 + .remove = s3c2410ts_remove,
30219 + .suspend = s3c2410ts_suspend,
30220 + .resume = s3c2410ts_resume,
30221 +
30222 +};
30223 +
30224 +static int __init s3c2410ts_init(void)
30225 +{
30226 + int rc;
30227 +
30228 + rc = platform_driver_register(&s3c2410ts_driver);
30229 + if (rc < 0)
30230 + return rc;
30231 +
30232 + rc = platform_driver_register(&s3c2440ts_driver);
30233 + if (rc < 0)
30234 + platform_driver_unregister(&s3c2410ts_driver);
30235 +
30236 + return rc;
30237 +}
30238 +
30239 +static void __exit s3c2410ts_exit(void)
30240 +{
30241 + platform_driver_unregister(&s3c2440ts_driver);
30242 + platform_driver_unregister(&s3c2410ts_driver);
30243 +}
30244 +
30245 +module_init(s3c2410ts_init);
30246 +module_exit(s3c2410ts_exit);
30247 +
30248 +/*
30249 + Local variables:
30250 + compile-command: "make ARCH=arm CROSS_COMPILE=/usr/local/arm/3.3.2/bin/arm-linux- -k -C ../../.."
30251 + c-basic-offset: 8
30252 + End:
30253 +*/
30254 Index: linux-2.6.24.7/drivers/Kconfig
30255 ===================================================================
30256 --- linux-2.6.24.7.orig/drivers/Kconfig 2008-12-11 22:46:07.000000000 +0100
30257 +++ linux-2.6.24.7/drivers/Kconfig 2008-12-11 22:46:49.000000000 +0100
30258 @@ -74,6 +74,8 @@ source "drivers/hid/Kconfig"
30259
30260 source "drivers/usb/Kconfig"
30261
30262 +source "drivers/sdio/Kconfig"
30263 +
30264 source "drivers/mmc/Kconfig"
30265
30266 source "drivers/leds/Kconfig"
30267 Index: linux-2.6.24.7/drivers/leds/Kconfig
30268 ===================================================================
30269 --- linux-2.6.24.7.orig/drivers/leds/Kconfig 2008-12-11 22:46:09.000000000 +0100
30270 +++ linux-2.6.24.7/drivers/leds/Kconfig 2008-12-11 22:46:49.000000000 +0100
30271 @@ -57,7 +57,7 @@ config LEDS_TOSA
30272
30273 config LEDS_S3C24XX
30274 tristate "LED Support for Samsung S3C24XX GPIO LEDs"
30275 - depends on LEDS_CLASS && ARCH_S3C2410
30276 + depends on LEDS_CLASS && ARCH_S3C2410 && S3C2410_PWM
30277 help
30278 This option enables support for LEDs connected to GPIO lines
30279 on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440.
30280 @@ -120,6 +120,19 @@ config LEDS_CM_X270
30281 help
30282 This option enables support for the CM-X270 LEDs.
30283
30284 +config LEDS_NEO1973_VIBRATOR
30285 + tristate "Vibrator Support for the FIC Neo1973 GSM phone"
30286 + depends on LEDS_CLASS && MACH_NEO1973
30287 + select S3C2440_C_FIQ
30288 + help
30289 + This option enables support for the vibrator on the FIC Neo1973.
30290 +
30291 +config LEDS_NEO1973_GTA02
30292 + tristate "LED Support for the FIC Neo1973 (GTA02)"
30293 + depends on LEDS_CLASS && MACH_NEO1973_GTA02
30294 + help
30295 + This option enables support for the LEDs on the FIC Neo1973.
30296 +
30297 comment "LED Triggers"
30298
30299 config LEDS_TRIGGERS
30300 Index: linux-2.6.24.7/drivers/leds/leds-neo1973-gta02.c
30301 ===================================================================
30302 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
30303 +++ linux-2.6.24.7/drivers/leds/leds-neo1973-gta02.c 2008-12-11 22:46:49.000000000 +0100
30304 @@ -0,0 +1,231 @@
30305 +/*
30306 + * LED driver for the FIC Neo1973 GTA02 GSM phone
30307 + *
30308 + * (C) 2006-2007 by Openmoko, Inc.
30309 + * Author: Harald Welte <laforge@openmoko.org>
30310 + * All rights reserved.
30311 + *
30312 + * This program is free software; you can redistribute it and/or modify
30313 + * it under the terms of the GNU General Public License version 2 as
30314 + * published by the Free Software Foundation.
30315 + *
30316 + */
30317 +
30318 +#include <linux/kernel.h>
30319 +#include <linux/init.h>
30320 +#include <linux/platform_device.h>
30321 +#include <linux/leds.h>
30322 +#include <asm/hardware.h>
30323 +#include <asm/mach-types.h>
30324 +#include <asm/arch/pwm.h>
30325 +#include <asm/arch/gta02.h>
30326 +#include <asm/plat-s3c/regs-timer.h>
30327 +#include <asm/plat-s3c24xx/neo1973.h>
30328 +
30329 +#define MAX_LEDS 3
30330 +#define COUNTER 256
30331 +
30332 +struct gta02_led_priv
30333 +{
30334 + spinlock_t lock;
30335 + struct led_classdev cdev;
30336 + struct s3c2410_pwm pwm;
30337 + unsigned int gpio;
30338 + unsigned int has_pwm;
30339 +};
30340 +
30341 +struct gta02_led_bundle
30342 +{
30343 + int num_leds;
30344 + struct gta02_led_priv led[MAX_LEDS];
30345 +};
30346 +
30347 +static inline struct gta02_led_priv *to_priv(struct led_classdev *led_cdev)
30348 +{
30349 + return container_of(led_cdev, struct gta02_led_priv, cdev);
30350 +}
30351 +
30352 +static inline struct gta02_led_bundle *to_bundle(struct led_classdev *led_cdev)
30353 +{
30354 + return dev_get_drvdata(led_cdev->dev->parent);
30355 +}
30356 +
30357 +static void gta02led_set(struct led_classdev *led_cdev,
30358 + enum led_brightness value)
30359 +{
30360 + unsigned long flags;
30361 + struct gta02_led_priv *lp = to_priv(led_cdev);
30362 +
30363 + /*
30364 + * value == 255 -> 99% duty cycle (full power)
30365 + * value == 128 -> 50% duty cycle (medium power)
30366 + * value == 0 -> 0% duty cycle (zero power)
30367 + */
30368 + spin_lock_irqsave(&lp->lock, flags);
30369 +
30370 + if (lp->has_pwm) {
30371 + s3c2410_pwm_duty_cycle(value, &lp->pwm);
30372 + } else {
30373 + neo1973_gpb_setpin(lp->gpio, value ? 1 : 0);
30374 + }
30375 +
30376 + spin_unlock_irqrestore(&lp->lock, flags);
30377 +}
30378 +
30379 +#ifdef CONFIG_PM
30380 +static int gta02led_suspend(struct platform_device *pdev, pm_message_t state)
30381 +{
30382 + struct gta02_led_bundle *bundle = platform_get_drvdata(pdev);
30383 + int i;
30384 +
30385 + for (i = 0; i < bundle->num_leds; i++)
30386 + led_classdev_suspend(&bundle->led[i].cdev);
30387 +
30388 + return 0;
30389 +}
30390 +
30391 +static int gta02led_resume(struct platform_device *pdev)
30392 +{
30393 + struct gta02_led_bundle *bundle = platform_get_drvdata(pdev);
30394 + int i;
30395 +
30396 + for (i = 0; i < bundle->num_leds; i++)
30397 + led_classdev_resume(&bundle->led[i].cdev);
30398 +
30399 + return 0;
30400 +}
30401 +#endif
30402 +
30403 +static int __init gta02led_probe(struct platform_device *pdev)
30404 +{
30405 + int i, rc;
30406 + struct gta02_led_bundle *bundle;
30407 +
30408 + if (!machine_is_neo1973_gta02())
30409 + return -EIO;
30410 +
30411 + bundle = kzalloc(sizeof(struct gta02_led_bundle), GFP_KERNEL);
30412 + if (!bundle)
30413 + return -ENOMEM;
30414 + platform_set_drvdata(pdev, bundle);
30415 +
30416 + for (i = 0; i < pdev->num_resources; i++) {
30417 + struct gta02_led_priv *lp;
30418 + struct resource *r;
30419 +
30420 + if (i >= MAX_LEDS)
30421 + break;
30422 +
30423 + r = platform_get_resource(pdev, 0, i);
30424 + if (!r || !r->start || !r->name)
30425 + continue;
30426 +
30427 + lp = &bundle->led[i];
30428 +
30429 + lp->gpio = r->start;
30430 + lp->cdev.name = r->name;
30431 + lp->cdev.brightness_set = gta02led_set;
30432 +
30433 + switch (lp->gpio) {
30434 + case S3C2410_GPB0:
30435 + lp->has_pwm = 1;
30436 + lp->pwm.timerid = PWM0;
30437 + s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPB0_TOUT0);
30438 + break;
30439 + case S3C2410_GPB1:
30440 + lp->has_pwm = 1;
30441 + lp->pwm.timerid = PWM1;
30442 + s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPB1_TOUT1);
30443 + break;
30444 + case S3C2410_GPB2:
30445 + lp->has_pwm = 1;
30446 + lp->pwm.timerid = PWM2;
30447 + s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPB2_TOUT2);
30448 + break;
30449 + case S3C2410_GPB3:
30450 + lp->has_pwm = 1;
30451 + lp->pwm.timerid = PWM3;
30452 + s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPB3_TOUT3);
30453 + break;
30454 + default:
30455 + break;
30456 + }
30457 +
30458 + lp->pwm.prescaler = 0;
30459 + lp->pwm.divider = S3C2410_TCFG1_MUX3_DIV8;
30460 + lp->pwm.counter = COUNTER;
30461 + lp->pwm.comparer = COUNTER;
30462 + s3c2410_pwm_enable(&lp->pwm);
30463 + s3c2410_pwm_start(&lp->pwm);
30464 +
30465 + switch (lp->gpio) {
30466 + case S3C2410_GPB0:
30467 + case S3C2410_GPB1:
30468 + case S3C2410_GPB2:
30469 + case S3C2410_GPB3:
30470 + lp->has_pwm = 0;
30471 + s3c2410_gpio_cfgpin(lp->gpio, S3C2410_GPIO_OUTPUT);
30472 + neo1973_gpb_add_shadow_gpio(lp->gpio);
30473 + break;
30474 + default:
30475 + break;
30476 + }
30477 +
30478 + spin_lock_init(&lp->lock);
30479 + rc = led_classdev_register(&pdev->dev, &lp->cdev);
30480 + }
30481 +
30482 + bundle->num_leds = i;
30483 +
30484 + return 0;
30485 +}
30486 +
30487 +static int gta02led_remove(struct platform_device *pdev)
30488 +{
30489 + struct gta02_led_bundle *bundle = platform_get_drvdata(pdev);
30490 + int i;
30491 +
30492 + for (i = 0; i < bundle->num_leds; i++) {
30493 + struct gta02_led_priv *lp = &bundle->led[i];
30494 + if (lp->has_pwm)
30495 + s3c2410_pwm_disable(&lp->pwm);
30496 + else
30497 + gta02led_set(&lp->cdev, 0);
30498 +
30499 + led_classdev_unregister(&lp->cdev);
30500 + }
30501 +
30502 + platform_set_drvdata(pdev, NULL);
30503 + kfree(bundle);
30504 +
30505 + return 0;
30506 +}
30507 +
30508 +static struct platform_driver gta02led_driver = {
30509 + .probe = gta02led_probe,
30510 + .remove = gta02led_remove,
30511 +#ifdef CONFIG_PM
30512 + .suspend = gta02led_suspend,
30513 + .resume = gta02led_resume,
30514 +#endif
30515 + .driver = {
30516 + .name = "gta02-led",
30517 + },
30518 +};
30519 +
30520 +static int __init gta02led_init(void)
30521 +{
30522 + return platform_driver_register(&gta02led_driver);
30523 +}
30524 +
30525 +static void __exit gta02led_exit(void)
30526 +{
30527 + platform_driver_unregister(&gta02led_driver);
30528 +}
30529 +
30530 +module_init(gta02led_init);
30531 +module_exit(gta02led_exit);
30532 +
30533 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
30534 +MODULE_DESCRIPTION("FIC Neo1973 GTA02 LED driver");
30535 +MODULE_LICENSE("GPL");
30536 Index: linux-2.6.24.7/drivers/leds/leds-neo1973-vibrator.c
30537 ===================================================================
30538 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
30539 +++ linux-2.6.24.7/drivers/leds/leds-neo1973-vibrator.c 2008-12-11 22:46:49.000000000 +0100
30540 @@ -0,0 +1,202 @@
30541 +/*
30542 + * LED driver for the vibrator of the FIC Neo1973 GSM Phone
30543 + *
30544 + * (C) 2006-2007 by Openmoko, Inc.
30545 + * Author: Harald Welte <laforge@openmoko.org>
30546 + * All rights reserved.
30547 + *
30548 + * This program is free software; you can redistribute it and/or modify
30549 + * it under the terms of the GNU General Public License version 2 as
30550 + * published by the Free Software Foundation.
30551 + *
30552 + * Javi Roman <javiroman@kernel-labs.org>:
30553 + * Implement PWM support for GTA01Bv4 and later
30554 + */
30555 +
30556 +#include <linux/kernel.h>
30557 +#include <linux/init.h>
30558 +#include <linux/platform_device.h>
30559 +#include <linux/leds.h>
30560 +#include <asm/hardware.h>
30561 +#include <asm/mach-types.h>
30562 +#include <asm/arch/pwm.h>
30563 +#include <asm/arch/gta01.h>
30564 +#include <asm/plat-s3c/regs-timer.h>
30565 +
30566 +#include <asm/arch-s3c2410/fiq_ipc_gta02.h>
30567 +#include <asm/plat-s3c24xx/neo1973.h>
30568 +
30569 +#define COUNTER 64
30570 +
30571 +struct neo1973_vib_priv {
30572 + struct led_classdev cdev;
30573 + unsigned int gpio;
30574 + struct mutex mutex;
30575 + unsigned int has_pwm;
30576 + struct s3c2410_pwm pwm;
30577 +};
30578 +
30579 +static void neo1973_vib_vib_set(struct led_classdev *led_cdev,
30580 + enum led_brightness value)
30581 +{
30582 + struct neo1973_vib_priv *vp =
30583 + container_of(led_cdev, struct neo1973_vib_priv, cdev);
30584 +
30585 + if (machine_is_neo1973_gta02()) { /* use FIQ to control GPIO */
30586 + fiq_ipc.vib_pwm = value; /* set it for FIQ */
30587 + fiq_kick(); /* start up FIQs if not already going */
30588 + return;
30589 + }
30590 + /*
30591 + * value == 255 -> 99% duty cycle (full power)
30592 + * value == 128 -> 50% duty cycle (medium power)
30593 + * value == 0 -> 0% duty cycle (zero power)
30594 + */
30595 + mutex_lock(&vp->mutex);
30596 + if (vp->has_pwm)
30597 + s3c2410_pwm_duty_cycle(value / 4, &vp->pwm);
30598 + else {
30599 + if (value)
30600 + neo1973_gpb_setpin(vp->gpio, 1);
30601 + else
30602 + neo1973_gpb_setpin(vp->gpio, 0);
30603 + }
30604 +
30605 + mutex_unlock(&vp->mutex);
30606 +}
30607 +
30608 +static struct neo1973_vib_priv neo1973_vib_led = {
30609 + .cdev = {
30610 + .name = "neo1973:vibrator",
30611 + .brightness_set = neo1973_vib_vib_set,
30612 + },
30613 +};
30614 +
30615 +static int neo1973_vib_init_hw(struct neo1973_vib_priv *vp)
30616 +{
30617 + int rc;
30618 +
30619 + rc = s3c2410_pwm_init(&vp->pwm);
30620 + if (rc)
30621 + return rc;
30622 +
30623 + vp->pwm.timerid = PWM3;
30624 + /* use same prescaler as arch/arm/plat-s3c24xx/time.c */
30625 + vp->pwm.prescaler = (6 - 1) / 2;
30626 + vp->pwm.divider = S3C2410_TCFG1_MUX3_DIV2;
30627 + vp->pwm.counter = COUNTER;
30628 + vp->pwm.comparer = COUNTER;
30629 +
30630 + rc = s3c2410_pwm_enable(&vp->pwm);
30631 + if (rc)
30632 + return rc;
30633 +
30634 + s3c2410_pwm_start(&vp->pwm);
30635 +
30636 + return 0;
30637 +}
30638 +
30639 +#ifdef CONFIG_PM
30640 +static int neo1973_vib_suspend(struct platform_device *dev, pm_message_t state)
30641 +{
30642 + led_classdev_suspend(&neo1973_vib_led.cdev);
30643 + return 0;
30644 +}
30645 +
30646 +static int neo1973_vib_resume(struct platform_device *dev)
30647 +{
30648 + struct neo1973_vib_priv *vp = platform_get_drvdata(dev);
30649 +
30650 + if (vp->has_pwm)
30651 + neo1973_vib_init_hw(vp);
30652 +
30653 + led_classdev_resume(&neo1973_vib_led.cdev);
30654 +
30655 + return 0;
30656 +}
30657 +#endif /* CONFIG_PM */
30658 +
30659 +static int __init neo1973_vib_probe(struct platform_device *pdev)
30660 +{
30661 + struct resource *r;
30662 + int rc;
30663 +
30664 + if (!machine_is_neo1973_gta01() && !machine_is_neo1973_gta02())
30665 + return -EIO;
30666 +
30667 + r = platform_get_resource(pdev, 0, 0);
30668 + if (!r || !r->start)
30669 + return -EIO;
30670 +
30671 + neo1973_vib_led.gpio = r->start;
30672 + platform_set_drvdata(pdev, &neo1973_vib_led);
30673 +
30674 + if (machine_is_neo1973_gta02()) { /* use FIQ to control GPIO */
30675 + neo1973_gpb_setpin(neo1973_vib_led.gpio, 0); /* off */
30676 + s3c2410_gpio_cfgpin(neo1973_vib_led.gpio, S3C2410_GPIO_OUTPUT);
30677 + /* safe, kmalloc'd copy needed for FIQ ISR */
30678 + fiq_ipc.vib_gpio_pin = neo1973_vib_led.gpio;
30679 + fiq_ipc.vib_pwm = 0; /* off */
30680 + goto configured;
30681 + }
30682 +
30683 + /* TOUT3 */
30684 + if (neo1973_vib_led.gpio == S3C2410_GPB3) {
30685 + rc = neo1973_vib_init_hw(&neo1973_vib_led);
30686 + if (rc)
30687 + return rc;
30688 +
30689 + s3c2410_pwm_duty_cycle(0, &neo1973_vib_led.pwm);
30690 + s3c2410_gpio_cfgpin(neo1973_vib_led.gpio, S3C2410_GPB3_TOUT3);
30691 + neo1973_vib_led.has_pwm = 1;
30692 + }
30693 +configured:
30694 + mutex_init(&neo1973_vib_led.mutex);
30695 +
30696 + return led_classdev_register(&pdev->dev, &neo1973_vib_led.cdev);
30697 +}
30698 +
30699 +static int neo1973_vib_remove(struct platform_device *pdev)
30700 +{
30701 + if (machine_is_neo1973_gta02()) /* use FIQ to control GPIO */
30702 + fiq_ipc.vib_pwm = 0; /* off */
30703 + /* would only need kick if already off so no kick needed */
30704 +
30705 + if (neo1973_vib_led.has_pwm)
30706 + s3c2410_pwm_disable(&neo1973_vib_led.pwm);
30707 +
30708 + led_classdev_unregister(&neo1973_vib_led.cdev);
30709 +
30710 + mutex_destroy(&neo1973_vib_led.mutex);
30711 +
30712 + return 0;
30713 +}
30714 +
30715 +static struct platform_driver neo1973_vib_driver = {
30716 + .probe = neo1973_vib_probe,
30717 + .remove = neo1973_vib_remove,
30718 +#ifdef CONFIG_PM
30719 + .suspend = neo1973_vib_suspend,
30720 + .resume = neo1973_vib_resume,
30721 +#endif
30722 + .driver = {
30723 + .name = "neo1973-vibrator",
30724 + },
30725 +};
30726 +
30727 +static int __init neo1973_vib_init(void)
30728 +{
30729 + return platform_driver_register(&neo1973_vib_driver);
30730 +}
30731 +
30732 +static void __exit neo1973_vib_exit(void)
30733 +{
30734 + platform_driver_unregister(&neo1973_vib_driver);
30735 +}
30736 +
30737 +module_init(neo1973_vib_init);
30738 +module_exit(neo1973_vib_exit);
30739 +
30740 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
30741 +MODULE_DESCRIPTION("FIC Neo1973 vibrator driver");
30742 +MODULE_LICENSE("GPL");
30743 Index: linux-2.6.24.7/drivers/leds/Makefile
30744 ===================================================================
30745 --- linux-2.6.24.7.orig/drivers/leds/Makefile 2008-12-11 22:46:09.000000000 +0100
30746 +++ linux-2.6.24.7/drivers/leds/Makefile 2008-12-11 22:46:49.000000000 +0100
30747 @@ -20,6 +20,8 @@ obj-$(CONFIG_LEDS_COBALT_QUBE) += leds-
30748 obj-$(CONFIG_LEDS_COBALT_RAQ) += leds-cobalt-raq.o
30749 obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o
30750 obj-$(CONFIG_LEDS_CM_X270) += leds-cm-x270.o
30751 +obj-$(CONFIG_LEDS_NEO1973_VIBRATOR) += leds-neo1973-vibrator.o
30752 +obj-$(CONFIG_LEDS_NEO1973_GTA02) += leds-neo1973-gta02.o
30753
30754 # LED Triggers
30755 obj-$(CONFIG_LEDS_TRIGGER_TIMER) += ledtrig-timer.o
30756 Index: linux-2.6.24.7/drivers/Makefile
30757 ===================================================================
30758 --- linux-2.6.24.7.orig/drivers/Makefile 2008-12-11 22:46:07.000000000 +0100
30759 +++ linux-2.6.24.7/drivers/Makefile 2008-12-11 22:46:49.000000000 +0100
30760 @@ -77,6 +77,7 @@ obj-$(CONFIG_LGUEST_GUEST) += lguest/
30761 obj-$(CONFIG_CPU_FREQ) += cpufreq/
30762 obj-$(CONFIG_CPU_IDLE) += cpuidle/
30763 obj-$(CONFIG_MMC) += mmc/
30764 +obj-$(CONFIG_SDIO) += sdio/
30765 obj-$(CONFIG_NEW_LEDS) += leds/
30766 obj-$(CONFIG_INFINIBAND) += infiniband/
30767 obj-$(CONFIG_SGI_SN) += sn/
30768 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-core.c
30769 ===================================================================
30770 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
30771 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-core.c 2008-12-11 22:46:49.000000000 +0100
30772 @@ -0,0 +1,1340 @@
30773 +/* Smedia Glamo 336x/337x driver
30774 + *
30775 + * (C) 2007 by Openmoko, Inc.
30776 + * Author: Harald Welte <laforge@openmoko.org>
30777 + * All rights reserved.
30778 + *
30779 + * This program is free software; you can redistribute it and/or
30780 + * modify it under the terms of the GNU General Public License as
30781 + * published by the Free Software Foundation; either version 2 of
30782 + * the License, or (at your option) any later version.
30783 + *
30784 + * This program is distributed in the hope that it will be useful,
30785 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
30786 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30787 + * GNU General Public License for more details.
30788 + *
30789 + * You should have received a copy of the GNU General Public License
30790 + * along with this program; if not, write to the Free Software
30791 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
30792 + * MA 02111-1307 USA
30793 + */
30794 +
30795 +#include <linux/module.h>
30796 +#include <linux/kernel.h>
30797 +#include <linux/errno.h>
30798 +#include <linux/string.h>
30799 +#include <linux/mm.h>
30800 +#include <linux/tty.h>
30801 +#include <linux/slab.h>
30802 +#include <linux/delay.h>
30803 +#include <linux/fb.h>
30804 +#include <linux/init.h>
30805 +#include <linux/irq.h>
30806 +#include <linux/interrupt.h>
30807 +#include <linux/workqueue.h>
30808 +#include <linux/wait.h>
30809 +#include <linux/platform_device.h>
30810 +#include <linux/kernel_stat.h>
30811 +#include <linux/spinlock.h>
30812 +#include <linux/glamofb.h>
30813 +#include <linux/mmc/mmc.h>
30814 +#include <linux/mmc/host.h>
30815 +
30816 +#include <asm/io.h>
30817 +#include <asm/uaccess.h>
30818 +#include <asm/div64.h>
30819 +
30820 +#ifdef CONFIG_PM
30821 +#include <linux/pm.h>
30822 +#endif
30823 +
30824 +#include "glamo-regs.h"
30825 +#include "glamo-core.h"
30826 +
30827 +#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)
30828 +
30829 +#define GLAMO_MEM_REFRESH_COUNT 0x100
30830 +
30831 +static struct glamo_core *glamo_handle;
30832 +
30833 +static inline void __reg_write(struct glamo_core *glamo,
30834 + u_int16_t reg, u_int16_t val)
30835 +{
30836 + writew(val, glamo->base + reg);
30837 +}
30838 +
30839 +static inline u_int16_t __reg_read(struct glamo_core *glamo,
30840 + u_int16_t reg)
30841 +{
30842 + return readw(glamo->base + reg);
30843 +}
30844 +
30845 +static void __reg_set_bit_mask(struct glamo_core *glamo,
30846 + u_int16_t reg, u_int16_t mask,
30847 + u_int16_t val)
30848 +{
30849 + u_int16_t tmp;
30850 +
30851 + val &= mask;
30852 +
30853 + tmp = __reg_read(glamo, reg);
30854 + tmp &= ~mask;
30855 + tmp |= val;
30856 + __reg_write(glamo, reg, tmp);
30857 +}
30858 +
30859 +static void reg_set_bit_mask(struct glamo_core *glamo,
30860 + u_int16_t reg, u_int16_t mask,
30861 + u_int16_t val)
30862 +{
30863 + spin_lock(&glamo->lock);
30864 + __reg_set_bit_mask(glamo, reg, mask, val);
30865 + spin_unlock(&glamo->lock);
30866 +}
30867 +
30868 +static inline void __reg_set_bit(struct glamo_core *glamo,
30869 + u_int16_t reg, u_int16_t bit)
30870 +{
30871 + __reg_set_bit_mask(glamo, reg, bit, 0xffff);
30872 +}
30873 +
30874 +static inline void __reg_clear_bit(struct glamo_core *glamo,
30875 + u_int16_t reg, u_int16_t bit)
30876 +{
30877 + __reg_set_bit_mask(glamo, reg, bit, 0);
30878 +}
30879 +
30880 +static inline void glamo_vmem_write(struct glamo_core *glamo, u_int32_t addr,
30881 + u_int16_t *src, int len)
30882 +{
30883 + if (addr & 0x0001 || (unsigned long)src & 0x0001 || len & 0x0001) {
30884 + dev_err(&glamo->pdev->dev, "unaligned write(0x%08x, 0x%p, "
30885 + "0x%x)!!\n", addr, src, len);
30886 + }
30887 +
30888 +}
30889 +
30890 +static inline void glamo_vmem_read(struct glamo_core *glamo, u_int16_t *buf,
30891 + u_int32_t addr, int len)
30892 +{
30893 + if (addr & 0x0001 || (unsigned long) buf & 0x0001 || len & 0x0001) {
30894 + dev_err(&glamo->pdev->dev, "unaligned read(0x%p, 0x08%x, "
30895 + "0x%x)!!\n", buf, addr, len);
30896 + }
30897 +
30898 +
30899 +}
30900 +
30901 +/***********************************************************************
30902 + * resources of sibling devices
30903 + ***********************************************************************/
30904 +
30905 +#if 0
30906 +static struct resource glamo_core_resources[] = {
30907 + {
30908 + .start = GLAMO_REGOFS_GENERIC,
30909 + .end = GLAMO_REGOFS_GENERIC + 0x400,
30910 + .flags = IORESOURCE_MEM,
30911 + }, {
30912 + .start = 0,
30913 + .end = 0,
30914 + .flags = IORESOURCE_IRQ,
30915 + },
30916 +};
30917 +
30918 +static struct platform_device glamo_core_dev = {
30919 + .name = "glamo-core",
30920 + .resource = &glamo_core_resources,
30921 + .num_resources = ARRAY_SIZE(glamo_core_resources),
30922 +};
30923 +#endif
30924 +
30925 +static struct resource glamo_jpeg_resources[] = {
30926 + {
30927 + .start = GLAMO_REGOFS_JPEG,
30928 + .end = GLAMO_REGOFS_MPEG - 1,
30929 + .flags = IORESOURCE_MEM,
30930 + }, {
30931 + .start = IRQ_GLAMO_JPEG,
30932 + .end = IRQ_GLAMO_JPEG,
30933 + .flags = IORESOURCE_IRQ,
30934 + },
30935 +};
30936 +
30937 +static struct platform_device glamo_jpeg_dev = {
30938 + .name = "glamo-jpeg",
30939 + .resource = glamo_jpeg_resources,
30940 + .num_resources = ARRAY_SIZE(glamo_jpeg_resources),
30941 +};
30942 +
30943 +static struct resource glamo_mpeg_resources[] = {
30944 + {
30945 + .start = GLAMO_REGOFS_MPEG,
30946 + .end = GLAMO_REGOFS_LCD - 1,
30947 + .flags = IORESOURCE_MEM,
30948 + }, {
30949 + .start = IRQ_GLAMO_MPEG,
30950 + .end = IRQ_GLAMO_MPEG,
30951 + .flags = IORESOURCE_IRQ,
30952 + },
30953 +};
30954 +
30955 +static struct platform_device glamo_mpeg_dev = {
30956 + .name = "glamo-mpeg",
30957 + .resource = glamo_mpeg_resources,
30958 + .num_resources = ARRAY_SIZE(glamo_mpeg_resources),
30959 +};
30960 +
30961 +static struct resource glamo_2d_resources[] = {
30962 + {
30963 + .start = GLAMO_REGOFS_2D,
30964 + .end = GLAMO_REGOFS_3D - 1,
30965 + .flags = IORESOURCE_MEM,
30966 + }, {
30967 + .start = IRQ_GLAMO_2D,
30968 + .end = IRQ_GLAMO_2D,
30969 + .flags = IORESOURCE_IRQ,
30970 + },
30971 +};
30972 +
30973 +static struct platform_device glamo_2d_dev = {
30974 + .name = "glamo-2d",
30975 + .resource = glamo_2d_resources,
30976 + .num_resources = ARRAY_SIZE(glamo_2d_resources),
30977 +};
30978 +
30979 +static struct resource glamo_3d_resources[] = {
30980 + {
30981 + .start = GLAMO_REGOFS_3D,
30982 + .end = GLAMO_REGOFS_END - 1,
30983 + .flags = IORESOURCE_MEM,
30984 + },
30985 +};
30986 +
30987 +static struct platform_device glamo_3d_dev = {
30988 + .name = "glamo-3d",
30989 + .resource = glamo_3d_resources,
30990 + .num_resources = ARRAY_SIZE(glamo_3d_resources),
30991 +};
30992 +
30993 +static struct platform_device glamo_spigpio_dev = {
30994 + .name = "glamo-spi-gpio",
30995 +};
30996 +
30997 +static struct resource glamo_fb_resources[] = {
30998 + /* FIXME: those need to be incremented by parent base */
30999 + {
31000 + .name = "glamo-fb-regs",
31001 + .start = GLAMO_REGOFS_LCD,
31002 + .end = GLAMO_REGOFS_MMC - 1,
31003 + .flags = IORESOURCE_MEM,
31004 + }, {
31005 + .name = "glamo-fb-mem",
31006 + .start = GLAMO_OFFSET_FB,
31007 + .end = GLAMO_OFFSET_FB + GLAMO_FB_SIZE - 1,
31008 + .flags = IORESOURCE_MEM,
31009 + },
31010 +};
31011 +
31012 +static struct platform_device glamo_fb_dev = {
31013 + .name = "glamo-fb",
31014 + .resource = glamo_fb_resources,
31015 + .num_resources = ARRAY_SIZE(glamo_fb_resources),
31016 +};
31017 +
31018 +static struct resource glamo_mmc_resources[] = {
31019 + {
31020 + /* FIXME: those need to be incremented by parent base */
31021 + .start = GLAMO_REGOFS_MMC,
31022 + .end = GLAMO_REGOFS_MPROC0 - 1,
31023 + .flags = IORESOURCE_MEM
31024 + }, {
31025 + .start = IRQ_GLAMO_MMC,
31026 + .end = IRQ_GLAMO_MMC,
31027 + .flags = IORESOURCE_IRQ,
31028 + }, { /* our data buffer for MMC transfers */
31029 + .start = GLAMO_OFFSET_FB + GLAMO_FB_SIZE,
31030 + .end = GLAMO_OFFSET_FB + GLAMO_FB_SIZE +
31031 + GLAMO_MMC_BUFFER_SIZE - 1,
31032 + .flags = IORESOURCE_MEM
31033 + },
31034 +};
31035 +
31036 +static struct platform_device glamo_mmc_dev = {
31037 + .name = "glamo-mci",
31038 + .resource = glamo_mmc_resources,
31039 + .num_resources = ARRAY_SIZE(glamo_mmc_resources),
31040 +};
31041 +
31042 +struct glamo_mci_pdata glamo_mci_def_pdata = {
31043 + .gpio_detect = 0,
31044 + .glamo_set_mci_power = NULL, /* filled in from MFD platform data */
31045 + .ocr_avail = MMC_VDD_20_21 |
31046 + MMC_VDD_21_22 |
31047 + MMC_VDD_22_23 |
31048 + MMC_VDD_23_24 |
31049 + MMC_VDD_24_25 |
31050 + MMC_VDD_25_26 |
31051 + MMC_VDD_26_27 |
31052 + MMC_VDD_27_28 |
31053 + MMC_VDD_28_29 |
31054 + MMC_VDD_29_30 |
31055 + MMC_VDD_30_31 |
31056 + MMC_VDD_32_33,
31057 + .glamo_irq_is_wired = NULL, /* filled in from MFD platform data */
31058 + .mci_suspending = NULL, /* filled in from MFD platform data */
31059 + .mci_all_dependencies_resumed = NULL, /* filled in from MFD plat data */
31060 +};
31061 +EXPORT_SYMBOL_GPL(glamo_mci_def_pdata);
31062 +
31063 +
31064 +
31065 +static void mangle_mem_resources(struct resource *res, int num_res,
31066 + struct resource *parent)
31067 +{
31068 + int i;
31069 +
31070 + for (i = 0; i < num_res; i++) {
31071 + if (res[i].flags != IORESOURCE_MEM)
31072 + continue;
31073 + res[i].start += parent->start;
31074 + res[i].end += parent->start;
31075 + res[i].parent = parent;
31076 + }
31077 +}
31078 +
31079 +/***********************************************************************
31080 + * IRQ demultiplexer
31081 + ***********************************************************************/
31082 +#define irq2glamo(x) (x - IRQ_GLAMO(0))
31083 +
31084 +static void glamo_ack_irq(unsigned int irq)
31085 +{
31086 + /* clear interrupt source */
31087 + __reg_write(glamo_handle, GLAMO_REG_IRQ_CLEAR,
31088 + 1 << irq2glamo(irq));
31089 +}
31090 +
31091 +static void glamo_mask_irq(unsigned int irq)
31092 +{
31093 + u_int16_t tmp;
31094 +
31095 + /* clear bit in enable register */
31096 + tmp = __reg_read(glamo_handle, GLAMO_REG_IRQ_ENABLE);
31097 + tmp &= ~(1 << irq2glamo(irq));
31098 + __reg_write(glamo_handle, GLAMO_REG_IRQ_ENABLE, tmp);
31099 +}
31100 +
31101 +static void glamo_unmask_irq(unsigned int irq)
31102 +{
31103 + u_int16_t tmp;
31104 +
31105 + /* set bit in enable register */
31106 + tmp = __reg_read(glamo_handle, GLAMO_REG_IRQ_ENABLE);
31107 + tmp |= (1 << irq2glamo(irq));
31108 + __reg_write(glamo_handle, GLAMO_REG_IRQ_ENABLE, tmp);
31109 +}
31110 +
31111 +static struct irq_chip glamo_irq_chip = {
31112 + .ack = glamo_ack_irq,
31113 + .mask = glamo_mask_irq,
31114 + .unmask = glamo_unmask_irq,
31115 +};
31116 +
31117 +static void glamo_irq_demux_handler(unsigned int irq, struct irq_desc *desc)
31118 +{
31119 + const unsigned int cpu = smp_processor_id();
31120 +
31121 + spin_lock(&desc->lock);
31122 +
31123 + desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
31124 +
31125 + if (unlikely(desc->status & IRQ_INPROGRESS)) {
31126 + desc->status |= (IRQ_PENDING | IRQ_MASKED);
31127 + desc->chip->mask(irq);
31128 + desc->chip->ack(irq);
31129 + goto out_unlock;
31130 + }
31131 +
31132 + kstat_cpu(cpu).irqs[irq]++;
31133 + desc->chip->ack(irq);
31134 + desc->status |= IRQ_INPROGRESS;
31135 +
31136 + do {
31137 + u_int16_t irqstatus;
31138 + int i;
31139 +
31140 + if (unlikely((desc->status &
31141 + (IRQ_PENDING | IRQ_MASKED | IRQ_DISABLED)) ==
31142 + (IRQ_PENDING | IRQ_MASKED))) {
31143 + /* dealing with pending IRQ, unmasking */
31144 + desc->chip->unmask(irq);
31145 + desc->status &= ~IRQ_MASKED;
31146 + }
31147 +
31148 + desc->status &= ~IRQ_PENDING;
31149 +
31150 + /* read IRQ status register */
31151 + irqstatus = __reg_read(glamo_handle, GLAMO_REG_IRQ_STATUS);
31152 + for (i = 0; i < 9; i++)
31153 + if (irqstatus & (1 << i))
31154 + desc_handle_irq(IRQ_GLAMO(i),
31155 + irq_desc+IRQ_GLAMO(i));
31156 +
31157 + } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
31158 +
31159 + desc->status &= ~IRQ_INPROGRESS;
31160 +
31161 +out_unlock:
31162 + spin_unlock(&desc->lock);
31163 +}
31164 +
31165 +/***********************************************************************
31166 + * 'engine' support
31167 + ***********************************************************************/
31168 +
31169 +int __glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine)
31170 +{
31171 + switch (engine) {
31172 + case GLAMO_ENGINE_LCD:
31173 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_LCD,
31174 + GLAMO_CLOCK_LCD_EN_M5CLK |
31175 + GLAMO_CLOCK_LCD_EN_DHCLK |
31176 + GLAMO_CLOCK_LCD_EN_DMCLK |
31177 + GLAMO_CLOCK_LCD_EN_DCLK |
31178 + GLAMO_CLOCK_LCD_DG_M5CLK |
31179 + GLAMO_CLOCK_LCD_DG_DMCLK, 0xffff);
31180 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1,
31181 + GLAMO_CLOCK_GEN51_EN_DIV_DHCLK |
31182 + GLAMO_CLOCK_GEN51_EN_DIV_DMCLK |
31183 + GLAMO_CLOCK_GEN51_EN_DIV_DCLK, 0xffff);
31184 + __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
31185 + GLAMO_HOSTBUS2_MMIO_EN_LCD,
31186 + 0xffff);
31187 + break;
31188 + case GLAMO_ENGINE_MMC:
31189 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_MMC,
31190 + GLAMO_CLOCK_MMC_EN_M9CLK |
31191 + GLAMO_CLOCK_MMC_EN_TCLK |
31192 + GLAMO_CLOCK_MMC_DG_M9CLK |
31193 + GLAMO_CLOCK_MMC_DG_TCLK, 0xffff);
31194 + __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
31195 + GLAMO_HOSTBUS2_MMIO_EN_MMC,
31196 + GLAMO_HOSTBUS2_MMIO_EN_MMC);
31197 + break;
31198 + case GLAMO_ENGINE_2D:
31199 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_2D,
31200 + GLAMO_CLOCK_2D_EN_M7CLK |
31201 + GLAMO_CLOCK_2D_EN_GCLK |
31202 + GLAMO_CLOCK_2D_DG_M7CLK |
31203 + GLAMO_CLOCK_2D_DG_GCLK, 0xffff);
31204 + __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
31205 + GLAMO_HOSTBUS2_MMIO_EN_2D,
31206 + GLAMO_HOSTBUS2_MMIO_EN_2D);
31207 + break;
31208 + case GLAMO_ENGINE_CMDQ:
31209 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_2D,
31210 + GLAMO_CLOCK_2D_EN_M6CLK, 0xffff);
31211 + __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
31212 + GLAMO_HOSTBUS2_MMIO_EN_CQ,
31213 + GLAMO_HOSTBUS2_MMIO_EN_CQ);
31214 + break;
31215 + /* FIXME: Implementation */
31216 + default:
31217 + break;
31218 + }
31219 +
31220 + glamo->engine_enabled_bitfield |= 1 << engine;
31221 +
31222 + return 0;
31223 +}
31224 +
31225 +int glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine)
31226 +{
31227 + int ret;
31228 +
31229 + spin_lock(&glamo->lock);
31230 +
31231 + ret = __glamo_engine_enable(glamo, engine);
31232 +
31233 + spin_unlock(&glamo->lock);
31234 +
31235 + return ret;
31236 +}
31237 +EXPORT_SYMBOL_GPL(glamo_engine_enable);
31238 +
31239 +int __glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine)
31240 +{
31241 + switch (engine) {
31242 + case GLAMO_ENGINE_LCD:
31243 + /* remove pixel clock to LCM */
31244 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_LCD,
31245 + GLAMO_CLOCK_LCD_EN_DCLK, 0);
31246 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_LCD,
31247 + GLAMO_CLOCK_LCD_EN_DHCLK |
31248 + GLAMO_CLOCK_LCD_EN_DMCLK, 0);
31249 + /* kill memory clock */
31250 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_LCD,
31251 + GLAMO_CLOCK_LCD_EN_M5CLK, 0);
31252 + /* stop dividing the clocks */
31253 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1,
31254 + GLAMO_CLOCK_GEN51_EN_DIV_DHCLK |
31255 + GLAMO_CLOCK_GEN51_EN_DIV_DMCLK |
31256 + GLAMO_CLOCK_GEN51_EN_DIV_DCLK, 0);
31257 + __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2),
31258 + GLAMO_HOSTBUS2_MMIO_EN_LCD, 0);
31259 + break;
31260 +
31261 + case GLAMO_ENGINE_MMC:
31262 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_MMC, 0,
31263 + GLAMO_CLOCK_MMC_EN_M9CLK |
31264 + GLAMO_CLOCK_MMC_EN_TCLK |
31265 + GLAMO_CLOCK_MMC_DG_M9CLK |
31266 + GLAMO_CLOCK_MMC_DG_TCLK);
31267 + /* disable the TCLK divider clk input */
31268 + __reg_set_bit_mask(glamo, GLAMO_REG_CLOCK_GEN5_1, 0,
31269 + GLAMO_CLOCK_GEN51_EN_DIV_TCLK);
31270 + __reg_set_bit_mask(glamo, GLAMO_REG_HOSTBUS(2), 0,
31271 + GLAMO_HOSTBUS2_MMIO_EN_MMC);
31272 + /* good idea to hold the thing in reset when we power it off? */
31273 +/* writew(readw(glamo->base + GLAMO_REG_CLOCK_MMC) |
31274 + GLAMO_CLOCK_MMC_RESET, glamo->base + GLAMO_REG_CLOCK_MMC);
31275 +*/
31276 + break;
31277 + default:
31278 + break;
31279 + }
31280 +
31281 + glamo->engine_enabled_bitfield &= ~(1 << engine);
31282 +
31283 + return 0;
31284 +}
31285 +int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine)
31286 +{
31287 + int ret;
31288 +
31289 + spin_lock(&glamo->lock);
31290 +
31291 + ret = __glamo_engine_disable(glamo, engine);
31292 +
31293 + spin_unlock(&glamo->lock);
31294 +
31295 + return ret;
31296 +}
31297 +EXPORT_SYMBOL_GPL(glamo_engine_disable);
31298 +
31299 +static const u_int16_t engine_clock_regs[__NUM_GLAMO_ENGINES] = {
31300 + [GLAMO_ENGINE_LCD] = GLAMO_REG_CLOCK_LCD,
31301 + [GLAMO_ENGINE_MMC] = GLAMO_REG_CLOCK_MMC,
31302 + [GLAMO_ENGINE_ISP] = GLAMO_REG_CLOCK_ISP,
31303 + [GLAMO_ENGINE_JPEG] = GLAMO_REG_CLOCK_JPEG,
31304 + [GLAMO_ENGINE_3D] = GLAMO_REG_CLOCK_3D,
31305 + [GLAMO_ENGINE_2D] = GLAMO_REG_CLOCK_2D,
31306 + [GLAMO_ENGINE_MPEG_ENC] = GLAMO_REG_CLOCK_MPEG,
31307 + [GLAMO_ENGINE_MPEG_DEC] = GLAMO_REG_CLOCK_MPEG,
31308 +};
31309 +
31310 +void glamo_engine_clkreg_set(struct glamo_core *glamo,
31311 + enum glamo_engine engine,
31312 + u_int16_t mask, u_int16_t val)
31313 +{
31314 + reg_set_bit_mask(glamo, engine_clock_regs[engine], mask, val);
31315 +}
31316 +EXPORT_SYMBOL_GPL(glamo_engine_clkreg_set);
31317 +
31318 +u_int16_t glamo_engine_clkreg_get(struct glamo_core *glamo,
31319 + enum glamo_engine engine)
31320 +{
31321 + u_int16_t val;
31322 +
31323 + spin_lock(&glamo->lock);
31324 + val = __reg_read(glamo, engine_clock_regs[engine]);
31325 + spin_unlock(&glamo->lock);
31326 +
31327 + return val;
31328 +}
31329 +EXPORT_SYMBOL_GPL(glamo_engine_clkreg_get);
31330 +
31331 +struct glamo_script reset_regs[] = {
31332 + [GLAMO_ENGINE_LCD] = {
31333 + GLAMO_REG_CLOCK_LCD, GLAMO_CLOCK_LCD_RESET
31334 + },
31335 +#if 0
31336 + [GLAMO_ENGINE_HOST] = {
31337 + GLAMO_REG_CLOCK_HOST, GLAMO_CLOCK_HOST_RESET
31338 + },
31339 + [GLAMO_ENGINE_MEM] = {
31340 + GLAMO_REG_CLOCK_MEM, GLAMO_CLOCK_MEM_RESET
31341 + },
31342 +#endif
31343 + [GLAMO_ENGINE_MMC] = {
31344 + GLAMO_REG_CLOCK_MMC, GLAMO_CLOCK_MMC_RESET
31345 + },
31346 + [GLAMO_ENGINE_2D] = {
31347 + GLAMO_REG_CLOCK_2D, GLAMO_CLOCK_2D_RESET
31348 + },
31349 + [GLAMO_ENGINE_JPEG] = {
31350 + GLAMO_REG_CLOCK_JPEG, GLAMO_CLOCK_JPEG_RESET
31351 + },
31352 +};
31353 +
31354 +void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine)
31355 +{
31356 + struct glamo_script *rst;
31357 +
31358 + if (engine >= ARRAY_SIZE(reset_regs)) {
31359 + dev_warn(&glamo->pdev->dev, "unknown engine %u ", engine);
31360 + return;
31361 + }
31362 +
31363 + rst = &reset_regs[engine];
31364 +
31365 + spin_lock(&glamo->lock);
31366 + __reg_set_bit(glamo, rst->reg, rst->val);
31367 + spin_unlock(&glamo->lock);
31368 +
31369 + msleep(1);
31370 +
31371 + spin_lock(&glamo->lock);
31372 + __reg_clear_bit(glamo, rst->reg, rst->val);
31373 + spin_unlock(&glamo->lock);
31374 +
31375 + msleep(1);
31376 +}
31377 +EXPORT_SYMBOL_GPL(glamo_engine_reset);
31378 +
31379 +void glamo_lcm_reset(int level)
31380 +{
31381 + if (!glamo_handle)
31382 + return;
31383 +
31384 + glamo_gpio_setpin(glamo_handle, GLAMO_GPIO4, level);
31385 + glamo_gpio_cfgpin(glamo_handle, GLAMO_GPIO4_OUTPUT);
31386 +
31387 +}
31388 +EXPORT_SYMBOL_GPL(glamo_lcm_reset);
31389 +
31390 +enum glamo_pll {
31391 + GLAMO_PLL1,
31392 + GLAMO_PLL2,
31393 +};
31394 +
31395 +static int glamo_pll_rate(struct glamo_core *glamo,
31396 + enum glamo_pll pll)
31397 +{
31398 + u_int16_t reg;
31399 + unsigned int div = 512;
31400 + /* FIXME: move osci into platform_data */
31401 + unsigned int osci = 32768;
31402 +
31403 + if (osci == 32768)
31404 + div = 1;
31405 +
31406 + switch (pll) {
31407 + case GLAMO_PLL1:
31408 + reg = __reg_read(glamo, GLAMO_REG_PLL_GEN1);
31409 + break;
31410 + case GLAMO_PLL2:
31411 + reg = __reg_read(glamo, GLAMO_REG_PLL_GEN3);
31412 + break;
31413 + default:
31414 + return -EINVAL;
31415 + }
31416 + return (osci/div)*reg;
31417 +}
31418 +
31419 +int glamo_engine_reclock(struct glamo_core *glamo,
31420 + enum glamo_engine engine,
31421 + int ps)
31422 +{
31423 + int pll, khz;
31424 + u_int16_t reg, mask, val = 0;
31425 +
31426 + if (!ps)
31427 + return 0;
31428 +
31429 + switch (engine) {
31430 + case GLAMO_ENGINE_LCD:
31431 + pll = GLAMO_PLL1;
31432 + reg = GLAMO_REG_CLOCK_GEN7;
31433 + mask = 0xff;
31434 + break;
31435 + default:
31436 + dev_warn(&glamo->pdev->dev,
31437 + "reclock of engine 0x%x not supported\n", engine);
31438 + return -EINVAL;
31439 + break;
31440 + }
31441 +
31442 + pll = glamo_pll_rate(glamo, pll);
31443 + khz = 1000000000UL / ps;
31444 +
31445 + if (khz)
31446 + val = (pll / khz) / 1000;
31447 +
31448 + dev_dbg(&glamo->pdev->dev,
31449 + "PLL %d, kHZ %d, div %d\n", pll, khz, val);
31450 +
31451 + if (val) {
31452 + val--;
31453 + reg_set_bit_mask(glamo, reg, mask, val);
31454 + mdelay(5); /* wait some time to stabilize */
31455 +
31456 + return 0;
31457 + } else {
31458 + return -EINVAL;
31459 + }
31460 +}
31461 +EXPORT_SYMBOL_GPL(glamo_engine_reclock);
31462 +
31463 +/***********************************************************************
31464 + * script support
31465 + ***********************************************************************/
31466 +
31467 +int glamo_run_script(struct glamo_core *glamo, struct glamo_script *script,
31468 + int len, int may_sleep)
31469 +{
31470 + int i;
31471 +
31472 + for (i = 0; i < len; i++) {
31473 + struct glamo_script *line = &script[i];
31474 +
31475 + switch (line->reg) {
31476 + case 0xffff:
31477 + return 0;
31478 + case 0xfffe:
31479 + if (may_sleep)
31480 + msleep(line->val);
31481 + else
31482 + mdelay(line->val * 4);
31483 + break;
31484 + case 0xfffd:
31485 + /* spin until PLLs lock */
31486 + while ((__reg_read(glamo, GLAMO_REG_PLL_GEN5) & 3) != 3)
31487 + ;
31488 + break;
31489 + default:
31490 + __reg_write(glamo, script[i].reg, script[i].val);
31491 + break;
31492 + }
31493 + }
31494 +
31495 + return 0;
31496 +}
31497 +EXPORT_SYMBOL(glamo_run_script);
31498 +
31499 +static struct glamo_script glamo_init_script[] = {
31500 + { GLAMO_REG_CLOCK_HOST, 0x1000 },
31501 + { 0xfffe, 2 },
31502 + { GLAMO_REG_CLOCK_MEMORY, 0x1000 },
31503 + { GLAMO_REG_CLOCK_MEMORY, 0x2000 },
31504 + { GLAMO_REG_CLOCK_LCD, 0x1000 },
31505 + { GLAMO_REG_CLOCK_MMC, 0x1000 },
31506 + { GLAMO_REG_CLOCK_ISP, 0x1000 },
31507 + { GLAMO_REG_CLOCK_ISP, 0x3000 },
31508 + { GLAMO_REG_CLOCK_JPEG, 0x1000 },
31509 + { GLAMO_REG_CLOCK_3D, 0x1000 },
31510 + { GLAMO_REG_CLOCK_3D, 0x3000 },
31511 + { GLAMO_REG_CLOCK_2D, 0x1000 },
31512 + { GLAMO_REG_CLOCK_2D, 0x3000 },
31513 + { GLAMO_REG_CLOCK_RISC1, 0x1000 },
31514 + { GLAMO_REG_CLOCK_MPEG, 0x3000 },
31515 + { GLAMO_REG_CLOCK_MPEG, 0x3000 },
31516 + { GLAMO_REG_CLOCK_MPROC, 0x1000 /*0x100f*/ },
31517 + { 0xfffe, 2 },
31518 + { GLAMO_REG_CLOCK_HOST, 0x0000 },
31519 + { GLAMO_REG_CLOCK_MEMORY, 0x0000 },
31520 + { GLAMO_REG_CLOCK_LCD, 0x0000 },
31521 + { GLAMO_REG_CLOCK_MMC, 0x0000 },
31522 +#if 0
31523 +/* unused engines must be left in reset to stop MMC block read "blackouts" */
31524 + { GLAMO_REG_CLOCK_ISP, 0x0000 },
31525 + { GLAMO_REG_CLOCK_ISP, 0x0000 },
31526 + { GLAMO_REG_CLOCK_JPEG, 0x0000 },
31527 + { GLAMO_REG_CLOCK_3D, 0x0000 },
31528 + { GLAMO_REG_CLOCK_3D, 0x0000 },
31529 + { GLAMO_REG_CLOCK_2D, 0x0000 },
31530 + { GLAMO_REG_CLOCK_2D, 0x0000 },
31531 + { GLAMO_REG_CLOCK_RISC1, 0x0000 },
31532 + { GLAMO_REG_CLOCK_MPEG, 0x0000 },
31533 + { GLAMO_REG_CLOCK_MPEG, 0x0000 },
31534 +#endif
31535 + { GLAMO_REG_PLL_GEN1, 0x05db }, /* 48MHz */
31536 + { GLAMO_REG_PLL_GEN3, 0x0aba }, /* 90MHz */
31537 + { 0xfffd, 0 },
31538 + /*
31539 + * b9 of this register MUST be zero to get any interrupts on INT#
31540 + * the other set bits enable all the engine interrupt sources
31541 + */
31542 + { GLAMO_REG_IRQ_ENABLE, 0x01ff },
31543 + { GLAMO_REG_CLOCK_GEN6, 0x2000 },
31544 + { GLAMO_REG_CLOCK_GEN7, 0x0101 },
31545 + { GLAMO_REG_CLOCK_GEN8, 0x0100 },
31546 + { GLAMO_REG_CLOCK_HOST, 0x000d },
31547 + { 0x200, 0x0ef0 },
31548 + { 0x202, 0x07ff },
31549 + { 0x212, 0x0000 },
31550 + { 0x214, 0x4000 },
31551 + { 0x216, 0xf00e },
31552 +
31553 + /* S-Media recommended "set tiling mode to 512 mode for memory access
31554 + * more efficiency when 640x480" */
31555 + { GLAMO_REG_MEM_TYPE, 0x0c74 }, /* 8MB, 16 word pg wr+rd */
31556 + { GLAMO_REG_MEM_GEN, 0xafaf }, /* 63 grants min + max */
31557 + /*
31558 + * the register below originally 0x0108 makes unreliable Glamo MMC
31559 + * write operations. Cranked to 0x05ad to add a wait state, the
31560 + * unreliability is not seen after 4GB of write / read testing
31561 + */
31562 + { GLAMO_REG_MEM_TIMING1, 0x0108 },
31563 + { GLAMO_REG_MEM_TIMING2, 0x0010 }, /* Taa = 3 MCLK */
31564 + { GLAMO_REG_MEM_TIMING3, 0x0000 },
31565 + { GLAMO_REG_MEM_TIMING4, 0x0000 }, /* CE1# delay fall/rise */
31566 + { GLAMO_REG_MEM_TIMING5, 0x0000 }, /* UB# LB# */
31567 + { GLAMO_REG_MEM_TIMING6, 0x0000 }, /* OE# */
31568 + { GLAMO_REG_MEM_TIMING7, 0x0000 }, /* WE# */
31569 + { GLAMO_REG_MEM_TIMING8, 0x1002 }, /* MCLK delay, was 0x1000 */
31570 + { GLAMO_REG_MEM_TIMING9, 0x6006 },
31571 + { GLAMO_REG_MEM_TIMING10, 0x00ff },
31572 + { GLAMO_REG_MEM_TIMING11, 0x0001 },
31573 + { GLAMO_REG_MEM_POWER1, 0x0020 },
31574 + { GLAMO_REG_MEM_POWER2, 0x0000 },
31575 + { GLAMO_REG_MEM_DRAM1, 0x0000 },
31576 + { 0xfffe, 1 },
31577 + { GLAMO_REG_MEM_DRAM1, 0xc100 },
31578 + { 0xfffe, 1 },
31579 + { GLAMO_REG_MEM_DRAM1, 0xe100 },
31580 + { GLAMO_REG_MEM_DRAM2, 0x01d6 },
31581 + { GLAMO_REG_CLOCK_MEMORY, 0x000b },
31582 +};
31583 +
31584 +
31585 +enum glamo_power {
31586 + GLAMO_POWER_ON,
31587 + GLAMO_POWER_SUSPEND,
31588 +};
31589 +
31590 +static void glamo_power(struct glamo_core *glamo,
31591 + enum glamo_power new_state)
31592 +{
31593 + int n;
31594 +
31595 + spin_lock(&glamo->lock);
31596 +
31597 + dev_dbg(&glamo->pdev->dev, "***** glamo_power -> %d\n", new_state);
31598 +
31599 + switch (new_state) {
31600 + case GLAMO_POWER_ON:
31601 + /* power up PLL1 and PLL2 */
31602 + __reg_set_bit_mask(glamo, GLAMO_REG_DFT_GEN6, 0x0001, 0xffff);
31603 + __reg_set_bit_mask(glamo, GLAMO_REG_PLL_GEN3, 0x2000, 0x0000);
31604 +
31605 + /* spin until PLL1 and PLL2 lock */
31606 + while ((__reg_read(glamo, GLAMO_REG_PLL_GEN5) & 3) != 3)
31607 + ;
31608 +
31609 + /* Get memory out of deep powerdown */
31610 +
31611 + __reg_write(glamo, GLAMO_REG_MEM_DRAM2,
31612 + (7 << 6) | /* tRC */
31613 + (1 << 4) | /* tRP */
31614 + (1 << 2) | /* tRCD */
31615 + 2); /* CAS latency */
31616 +
31617 + /* Stop self-refresh */
31618 +
31619 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1,
31620 + GLAMO_MEM_DRAM1_EN_DRAM_REFRESH |
31621 + GLAMO_MEM_DRAM1_EN_GATE_CKE |
31622 + GLAMO_MEM_REFRESH_COUNT);
31623 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1,
31624 + GLAMO_MEM_DRAM1_EN_MODEREG_SET |
31625 + GLAMO_MEM_DRAM1_EN_DRAM_REFRESH |
31626 + GLAMO_MEM_DRAM1_EN_GATE_CKE |
31627 + GLAMO_MEM_REFRESH_COUNT);
31628 +
31629 + /* re-enable clocks to memory */
31630 +
31631 + __reg_write(glamo, GLAMO_REG_CLOCK_MEMORY,
31632 + GLAMO_CLOCK_MEM_EN_MOCACLK |
31633 + GLAMO_CLOCK_MEM_EN_M1CLK |
31634 + GLAMO_CLOCK_MEM_DG_M1CLK);
31635 +
31636 + /* restore each engine that was up before suspend */
31637 + for (n = 0; n < __NUM_GLAMO_ENGINES; n++)
31638 + if (glamo->engine_enabled_bitfield_suspend & (1 << n))
31639 + __glamo_engine_enable(glamo, n);
31640 + break;
31641 +
31642 + case GLAMO_POWER_SUSPEND:
31643 + /* stash a copy of which engines were running */
31644 + glamo->engine_enabled_bitfield_suspend =
31645 + glamo->engine_enabled_bitfield;
31646 +
31647 + /* take down each engine before we kill mem and pll */
31648 + for (n = 0; n < __NUM_GLAMO_ENGINES; n++)
31649 + if (glamo->engine_enabled_bitfield & (1 << n))
31650 + __glamo_engine_disable(glamo, n);
31651 +
31652 + /* enable self-refresh */
31653 +
31654 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1,
31655 + GLAMO_MEM_DRAM1_EN_DRAM_REFRESH |
31656 + GLAMO_MEM_DRAM1_EN_GATE_CKE |
31657 + GLAMO_MEM_DRAM1_SELF_REFRESH |
31658 + GLAMO_MEM_REFRESH_COUNT);
31659 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1,
31660 + GLAMO_MEM_DRAM1_EN_MODEREG_SET |
31661 + GLAMO_MEM_DRAM1_EN_DRAM_REFRESH |
31662 + GLAMO_MEM_DRAM1_EN_GATE_CKE |
31663 + GLAMO_MEM_DRAM1_SELF_REFRESH |
31664 + GLAMO_MEM_REFRESH_COUNT);
31665 +
31666 + /* force RAM into deep powerdown */
31667 +
31668 + __reg_write(glamo, GLAMO_REG_MEM_DRAM2,
31669 + GLAMO_MEM_DRAM2_DEEP_PWRDOWN |
31670 + (7 << 6) | /* tRC */
31671 + (1 << 4) | /* tRP */
31672 + (1 << 2) | /* tRCD */
31673 + 2); /* CAS latency */
31674 +
31675 + /* kill clocks to memory */
31676 +
31677 + __reg_write(glamo, GLAMO_REG_CLOCK_MEMORY, 0);
31678 +
31679 + /* power down PLL2 and then PLL1 */
31680 + __reg_set_bit_mask(glamo, GLAMO_REG_PLL_GEN3, 0x2000, 0xffff);
31681 + __reg_set_bit_mask(glamo, GLAMO_REG_DFT_GEN5, 0x0001, 0xffff);
31682 + break;
31683 + }
31684 +
31685 + spin_unlock(&glamo->lock);
31686 +}
31687 +
31688 +#if 0
31689 +#define MEMDETECT_RETRY 6
31690 +static unsigned int detect_memsize(struct glamo_core *glamo)
31691 +{
31692 + int i;
31693 +
31694 + /*static const u_int16_t pattern[] = {
31695 + 0x1111, 0x8a8a, 0x2222, 0x7a7a,
31696 + 0x3333, 0x6a6a, 0x4444, 0x5a5a,
31697 + 0x5555, 0x4a4a, 0x6666, 0x3a3a,
31698 + 0x7777, 0x2a2a, 0x8888, 0x1a1a
31699 + }; */
31700 +
31701 + for (i = 0; i < MEMDETECT_RETRY; i++) {
31702 + switch (glamo->type) {
31703 + case 3600:
31704 + __reg_write(glamo, GLAMO_REG_MEM_TYPE, 0x0072);
31705 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0xc100);
31706 + break;
31707 + case 3650:
31708 + switch (glamo->revision) {
31709 + case GLAMO_CORE_REV_A0:
31710 + if (i & 1)
31711 + __reg_write(glamo, GLAMO_REG_MEM_TYPE,
31712 + 0x097a);
31713 + else
31714 + __reg_write(glamo, GLAMO_REG_MEM_TYPE,
31715 + 0x0173);
31716 +
31717 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0x0000);
31718 + msleep(1);
31719 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0xc100);
31720 + break;
31721 + default:
31722 + if (i & 1)
31723 + __reg_write(glamo, GLAMO_REG_MEM_TYPE,
31724 + 0x0972);
31725 + else
31726 + __reg_write(glamo, GLAMO_REG_MEM_TYPE,
31727 + 0x0872);
31728 +
31729 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0x0000);
31730 + msleep(1);
31731 + __reg_write(glamo, GLAMO_REG_MEM_DRAM1, 0xe100);
31732 + break;
31733 + }
31734 + break;
31735 + case 3700:
31736 + /* FIXME */
31737 + default:
31738 + break;
31739 + }
31740 +
31741 +#if 0
31742 + /* FIXME: finish implementation */
31743 + for (j = 0; j < 8; j++) {
31744 + __
31745 +#endif
31746 + }
31747 +
31748 + return 0;
31749 +}
31750 +#endif
31751 +
31752 +/* Find out if we can support this version of the Glamo chip */
31753 +static int glamo_supported(struct glamo_core *glamo)
31754 +{
31755 + u_int16_t dev_id, rev_id; /*, memsize; */
31756 +
31757 + dev_id = __reg_read(glamo, GLAMO_REG_DEVICE_ID);
31758 + rev_id = __reg_read(glamo, GLAMO_REG_REVISION_ID);
31759 +
31760 + switch (dev_id) {
31761 + case 0x3650:
31762 + switch (rev_id) {
31763 + case GLAMO_CORE_REV_A2:
31764 + break;
31765 + case GLAMO_CORE_REV_A0:
31766 + case GLAMO_CORE_REV_A1:
31767 + case GLAMO_CORE_REV_A3:
31768 + dev_warn(&glamo->pdev->dev, "untested core revision "
31769 + "%04x, your mileage may vary\n", rev_id);
31770 + break;
31771 + default:
31772 + dev_warn(&glamo->pdev->dev, "unknown glamo revision "
31773 + "%04x, your mileage may vary\n", rev_id);
31774 + /* maybe should abort ? */
31775 + }
31776 + break;
31777 + case 0x3600:
31778 + case 0x3700:
31779 + default:
31780 + dev_err(&glamo->pdev->dev, "unsupported Glamo device %04x\n",
31781 + dev_id);
31782 + return 0;
31783 + }
31784 +
31785 + dev_info(&glamo->pdev->dev, "Detected Glamo core %04x Revision %04x "
31786 + "(%uHz CPU / %uHz Memory)\n", dev_id, rev_id,
31787 + glamo_pll_rate(glamo, GLAMO_PLL1),
31788 + glamo_pll_rate(glamo, GLAMO_PLL2));
31789 +
31790 + return 1;
31791 +}
31792 +
31793 +static ssize_t regs_write(struct device *dev, struct device_attribute *attr,
31794 + const char *buf, size_t count)
31795 +{
31796 + unsigned long reg = simple_strtoul(buf, NULL, 10);
31797 + struct glamo_core *glamo = dev_get_drvdata(dev);
31798 +
31799 + while (*buf && (*buf != ' '))
31800 + buf++;
31801 + if (*buf != ' ')
31802 + return -EINVAL;
31803 + while (*buf && (*buf == ' '))
31804 + buf++;
31805 + if (!*buf)
31806 + return -EINVAL;
31807 +
31808 + printk(KERN_INFO"reg 0x%02lX <-- 0x%04lX\n",
31809 + reg, simple_strtoul(buf, NULL, 10));
31810 +
31811 + __reg_write(glamo, reg, simple_strtoul(buf, NULL, 10));
31812 +
31813 + return count;
31814 +}
31815 +
31816 +static ssize_t regs_read(struct device *dev, struct device_attribute *attr,
31817 + char *buf)
31818 +{
31819 + struct glamo_core *glamo = dev_get_drvdata(dev);
31820 + int n, n1 = 0, r;
31821 + char * end = buf;
31822 + struct reg_range {
31823 + int start;
31824 + int count;
31825 + char * name;
31826 + };
31827 + struct reg_range reg_range[] = {
31828 + { 0x0000, 0x76, "General" },
31829 + { 0x0200, 0x100, "Host Bus" },
31830 + { 0x0300, 0x38, "Memory" },
31831 +/* { 0x0400, 0x100, "Sensor" },
31832 + { 0x0500, 0x300, "ISP" },
31833 + { 0x0800, 0x400, "JPEG" },
31834 + { 0x0c00, 0x500, "MPEG" },
31835 + { 0x1100, 0x400, "LCD" },
31836 + { 0x1500, 0x080, "MPU 0" },
31837 + { 0x1580, 0x080, "MPU 1" },
31838 + { 0x1600, 0x080, "Command Queue" },
31839 + { 0x1680, 0x080, "RISC CPU" },
31840 + { 0x1700, 0x400, "2D Unit" },
31841 + { 0x1b00, 0x900, "3D Unit" },
31842 +*/
31843 + };
31844 +
31845 + spin_lock(&glamo->lock);
31846 +
31847 + for (r = 0; r < ARRAY_SIZE(reg_range); r++) {
31848 + n1 = 0;
31849 + end += sprintf(end, "\n%s\n", reg_range[r].name);
31850 + for (n = reg_range[r].start;
31851 + n < reg_range[r].start + reg_range[r].count; n += 2) {
31852 + if (((n1++) & 7) == 0)
31853 + end += sprintf(end, "\n%04X: ", n);
31854 + end += sprintf(end, "%04x ", __reg_read(glamo, n));
31855 + }
31856 + end += sprintf(end, "\n");
31857 + }
31858 + spin_unlock(&glamo->lock);
31859 +
31860 + return end - buf;
31861 +}
31862 +
31863 +static DEVICE_ATTR(regs, 0644, regs_read, regs_write);
31864 +static struct attribute *glamo_sysfs_entries[] = {
31865 + &dev_attr_regs.attr,
31866 + NULL
31867 +};
31868 +static struct attribute_group glamo_attr_group = {
31869 + .name = NULL,
31870 + .attrs = glamo_sysfs_entries,
31871 +};
31872 +
31873 +
31874 +
31875 +static int __init glamo_probe(struct platform_device *pdev)
31876 +{
31877 + int rc = 0, irq;
31878 + struct glamo_core *glamo;
31879 +
31880 + if (glamo_handle) {
31881 + dev_err(&pdev->dev,
31882 + "This driver supports only one instance\n");
31883 + return -EBUSY;
31884 + }
31885 +
31886 + glamo = kmalloc(GFP_KERNEL, sizeof(*glamo));
31887 + if (!glamo)
31888 + return -ENOMEM;
31889 +
31890 + spin_lock_init(&glamo->lock);
31891 + glamo_handle = glamo;
31892 + glamo->pdev = pdev;
31893 + glamo->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
31894 + glamo->irq = platform_get_irq(pdev, 0);
31895 + glamo->pdata = pdev->dev.platform_data;
31896 + if (!glamo->mem || !glamo->pdata) {
31897 + dev_err(&pdev->dev, "platform device with no MEM/PDATA ?\n");
31898 + rc = -ENOENT;
31899 + goto out_free;
31900 + }
31901 +
31902 + init_resume_dependency_list(&glamo->resume_dependency);
31903 +
31904 + /* register a number of sibling devices whoise IOMEM resources
31905 + * are siblings of pdev's IOMEM resource */
31906 +#if 0
31907 + glamo_core_dev.dev.parent = &pdev.dev;
31908 + mangle_mem_resources(glamo_core_dev.resources,
31909 + glamo_core_dev.num_resources, glamo->mem);
31910 + glamo_core_dev.resources[1].start = glamo->irq;
31911 + glamo_core_dev.resources[1].end = glamo->irq;
31912 + platform_device_register(&glamo_core_dev);
31913 +#endif
31914 + /* only remap the generic, hostbus and memory controller registers */
31915 + glamo->base = ioremap(glamo->mem->start, GLAMO_REGOFS_VIDCAP);
31916 + if (!glamo->base) {
31917 + dev_err(&pdev->dev, "failed to ioremap() memory region\n");
31918 + goto out_free;
31919 + }
31920 +
31921 + /* bring MCI specific stuff over from our MFD platform data */
31922 + glamo_mci_def_pdata.glamo_set_mci_power =
31923 + glamo->pdata->glamo_set_mci_power;
31924 + glamo_mci_def_pdata.glamo_mci_use_slow =
31925 + glamo->pdata->glamo_mci_use_slow;
31926 + glamo_mci_def_pdata.glamo_irq_is_wired =
31927 + glamo->pdata->glamo_irq_is_wired;
31928 + glamo_mci_def_pdata.mci_suspending =
31929 + glamo->pdata->mci_suspending;
31930 + glamo_mci_def_pdata.mci_all_dependencies_resumed =
31931 + glamo->pdata->mci_all_dependencies_resumed;
31932 +
31933 + glamo_2d_dev.dev.parent = &pdev->dev;
31934 + mangle_mem_resources(glamo_2d_dev.resource,
31935 + glamo_2d_dev.num_resources, glamo->mem);
31936 + platform_device_register(&glamo_2d_dev);
31937 +
31938 + glamo_3d_dev.dev.parent = &pdev->dev;
31939 + mangle_mem_resources(glamo_3d_dev.resource,
31940 + glamo_3d_dev.num_resources, glamo->mem);
31941 + platform_device_register(&glamo_3d_dev);
31942 +
31943 + glamo_jpeg_dev.dev.parent = &pdev->dev;
31944 + mangle_mem_resources(glamo_jpeg_dev.resource,
31945 + glamo_jpeg_dev.num_resources, glamo->mem);
31946 + platform_device_register(&glamo_jpeg_dev);
31947 +
31948 + glamo_mpeg_dev.dev.parent = &pdev->dev;
31949 + mangle_mem_resources(glamo_mpeg_dev.resource,
31950 + glamo_mpeg_dev.num_resources, glamo->mem);
31951 + platform_device_register(&glamo_mpeg_dev);
31952 +
31953 + glamo->pdata->glamo = glamo;
31954 + glamo_fb_dev.dev.parent = &pdev->dev;
31955 + glamo_fb_dev.dev.platform_data = glamo->pdata;
31956 + mangle_mem_resources(glamo_fb_dev.resource,
31957 + glamo_fb_dev.num_resources, glamo->mem);
31958 + platform_device_register(&glamo_fb_dev);
31959 +
31960 + glamo->pdata->spigpio_info->glamo = glamo;
31961 + glamo_spigpio_dev.dev.parent = &pdev->dev;
31962 + glamo_spigpio_dev.dev.platform_data = glamo->pdata->spigpio_info;
31963 + platform_device_register(&glamo_spigpio_dev);
31964 +
31965 + glamo_mmc_dev.dev.parent = &pdev->dev;
31966 + /* we need it later to give to the engine enable and disable */
31967 + glamo_mci_def_pdata.pglamo = glamo;
31968 + mangle_mem_resources(glamo_mmc_dev.resource,
31969 + glamo_mmc_dev.num_resources, glamo->mem);
31970 + platform_device_register(&glamo_mmc_dev);
31971 +
31972 + /* only request the generic, hostbus and memory controller MMIO */
31973 + glamo->mem = request_mem_region(glamo->mem->start,
31974 + GLAMO_REGOFS_VIDCAP, "glamo-core");
31975 + if (!glamo->mem) {
31976 + dev_err(&pdev->dev, "failed to request memory region\n");
31977 + goto out_free;
31978 + }
31979 +
31980 + if (!glamo_supported(glamo)) {
31981 + dev_err(&pdev->dev, "This Glamo is not supported\n");
31982 + goto out_free;
31983 + }
31984 +
31985 + rc = sysfs_create_group(&pdev->dev.kobj, &glamo_attr_group);
31986 + if (rc < 0) {
31987 + dev_err(&pdev->dev, "cannot create sysfs group\n");
31988 + goto out_free;
31989 + }
31990 +
31991 + platform_set_drvdata(pdev, glamo);
31992 +
31993 + dev_dbg(&glamo->pdev->dev, "running init script\n");
31994 + glamo_run_script(glamo, glamo_init_script,
31995 + ARRAY_SIZE(glamo_init_script), 1);
31996 +
31997 + dev_info(&glamo->pdev->dev, "Glamo core now %uHz CPU / %uHz Memory)\n",
31998 + glamo_pll_rate(glamo, GLAMO_PLL1),
31999 + glamo_pll_rate(glamo, GLAMO_PLL2));
32000 +
32001 + glamo_lcm_reset(1);
32002 +
32003 + for (irq = IRQ_GLAMO(0); irq <= IRQ_GLAMO(8); irq++) {
32004 + set_irq_chip(irq, &glamo_irq_chip);
32005 + set_irq_handler(irq, handle_level_irq);
32006 + set_irq_flags(irq, IRQF_VALID);
32007 + }
32008 +
32009 + if (glamo->pdata->glamo_irq_is_wired &&
32010 + !glamo->pdata->glamo_irq_is_wired()) {
32011 + set_irq_chained_handler(glamo->irq, glamo_irq_demux_handler);
32012 + set_irq_type(glamo->irq, IRQT_FALLING);
32013 + glamo->irq_works = 1;
32014 + } else
32015 + glamo->irq_works = 0;
32016 +
32017 + return 0;
32018 +
32019 +out_free:
32020 + glamo_handle = NULL;
32021 + kfree(glamo);
32022 + return rc;
32023 +}
32024 +
32025 +static int glamo_remove(struct platform_device *pdev)
32026 +{
32027 + struct glamo_core *glamo = platform_get_drvdata(pdev);
32028 + int irq;
32029 +
32030 + disable_irq(glamo->irq);
32031 + set_irq_chained_handler(glamo->irq, NULL);
32032 +
32033 + for (irq = IRQ_GLAMO(0); irq <= IRQ_GLAMO(8); irq++) {
32034 + set_irq_flags(irq, 0);
32035 + set_irq_chip(irq, NULL);
32036 + }
32037 +
32038 + platform_set_drvdata(pdev, NULL);
32039 + platform_device_unregister(&glamo_fb_dev);
32040 + platform_device_unregister(&glamo_mmc_dev);
32041 + iounmap(glamo->base);
32042 + release_mem_region(glamo->mem->start, GLAMO_REGOFS_VIDCAP);
32043 + glamo_handle = NULL;
32044 + kfree(glamo);
32045 +
32046 + return 0;
32047 +}
32048 +
32049 +#ifdef CONFIG_PM
32050 +
32051 +/* have to export this because struct glamo_core is opaque */
32052 +
32053 +void glamo_register_resume_dependency(struct resume_dependency *
32054 + resume_dependency)
32055 +{
32056 + register_resume_dependency(&glamo_handle->resume_dependency,
32057 + resume_dependency);
32058 + if (glamo_handle->is_suspended)
32059 + activate_all_resume_dependencies(
32060 + &glamo_handle->resume_dependency);
32061 +}
32062 +EXPORT_SYMBOL_GPL(glamo_register_resume_dependency);
32063 +
32064 +
32065 +static int glamo_suspend(struct platform_device *pdev, pm_message_t state)
32066 +{
32067 + glamo_power(glamo_handle, GLAMO_POWER_SUSPEND);
32068 + glamo_handle->is_suspended = 1;
32069 + activate_all_resume_dependencies(&glamo_handle->resume_dependency);
32070 + return 0;
32071 +}
32072 +
32073 +static int glamo_resume(struct platform_device *pdev)
32074 +{
32075 + glamo_power(glamo_handle, GLAMO_POWER_ON);
32076 + glamo_handle->is_suspended = 0;
32077 + callback_all_resume_dependencies(&glamo_handle->resume_dependency);
32078 +
32079 + return 0;
32080 +}
32081 +#else
32082 +#define glamo_suspend NULL
32083 +#define glamo_resume NULL
32084 +#endif
32085 +
32086 +static struct platform_driver glamo_driver = {
32087 + .probe = glamo_probe,
32088 + .remove = glamo_remove,
32089 + .suspend_late = glamo_suspend,
32090 + .resume_early = glamo_resume,
32091 + .driver = {
32092 + .name = "glamo3362",
32093 + .owner = THIS_MODULE,
32094 + },
32095 +};
32096 +
32097 +static int __devinit glamo_init(void)
32098 +{
32099 + return platform_driver_register(&glamo_driver);
32100 +}
32101 +
32102 +static void __exit glamo_cleanup(void)
32103 +{
32104 + platform_driver_unregister(&glamo_driver);
32105 +}
32106 +
32107 +module_init(glamo_init);
32108 +module_exit(glamo_cleanup);
32109 +
32110 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
32111 +MODULE_DESCRIPTION("Smedia Glamo 336x/337x core/resource driver");
32112 +MODULE_LICENSE("GPL");
32113 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-core.h
32114 ===================================================================
32115 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
32116 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-core.h 2008-12-11 22:46:49.000000000 +0100
32117 @@ -0,0 +1,107 @@
32118 +#ifndef __GLAMO_CORE_H
32119 +#define __GLAMO_CORE_H
32120 +
32121 +#include <asm/system.h>
32122 +#include <linux/resume-dependency.h>
32123 +
32124 +/* for the time being, we put the on-screen framebuffer into the lowest
32125 + * VRAM space. This should make the code easily compatible with the various
32126 + * 2MB/4MB/8MB variants of the Smedia chips */
32127 +#define GLAMO_OFFSET_VRAM 0x800000
32128 +#define GLAMO_OFFSET_FB (GLAMO_OFFSET_VRAM)
32129 +
32130 +/* we only allocate the minimum possible size for the framebuffer to make
32131 + * sure we have sufficient memory for other functions of the chip */
32132 +//#define GLAMO_FB_SIZE (640*480*4) /* == 0x12c000 */
32133 +#define GLAMO_INTERNAL_RAM_SIZE 0x800000
32134 +#define GLAMO_MMC_BUFFER_SIZE (64 * 1024)
32135 +#define GLAMO_FB_SIZE (GLAMO_INTERNAL_RAM_SIZE - GLAMO_MMC_BUFFER_SIZE)
32136 +
32137 +
32138 +struct glamo_core {
32139 + int irq;
32140 + int irq_works; /* 0 means PCB does not support Glamo IRQ */
32141 + struct resource *mem;
32142 + struct resource *mem_core;
32143 + void __iomem *base;
32144 + struct platform_device *pdev;
32145 + struct glamofb_platform_data *pdata;
32146 + u_int16_t type;
32147 + u_int16_t revision;
32148 + spinlock_t lock;
32149 + struct resume_dependency resume_dependency;
32150 + u32 engine_enabled_bitfield;
32151 + u32 engine_enabled_bitfield_suspend;
32152 + int is_suspended;
32153 +};
32154 +
32155 +struct glamo_script {
32156 + u_int16_t reg;
32157 + u_int16_t val;
32158 +};
32159 +
32160 +int glamo_run_script(struct glamo_core *glamo,
32161 + struct glamo_script *script, int len, int may_sleep);
32162 +
32163 +enum glamo_engine {
32164 + GLAMO_ENGINE_CAPTURE,
32165 + GLAMO_ENGINE_ISP,
32166 + GLAMO_ENGINE_JPEG,
32167 + GLAMO_ENGINE_MPEG_ENC,
32168 + GLAMO_ENGINE_MPEG_DEC,
32169 + GLAMO_ENGINE_LCD,
32170 + GLAMO_ENGINE_CMDQ,
32171 + GLAMO_ENGINE_2D,
32172 + GLAMO_ENGINE_3D,
32173 + GLAMO_ENGINE_MMC,
32174 + GLAMO_ENGINE_MICROP0,
32175 + GLAMO_ENGINE_RISC,
32176 + GLAMO_ENGINE_MICROP1_MPEG_ENC,
32177 + GLAMO_ENGINE_MICROP1_MPEG_DEC,
32178 +#if 0
32179 + GLAMO_ENGINE_H264_DEC,
32180 + GLAMO_ENGINE_RISC1,
32181 + GLAMO_ENGINE_SPI,
32182 +#endif
32183 + __NUM_GLAMO_ENGINES
32184 +};
32185 +
32186 +struct glamo_mci_pdata {
32187 + struct glamo_core * pglamo;
32188 + unsigned int gpio_detect;
32189 + unsigned int gpio_wprotect;
32190 + unsigned long ocr_avail;
32191 + void (*glamo_set_mci_power)(unsigned char power_mode,
32192 + unsigned short vdd);
32193 + /* glamo-mci asking if it should use the slow clock to card */
32194 + int (*glamo_mci_use_slow)(void);
32195 + int (*glamo_irq_is_wired)(void);
32196 + void (*mci_suspending)(struct platform_device *dev);
32197 + int (*mci_all_dependencies_resumed)(struct platform_device
32198 + *dev);
32199 +
32200 +};
32201 +
32202 +
32203 +static inline void glamo_reg_access_delay(void)
32204 +{
32205 + int n;
32206 +
32207 + for (n = 0; n != 2; n++)
32208 + nop();
32209 +}
32210 +
32211 +
32212 +int glamo_engine_enable(struct glamo_core *glamo, enum glamo_engine engine);
32213 +int glamo_engine_disable(struct glamo_core *glamo, enum glamo_engine engine);
32214 +void glamo_engine_reset(struct glamo_core *glamo, enum glamo_engine engine);
32215 +int glamo_engine_reclock(struct glamo_core *glamo,
32216 + enum glamo_engine engine, int ps);
32217 +
32218 +void glamo_engine_clkreg_set(struct glamo_core *glamo,
32219 + enum glamo_engine engine,
32220 + u_int16_t mask, u_int16_t val);
32221 +
32222 +u_int16_t glamo_engine_clkreg_get(struct glamo_core *glamo,
32223 + enum glamo_engine engine);
32224 +#endif /* __GLAMO_CORE_H */
32225 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-fb.c
32226 ===================================================================
32227 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
32228 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-fb.c 2008-12-11 22:46:49.000000000 +0100
32229 @@ -0,0 +1,911 @@
32230 +/* Smedia Glamo 336x/337x driver
32231 + *
32232 + * (C) 2007-2008 by Openmoko, Inc.
32233 + * Author: Harald Welte <laforge@openmoko.org>
32234 + * All rights reserved.
32235 + *
32236 + * This program is free software; you can redistribute it and/or
32237 + * modify it under the terms of the GNU General Public License as
32238 + * published by the Free Software Foundation; either version 2 of
32239 + * the License, or (at your option) any later version.
32240 + *
32241 + * This program is distributed in the hope that it will be useful,
32242 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
32243 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
32244 + * GNU General Public License for more details.
32245 + *
32246 + * You should have received a copy of the GNU General Public License
32247 + * along with this program; if not, write to the Free Software
32248 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
32249 + * MA 02111-1307 USA
32250 + */
32251 +
32252 +#include <linux/module.h>
32253 +#include <linux/kernel.h>
32254 +#include <linux/errno.h>
32255 +#include <linux/string.h>
32256 +#include <linux/mm.h>
32257 +#include <linux/slab.h>
32258 +#include <linux/delay.h>
32259 +#include <linux/fb.h>
32260 +#include <linux/init.h>
32261 +#include <linux/vmalloc.h>
32262 +#include <linux/dma-mapping.h>
32263 +#include <linux/interrupt.h>
32264 +#include <linux/workqueue.h>
32265 +#include <linux/wait.h>
32266 +#include <linux/platform_device.h>
32267 +#include <linux/clk.h>
32268 +#include <linux/spinlock.h>
32269 +
32270 +#include <asm/io.h>
32271 +#include <asm/uaccess.h>
32272 +#include <asm/div64.h>
32273 +
32274 +#ifdef CONFIG_PM
32275 +#include <linux/pm.h>
32276 +#endif
32277 +
32278 +#include <linux/glamofb.h>
32279 +
32280 +#include "glamo-regs.h"
32281 +#include "glamo-core.h"
32282 +
32283 +#ifndef DEBUG
32284 +#define GLAMO_LOG(...)
32285 +#else
32286 +#define GLAMO_LOG(...) \
32287 +do { \
32288 + printk(KERN_DEBUG "in %s:%s:%d", __FILE__, __func__, __LINE__); \
32289 + printk(KERN_DEBUG __VA_ARGS__); \
32290 +} while (0);
32291 +#endif
32292 +
32293 +
32294 +#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)
32295 +
32296 +struct glamofb_handle {
32297 + struct fb_info *fb;
32298 + struct device *dev;
32299 + struct resource *reg;
32300 + struct resource *fb_res;
32301 + char __iomem *base;
32302 + struct glamofb_platform_data *mach_info;
32303 + char __iomem *cursor_addr;
32304 + int cursor_on;
32305 + u_int32_t pseudo_pal[16];
32306 + spinlock_t lock_cmd;
32307 +};
32308 +
32309 +/* 'sibling' spi device for lcm init */
32310 +static struct platform_device glamo_spi_dev = {
32311 + .name = "glamo-lcm-spi",
32312 +};
32313 +
32314 +
32315 +static int reg_read(struct glamofb_handle *glamo,
32316 + u_int16_t reg)
32317 +{
32318 + glamo_reg_access_delay();
32319 + return readw(glamo->base + reg);
32320 +}
32321 +
32322 +static void reg_write(struct glamofb_handle *glamo,
32323 + u_int16_t reg, u_int16_t val)
32324 +{
32325 + glamo_reg_access_delay();
32326 + writew(val, glamo->base + reg);
32327 +}
32328 +
32329 +static struct glamo_script glamo_regs[] = {
32330 + { GLAMO_REG_LCD_MODE1, 0x0020 },
32331 + /* no display rotation, no hardware cursor, no dither, no gamma,
32332 + * no retrace flip, vsync low-active, hsync low active,
32333 + * no TVCLK, no partial display, hw dest color from fb,
32334 + * no partial display mode, LCD1, software flip, */
32335 + { GLAMO_REG_LCD_MODE2, 0x1020 },
32336 + /* no video flip, no ptr, no ptr, dhclk off,
32337 + * normal mode, no cpuif,
32338 + * res, serial msb first, single fb, no fr ctrl,
32339 + * cpu if bits all zero, no crc
32340 + * 0000 0000 0010 0000 */
32341 + { GLAMO_REG_LCD_MODE3, 0x0b40 },
32342 + /* src data rgb565, res, 18bit rgb666
32343 + * 000 01 011 0100 0000 */
32344 + { GLAMO_REG_LCD_POLARITY, 0x440c },
32345 + /* DE high active, no cpu/lcd if, cs0 force low, a0 low active,
32346 + * np cpu if, 9bit serial data, sclk rising edge latch data
32347 + * 01 00 0 100 0 000 01 0 0 */
32348 + { GLAMO_REG_LCD_A_BASE1, 0x0000 }, /* display A base address 15:0 */
32349 + { GLAMO_REG_LCD_A_BASE2, 0x0000 }, /* display A base address 22:16 */
32350 + { GLAMO_REG_LCD_CURSOR_BASE1, 0x0000 }, /* cursor base address 15:0 */
32351 + { GLAMO_REG_LCD_CURSOR_BASE2, 0x000f }, /* cursor base address 22:16 */
32352 +};
32353 +
32354 +static int glamofb_run_script(struct glamofb_handle *glamo,
32355 + struct glamo_script *script, int len)
32356 +{
32357 + int i;
32358 +
32359 + for (i = 0; i < len; i++) {
32360 + struct glamo_script *line = &script[i];
32361 +
32362 + if (line->reg == 0xffff)
32363 + return 0;
32364 + else if (line->reg == 0xfffe)
32365 + msleep(line->val);
32366 + else
32367 + reg_write(glamo, script[i].reg, script[i].val);
32368 + }
32369 +
32370 + return 0;
32371 +}
32372 +
32373 +static int glamofb_check_var(struct fb_var_screeninfo *var,
32374 + struct fb_info *info)
32375 +{
32376 + struct glamofb_handle *glamo = info->par;
32377 +
32378 + if (var->yres > glamo->mach_info->yres.max)
32379 + var->yres = glamo->mach_info->yres.max;
32380 + else if (var->yres < glamo->mach_info->yres.min)
32381 + var->yres = glamo->mach_info->yres.min;
32382 +
32383 + if (var->xres > glamo->mach_info->xres.max)
32384 + var->xres = glamo->mach_info->xres.max;
32385 + else if (var->xres < glamo->mach_info->xres.min)
32386 + var->xres = glamo->mach_info->xres.min;
32387 +
32388 + if (var->bits_per_pixel > glamo->mach_info->bpp.max)
32389 + var->bits_per_pixel = glamo->mach_info->bpp.max;
32390 + else if (var->bits_per_pixel < glamo->mach_info->bpp.min)
32391 + var->bits_per_pixel = glamo->mach_info->bpp.min;
32392 +
32393 + /* FIXME: set rgb positions */
32394 + switch (var->bits_per_pixel) {
32395 + case 16:
32396 + switch (reg_read(glamo, GLAMO_REG_LCD_MODE3) & 0xc000) {
32397 + case GLAMO_LCD_SRC_RGB565:
32398 + var->red.offset = 11;
32399 + var->green.offset = 5;
32400 + var->blue.offset = 0;
32401 + var->red.length = 5;
32402 + var->green.length = 6;
32403 + var->blue.length = 5;
32404 + var->transp.length = 0;
32405 + break;
32406 + case GLAMO_LCD_SRC_ARGB1555:
32407 + var->transp.offset = 15;
32408 + var->red.offset = 10;
32409 + var->green.offset = 5;
32410 + var->blue.offset = 0;
32411 + var->transp.length = 1;
32412 + var->red.length = 5;
32413 + var->green.length = 5;
32414 + var->blue.length = 5;
32415 + break;
32416 + case GLAMO_LCD_SRC_ARGB4444:
32417 + var->transp.offset = 12;
32418 + var->red.offset = 8;
32419 + var->green.offset = 4;
32420 + var->blue.offset = 0;
32421 + var->transp.length = 4;
32422 + var->red.length = 4;
32423 + var->green.length = 4;
32424 + var->blue.length = 4;
32425 + break;
32426 + }
32427 + break;
32428 + case 24:
32429 + case 32:
32430 + default:
32431 + /* The Smedia Glamo doesn't support anything but 16bit color */
32432 + printk(KERN_ERR
32433 + "Smedia driver does not [yet?] support 24/32bpp\n");
32434 + return -EINVAL;
32435 + }
32436 +
32437 + return 0;
32438 +}
32439 +
32440 +static void reg_set_bit_mask(struct glamofb_handle *glamo,
32441 + u_int16_t reg, u_int16_t mask,
32442 + u_int16_t val)
32443 +{
32444 + u_int16_t tmp;
32445 +
32446 + val &= mask;
32447 +
32448 + tmp = reg_read(glamo, reg);
32449 + tmp &= ~mask;
32450 + tmp |= val;
32451 + reg_write(glamo, reg, tmp);
32452 +}
32453 +
32454 +#define GLAMO_LCD_WIDTH_MASK 0x03FF
32455 +#define GLAMO_LCD_HEIGHT_MASK 0x03FF
32456 +#define GLAMO_LCD_PITCH_MASK 0x07FE
32457 +#define GLAMO_LCD_HV_TOTAL_MASK 0x03FF
32458 +#define GLAMO_LCD_HV_RETR_START_MASK 0x03FF
32459 +#define GLAMO_LCD_HV_RETR_END_MASK 0x03FF
32460 +#define GLAMO_LCD_HV_RETR_DISP_START_MASK 0x03FF
32461 +#define GLAMO_LCD_HV_RETR_DISP_END_MASK 0x03FF
32462 +
32463 +enum orientation {
32464 + ORIENTATION_PORTRAIT,
32465 + ORIENTATION_LANDSCAPE
32466 +};
32467 +
32468 +
32469 +/* the caller has to enxure lock_cmd is held and we are in cmd mode */
32470 +static void __rotate_lcd(struct glamofb_handle *glamo, __u32 rotation)
32471 +{
32472 + int glamo_rot;
32473 +
32474 + switch (rotation) {
32475 + case FB_ROTATE_UR:
32476 + glamo_rot = GLAMO_LCD_ROT_MODE_0;
32477 + break;
32478 + case FB_ROTATE_CW:
32479 + glamo_rot = GLAMO_LCD_ROT_MODE_90;
32480 + break;
32481 + case FB_ROTATE_UD:
32482 + glamo_rot = GLAMO_LCD_ROT_MODE_180;
32483 + break;
32484 + case FB_ROTATE_CCW:
32485 + glamo_rot = GLAMO_LCD_ROT_MODE_270;
32486 + break;
32487 + default:
32488 + glamo_rot = GLAMO_LCD_ROT_MODE_0;
32489 + break;
32490 + }
32491 +
32492 + reg_set_bit_mask(glamo,
32493 + GLAMO_REG_LCD_WIDTH,
32494 + GLAMO_LCD_ROT_MODE_MASK,
32495 + glamo_rot);
32496 + reg_set_bit_mask(glamo,
32497 + GLAMO_REG_LCD_MODE1,
32498 + GLAMO_LCD_MODE1_ROTATE_EN,
32499 + (glamo_rot != GLAMO_LCD_ROT_MODE_0)?
32500 + GLAMO_LCD_MODE1_ROTATE_EN : 0);
32501 +}
32502 +
32503 +static enum orientation get_orientation(struct fb_var_screeninfo *var)
32504 +{
32505 + if (var->xres <= var->yres)
32506 + return ORIENTATION_PORTRAIT;
32507 +
32508 + return ORIENTATION_LANDSCAPE;
32509 +}
32510 +
32511 +static int will_orientation_change(struct fb_var_screeninfo *var)
32512 +{
32513 + enum orientation orient = get_orientation(var);
32514 +
32515 + switch (orient) {
32516 + case ORIENTATION_LANDSCAPE:
32517 + if (var->rotate == FB_ROTATE_UR ||
32518 + var->rotate == FB_ROTATE_UD)
32519 + return 1;
32520 + break;
32521 + case ORIENTATION_PORTRAIT:
32522 + if (var->rotate == FB_ROTATE_CW ||
32523 + var->rotate == FB_ROTATE_CCW)
32524 + return 1;
32525 + break;
32526 + }
32527 + return 0;
32528 +}
32529 +
32530 +static void glamofb_update_lcd_controller(struct glamofb_handle *glamo,
32531 + struct fb_var_screeninfo *var)
32532 +{
32533 + int sync, bp, disp, fp, total, xres, yres, pitch, orientation_changing;
32534 + unsigned long flags;
32535 +
32536 + if (!glamo || !var)
32537 + return;
32538 +
32539 + spin_lock_irqsave(&glamo->lock_cmd, flags);
32540 +
32541 + if (glamofb_cmd_mode(glamo, 1))
32542 + goto out_unlock;
32543 +
32544 + if (var->pixclock)
32545 + glamo_engine_reclock(glamo->mach_info->glamo,
32546 + GLAMO_ENGINE_LCD,
32547 + var->pixclock);
32548 +
32549 + xres = var->xres;
32550 + yres = var->yres;
32551 +
32552 + /* figure out if orientation is going to change */
32553 + orientation_changing = will_orientation_change(var);
32554 +
32555 + /* adjust the pitch according to new orientation to come */
32556 + if (orientation_changing) {
32557 + pitch = var->yres * var->bits_per_pixel / 8;
32558 + } else {
32559 + pitch = var->xres * var->bits_per_pixel / 8;
32560 + }
32561 +
32562 + /* set the awaiten LCD geometry */
32563 + reg_set_bit_mask(glamo,
32564 + GLAMO_REG_LCD_WIDTH,
32565 + GLAMO_LCD_WIDTH_MASK,
32566 + xres);
32567 + reg_set_bit_mask(glamo,
32568 + GLAMO_REG_LCD_HEIGHT,
32569 + GLAMO_LCD_HEIGHT_MASK,
32570 + yres);
32571 + reg_set_bit_mask(glamo,
32572 + GLAMO_REG_LCD_PITCH,
32573 + GLAMO_LCD_PITCH_MASK,
32574 + pitch);
32575 +
32576 + /* honour the rotation request */
32577 + __rotate_lcd(glamo, var->rotate);
32578 +
32579 + /* update the reported geometry of the framebuffer. */
32580 + if (orientation_changing) {
32581 + var->xres_virtual = var->xres = yres;
32582 + var->yres_virtual = var->yres = xres;
32583 + } else {
32584 + var->xres_virtual = var->xres = xres;
32585 + var->yres_virtual = var->yres = yres;
32586 + }
32587 +
32588 + /* update scannout timings */
32589 + sync = 0;
32590 + bp = sync + var->hsync_len;
32591 + disp = bp + var->left_margin;
32592 + fp = disp + xres;
32593 + total = fp + var->right_margin;
32594 +
32595 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_TOTAL,
32596 + GLAMO_LCD_HV_TOTAL_MASK, total);
32597 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_RETR_START,
32598 + GLAMO_LCD_HV_RETR_START_MASK, sync);
32599 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_RETR_END,
32600 + GLAMO_LCD_HV_RETR_END_MASK, bp);
32601 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_DISP_START,
32602 + GLAMO_LCD_HV_RETR_DISP_START_MASK, disp);
32603 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_HORIZ_DISP_END,
32604 + GLAMO_LCD_HV_RETR_DISP_END_MASK, fp);
32605 +
32606 + sync = 0;
32607 + bp = sync + var->vsync_len;
32608 + disp = bp + var->upper_margin;
32609 + fp = disp + yres;
32610 + total = fp + var->lower_margin;
32611 +
32612 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_TOTAL,
32613 + GLAMO_LCD_HV_TOTAL_MASK, total);
32614 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_RETR_START,
32615 + GLAMO_LCD_HV_RETR_START_MASK, sync);
32616 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_RETR_END,
32617 + GLAMO_LCD_HV_RETR_END_MASK, bp);
32618 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_DISP_START,
32619 + GLAMO_LCD_HV_RETR_DISP_START_MASK, disp);
32620 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_VERT_DISP_END,
32621 + GLAMO_LCD_HV_RETR_DISP_END_MASK, fp);
32622 +
32623 + glamofb_cmd_mode(glamo, 0);
32624 +
32625 +out_unlock:
32626 + spin_unlock_irqrestore(&glamo->lock_cmd, flags);
32627 +}
32628 +
32629 +static int glamofb_set_par(struct fb_info *info)
32630 +{
32631 + struct glamofb_handle *glamo = info->par;
32632 + struct fb_var_screeninfo *var = &info->var;
32633 +
32634 + switch (var->bits_per_pixel) {
32635 + case 16:
32636 + info->fix.visual = FB_VISUAL_TRUECOLOR;
32637 + break;
32638 + default:
32639 + printk("Smedia driver doesn't support != 16bpp\n");
32640 + return -EINVAL;
32641 + }
32642 +
32643 + info->fix.line_length = (var->xres * var->bits_per_pixel) / 8;
32644 +
32645 + glamofb_update_lcd_controller(glamo, var);
32646 +
32647 + return 0;
32648 +}
32649 +
32650 +static int glamofb_blank(int blank_mode, struct fb_info *info)
32651 +{
32652 + struct glamofb_handle *gfb = info->par;
32653 + struct glamo_core *gcore = gfb->mach_info->glamo;
32654 +
32655 + dev_dbg(gfb->dev, "glamofb_blank(%u)\n", blank_mode);
32656 +
32657 + switch (blank_mode) {
32658 + case FB_BLANK_VSYNC_SUSPEND:
32659 + case FB_BLANK_HSYNC_SUSPEND:
32660 + /* FIXME: add pdata hook/flag to indicate whether
32661 + * we should already switch off pixel clock here */
32662 + break;
32663 + case FB_BLANK_POWERDOWN:
32664 + /* disable the pixel clock */
32665 + glamo_engine_clkreg_set(gcore, GLAMO_ENGINE_LCD,
32666 + GLAMO_CLOCK_LCD_EN_DCLK, 0);
32667 + break;
32668 + case FB_BLANK_UNBLANK:
32669 + case FB_BLANK_NORMAL:
32670 + /* enable the pixel clock */
32671 + glamo_engine_clkreg_set(gcore, GLAMO_ENGINE_LCD,
32672 + GLAMO_CLOCK_LCD_EN_DCLK,
32673 + GLAMO_CLOCK_LCD_EN_DCLK);
32674 + break;
32675 + }
32676 +
32677 + /* FIXME: once we have proper clock management in glamo-core,
32678 + * we can determine if other units need MCLK1 or the PLL, and
32679 + * disable it if not used. */
32680 + return 0;
32681 +}
32682 +
32683 +static inline unsigned int chan_to_field(unsigned int chan,
32684 + struct fb_bitfield *bf)
32685 +{
32686 + chan &= 0xffff;
32687 + chan >>= 16 - bf->length;
32688 + return chan << bf->offset;
32689 +}
32690 +
32691 +static int glamofb_setcolreg(unsigned regno,
32692 + unsigned red, unsigned green, unsigned blue,
32693 + unsigned transp, struct fb_info *info)
32694 +{
32695 + struct glamofb_handle *glamo = info->par;
32696 + unsigned int val;
32697 +
32698 + switch (glamo->fb->fix.visual) {
32699 + case FB_VISUAL_TRUECOLOR:
32700 + case FB_VISUAL_DIRECTCOLOR:
32701 + /* true-colour, use pseuo-palette */
32702 +
32703 + if (regno < 16) {
32704 + u32 *pal = glamo->fb->pseudo_palette;
32705 +
32706 + val = chan_to_field(red, &glamo->fb->var.red);
32707 + val |= chan_to_field(green, &glamo->fb->var.green);
32708 + val |= chan_to_field(blue, &glamo->fb->var.blue);
32709 +
32710 + pal[regno] = val;
32711 + };
32712 + break;
32713 + default:
32714 + return 1; /* unknown type */
32715 + }
32716 +
32717 + return 0;
32718 +}
32719 +
32720 +#ifdef CONFIG_MFD_GLAMO_HWACCEL
32721 +static inline void glamofb_vsync_wait(struct glamofb_handle *glamo,
32722 + int line, int size, int range)
32723 +{
32724 + int count[2];
32725 +
32726 + do {
32727 + count[0] = reg_read(glamo, GLAMO_REG_LCD_STATUS2) & 0x3ff;
32728 + count[1] = reg_read(glamo, GLAMO_REG_LCD_STATUS2) & 0x3ff;
32729 + } while (count[0] != count[1] ||
32730 + (line < count[0] + range &&
32731 + size > count[0] - range) ||
32732 + count[0] < range * 2);
32733 +}
32734 +
32735 +/*
32736 + * Enable/disable the hardware cursor mode altogether
32737 + * (for blinking and such, use glamofb_cursor()).
32738 + */
32739 +static void glamofb_cursor_onoff(struct glamofb_handle *glamo, int on)
32740 +{
32741 + int y, size;
32742 +
32743 + if (glamo->cursor_on) {
32744 + y = reg_read(glamo, GLAMO_REG_LCD_CURSOR_Y_POS);
32745 + size = reg_read(glamo, GLAMO_REG_LCD_CURSOR_Y_SIZE);
32746 +
32747 + glamofb_vsync_wait(glamo, y, size, 30);
32748 + }
32749 +
32750 + reg_set_bit_mask(glamo, GLAMO_REG_LCD_MODE1,
32751 + GLAMO_LCD_MODE1_CURSOR_EN,
32752 + on ? GLAMO_LCD_MODE1_CURSOR_EN : 0);
32753 + glamo->cursor_on = on;
32754 +
32755 + /* Hide the cursor by default */
32756 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_SIZE, 0);
32757 +}
32758 +
32759 +static int glamofb_cursor(struct fb_info *info, struct fb_cursor *cursor)
32760 +{
32761 + struct glamofb_handle *glamo = info->par;
32762 + unsigned long flags;
32763 +
32764 + spin_lock_irqsave(&glamo->lock_cmd, flags);
32765 +
32766 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_SIZE,
32767 + cursor->enable ? cursor->image.width : 0);
32768 +
32769 + if (cursor->set & FB_CUR_SETPOS) {
32770 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_X_POS,
32771 + cursor->image.dx);
32772 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_Y_POS,
32773 + cursor->image.dy);
32774 + }
32775 +
32776 + if (cursor->set & FB_CUR_SETCMAP) {
32777 + uint16_t fg = glamo->pseudo_pal[cursor->image.fg_color];
32778 + uint16_t bg = glamo->pseudo_pal[cursor->image.bg_color];
32779 +
32780 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_FG_COLOR, fg);
32781 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_BG_COLOR, bg);
32782 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_DST_COLOR, fg);
32783 + }
32784 +
32785 + if (cursor->set & FB_CUR_SETHOT)
32786 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_PRESET,
32787 + (cursor->hot.x << 8) | cursor->hot.y);
32788 +
32789 + if ((cursor->set & FB_CUR_SETSIZE) ||
32790 + (cursor->set & (FB_CUR_SETIMAGE | FB_CUR_SETSHAPE))) {
32791 + int x, y, pitch, op;
32792 + const uint8_t *pcol = cursor->image.data;
32793 + const uint8_t *pmsk = cursor->mask;
32794 + uint8_t __iomem *dst = glamo->cursor_addr;
32795 + uint8_t dcol = 0;
32796 + uint8_t dmsk = 0;
32797 + uint8_t byte = 0;
32798 +
32799 + if (cursor->image.depth > 1) {
32800 + spin_unlock_irqrestore(&glamo->lock_cmd, flags);
32801 + return -EINVAL;
32802 + }
32803 +
32804 + pitch = ((cursor->image.width + 7) >> 2) & ~1;
32805 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_PITCH,
32806 + pitch);
32807 + reg_write(glamo, GLAMO_REG_LCD_CURSOR_Y_SIZE,
32808 + cursor->image.height);
32809 +
32810 + for (y = 0; y < cursor->image.height; y++) {
32811 + byte = 0;
32812 + for (x = 0; x < cursor->image.width; x++) {
32813 + if ((x % 8) == 0) {
32814 + dcol = *pcol++;
32815 + dmsk = *pmsk++;
32816 + } else {
32817 + dcol >>= 1;
32818 + dmsk >>= 1;
32819 + }
32820 +
32821 + if (cursor->rop == ROP_COPY)
32822 + op = (dmsk & 1) ?
32823 + (dcol & 1) ? 1 : 3 : 0;
32824 + else
32825 + op = ((dmsk & 1) << 1) |
32826 + ((dcol & 1) << 0);
32827 + byte |= op << ((x & 3) << 1);
32828 +
32829 + if (x % 4 == 3) {
32830 + writeb(byte, dst + x / 4);
32831 + byte = 0;
32832 + }
32833 + }
32834 + if (x % 4) {
32835 + writeb(byte, dst + x / 4);
32836 + byte = 0;
32837 + }
32838 +
32839 + dst += pitch;
32840 + }
32841 + }
32842 +
32843 + spin_unlock_irqrestore(&glamo->lock_cmd, flags);
32844 +
32845 + return 0;
32846 +}
32847 +#endif
32848 +
32849 +static inline int glamofb_cmdq_empty(struct glamofb_handle *gfb)
32850 +{
32851 + /* DGCMdQempty -- 1 == command queue is empty */
32852 + return reg_read(gfb, GLAMO_REG_LCD_STATUS1) & (1 << 15);
32853 +}
32854 +
32855 +/* call holding gfb->lock_cmd when locking, until you unlock */
32856 +int glamofb_cmd_mode(struct glamofb_handle *gfb, int on)
32857 +{
32858 + int timeout = 200000;
32859 +
32860 + dev_dbg(gfb->dev, "glamofb_cmd_mode(gfb=%p, on=%d)\n", gfb, on);
32861 + if (on) {
32862 + dev_dbg(gfb->dev, "%s: waiting for cmdq empty: ",
32863 + __FUNCTION__);
32864 + while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
32865 + yield();
32866 + if (timeout < 0) {
32867 + printk(KERN_ERR"*************"
32868 + "glamofb cmd_queue never got empty"
32869 + "*************\n");
32870 + return -EIO;
32871 + }
32872 + dev_dbg(gfb->dev, "empty!\n");
32873 +
32874 + /* display the entire frame then switch to command */
32875 + reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
32876 + GLAMO_LCD_CMD_TYPE_DISP |
32877 + GLAMO_LCD_CMD_DATA_FIRE_VSYNC);
32878 +
32879 + /* wait until LCD is idle */
32880 + dev_dbg(gfb->dev, "waiting for LCD idle: ");
32881 + timeout = 200000;
32882 + while ((!reg_read(gfb, GLAMO_REG_LCD_STATUS2) & (1 << 12)) &&
32883 + (timeout--))
32884 + yield();
32885 + if (timeout < 0) {
32886 + printk(KERN_ERR"*************"
32887 + "glamofb lcd never idle"
32888 + "*************\n");
32889 + return -EIO;
32890 + }
32891 + dev_dbg(gfb->dev, "idle!\n");
32892 +
32893 + mdelay(100);
32894 + } else {
32895 + /* RGB interface needs vsync/hsync */
32896 + if (reg_read(gfb, GLAMO_REG_LCD_MODE3) & GLAMO_LCD_MODE3_RGB)
32897 + reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
32898 + GLAMO_LCD_CMD_TYPE_DISP |
32899 + GLAMO_LCD_CMD_DATA_DISP_SYNC);
32900 +
32901 + reg_write(gfb, GLAMO_REG_LCD_COMMAND1,
32902 + GLAMO_LCD_CMD_TYPE_DISP |
32903 + GLAMO_LCD_CMD_DATA_DISP_FIRE);
32904 + }
32905 +
32906 + return 0;
32907 +}
32908 +EXPORT_SYMBOL_GPL(glamofb_cmd_mode);
32909 +
32910 +int glamofb_cmd_write(struct glamofb_handle *gfb, u_int16_t val)
32911 +{
32912 + int timeout = 200000;
32913 +
32914 + dev_dbg(gfb->dev, "%s: waiting for cmdq empty\n", __FUNCTION__);
32915 + while ((!glamofb_cmdq_empty(gfb)) && (timeout--))
32916 + yield();
32917 + if (timeout < 0) {
32918 + printk(KERN_ERR"*************"
32919 + "glamofb cmd_queue never got empty"
32920 + "*************\n");
32921 + return 1;
32922 + }
32923 + dev_dbg(gfb->dev, "idle, writing 0x%04x\n", val);
32924 +
32925 + reg_write(gfb, GLAMO_REG_LCD_COMMAND1, val);
32926 +
32927 + return 0;
32928 +}
32929 +EXPORT_SYMBOL_GPL(glamofb_cmd_write);
32930 +
32931 +static struct fb_ops glamofb_ops = {
32932 + .owner = THIS_MODULE,
32933 + .fb_check_var = glamofb_check_var,
32934 + .fb_set_par = glamofb_set_par,
32935 + .fb_blank = glamofb_blank,
32936 + .fb_setcolreg = glamofb_setcolreg,
32937 +#ifdef CONFIG_MFD_GLAMO_HWACCEL
32938 + .fb_cursor = glamofb_cursor,
32939 +#endif
32940 + .fb_fillrect = cfb_fillrect,
32941 + .fb_copyarea = cfb_copyarea,
32942 + .fb_imageblit = cfb_imageblit,
32943 +};
32944 +
32945 +static int glamofb_init_regs(struct glamofb_handle *glamo)
32946 +{
32947 + struct fb_info *info = glamo->fb;
32948 +
32949 + glamofb_check_var(&info->var, info);
32950 + glamofb_run_script(glamo, glamo_regs, ARRAY_SIZE(glamo_regs));
32951 + glamofb_set_par(info);
32952 +
32953 + return 0;
32954 +}
32955 +
32956 +static int __init glamofb_probe(struct platform_device *pdev)
32957 +{
32958 + int rc = -EIO;
32959 + struct fb_info *fbinfo;
32960 + struct glamofb_handle *glamofb;
32961 + struct glamofb_platform_data *mach_info = pdev->dev.platform_data;
32962 +
32963 + printk(KERN_INFO "SMEDIA Glamo frame buffer driver (C) 2007 "
32964 + "Openmoko, Inc.\n");
32965 +
32966 + fbinfo = framebuffer_alloc(sizeof(struct glamofb_handle), &pdev->dev);
32967 + if (!fbinfo)
32968 + return -ENOMEM;
32969 +
32970 + glamofb = fbinfo->par;
32971 + glamofb->fb = fbinfo;
32972 + glamofb->dev = &pdev->dev;
32973 +
32974 + strcpy(fbinfo->fix.id, "SMedia Glamo");
32975 +
32976 + glamofb->reg = platform_get_resource_byname(pdev, IORESOURCE_MEM,
32977 + "glamo-fb-regs");
32978 + if (!glamofb->reg) {
32979 + dev_err(&pdev->dev, "platform device with no registers?\n");
32980 + rc = -ENOENT;
32981 + goto out_free;
32982 + }
32983 +
32984 + glamofb->fb_res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
32985 + "glamo-fb-mem");
32986 + if (!glamofb->fb_res) {
32987 + dev_err(&pdev->dev, "platform device with no memory ?\n");
32988 + rc = -ENOENT;
32989 + goto out_free;
32990 + }
32991 +
32992 + glamofb->reg = request_mem_region(glamofb->reg->start,
32993 + RESSIZE(glamofb->reg), pdev->name);
32994 + if (!glamofb->reg) {
32995 + dev_err(&pdev->dev, "failed to request mmio region\n");
32996 + goto out_free;
32997 + }
32998 +
32999 + glamofb->fb_res = request_mem_region(glamofb->fb_res->start,
33000 + mach_info->fb_mem_size,
33001 + pdev->name);
33002 + if (!glamofb->fb_res) {
33003 + dev_err(&pdev->dev, "failed to request vram region\n");
33004 + goto out_release_reg;
33005 + }
33006 +
33007 + /* we want to remap only the registers required for this core
33008 + * driver. */
33009 + glamofb->base = ioremap(glamofb->reg->start, RESSIZE(glamofb->reg));
33010 + if (!glamofb->base) {
33011 + dev_err(&pdev->dev, "failed to ioremap() mmio memory\n");
33012 + goto out_release_fb;
33013 + }
33014 + fbinfo->fix.smem_start = (unsigned long) glamofb->fb_res->start;
33015 + fbinfo->fix.smem_len = mach_info->fb_mem_size;
33016 +
33017 + fbinfo->screen_base = ioremap(glamofb->fb_res->start,
33018 + RESSIZE(glamofb->fb_res));
33019 + if (!fbinfo->screen_base) {
33020 + dev_err(&pdev->dev, "failed to ioremap() vram memory\n");
33021 + goto out_release_fb;
33022 + }
33023 + glamofb->cursor_addr = fbinfo->screen_base + 0xf0000;
33024 +
33025 + platform_set_drvdata(pdev, fbinfo);
33026 +
33027 + glamofb->mach_info = pdev->dev.platform_data;
33028 +
33029 + fbinfo->fix.visual = FB_VISUAL_TRUECOLOR;
33030 + fbinfo->fix.type = FB_TYPE_PACKED_PIXELS;
33031 + fbinfo->fix.type_aux = 0;
33032 + fbinfo->fix.xpanstep = 0;
33033 + fbinfo->fix.ypanstep = 0;
33034 + fbinfo->fix.ywrapstep = 0;
33035 + fbinfo->fix.accel = FB_ACCEL_GLAMO;
33036 +
33037 + fbinfo->var.nonstd = 0;
33038 + fbinfo->var.activate = FB_ACTIVATE_NOW;
33039 + fbinfo->var.height = mach_info->height;
33040 + fbinfo->var.width = mach_info->width;
33041 + fbinfo->var.accel_flags = 0; /* FIXME */
33042 + fbinfo->var.vmode = FB_VMODE_NONINTERLACED;
33043 +
33044 + fbinfo->fbops = &glamofb_ops;
33045 + fbinfo->flags = FBINFO_FLAG_DEFAULT;
33046 + fbinfo->pseudo_palette = &glamofb->pseudo_pal;
33047 +
33048 + fbinfo->var.xres = mach_info->xres.defval;
33049 + fbinfo->var.xres_virtual = mach_info->xres.defval;
33050 + fbinfo->var.yres = mach_info->yres.defval;
33051 + fbinfo->var.yres_virtual = mach_info->yres.defval;
33052 + fbinfo->var.bits_per_pixel = mach_info->bpp.defval;
33053 +
33054 + fbinfo->var.pixclock = mach_info->pixclock;
33055 + fbinfo->var.left_margin = mach_info->left_margin;
33056 + fbinfo->var.right_margin = mach_info->right_margin;
33057 + fbinfo->var.upper_margin = mach_info->upper_margin;
33058 + fbinfo->var.lower_margin = mach_info->lower_margin;
33059 + fbinfo->var.hsync_len = mach_info->hsync_len;
33060 + fbinfo->var.vsync_len = mach_info->vsync_len;
33061 +
33062 + memset(fbinfo->screen_base, 0, fbinfo->fix.smem_len);
33063 +
33064 + glamo_engine_enable(mach_info->glamo, GLAMO_ENGINE_LCD);
33065 + glamo_engine_reset(mach_info->glamo, GLAMO_ENGINE_LCD);
33066 +
33067 + spin_lock_init(&glamofb->lock_cmd);
33068 + glamofb_init_regs(glamofb);
33069 +#ifdef CONFIG_MFD_GLAMO_HWACCEL
33070 + glamofb_cursor_onoff(glamofb, 1);
33071 +#endif
33072 +
33073 + rc = register_framebuffer(fbinfo);
33074 + if (rc < 0) {
33075 + dev_err(&pdev->dev, "failed to register framebuffer\n");
33076 + goto out_unmap_fb;
33077 + }
33078 +
33079 + if (mach_info->spi_info) {
33080 + /* register the sibling spi device */
33081 + mach_info->spi_info->glamofb_handle = glamofb;
33082 + glamo_spi_dev.dev.parent = &pdev->dev;
33083 + glamo_spi_dev.dev.platform_data = mach_info->spi_info;
33084 + platform_device_register(&glamo_spi_dev);
33085 + }
33086 +
33087 + printk(KERN_INFO "fb%d: %s frame buffer device\n",
33088 + fbinfo->node, fbinfo->fix.id);
33089 +
33090 + return 0;
33091 +
33092 +out_unmap_fb:
33093 + iounmap(fbinfo->screen_base);
33094 + iounmap(glamofb->base);
33095 +out_release_fb:
33096 + release_mem_region(glamofb->fb_res->start, RESSIZE(glamofb->fb_res));
33097 +out_release_reg:
33098 + release_mem_region(glamofb->reg->start, RESSIZE(glamofb->reg));
33099 +out_free:
33100 + framebuffer_release(fbinfo);
33101 + return rc;
33102 +}
33103 +
33104 +static int glamofb_remove(struct platform_device *pdev)
33105 +{
33106 + struct glamofb_handle *glamofb = platform_get_drvdata(pdev);
33107 +
33108 + platform_set_drvdata(pdev, NULL);
33109 + iounmap(glamofb->base);
33110 + release_mem_region(glamofb->reg->start, RESSIZE(glamofb->reg));
33111 + kfree(glamofb);
33112 +
33113 + return 0;
33114 +}
33115 +
33116 +static struct platform_driver glamofb_driver = {
33117 + .probe = glamofb_probe,
33118 + .remove = glamofb_remove,
33119 + .driver = {
33120 + .name = "glamo-fb",
33121 + .owner = THIS_MODULE,
33122 + },
33123 +};
33124 +
33125 +static int __devinit glamofb_init(void)
33126 +{
33127 + return platform_driver_register(&glamofb_driver);
33128 +}
33129 +
33130 +static void __exit glamofb_cleanup(void)
33131 +{
33132 + platform_driver_unregister(&glamofb_driver);
33133 +}
33134 +
33135 +module_init(glamofb_init);
33136 +module_exit(glamofb_cleanup);
33137 +
33138 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
33139 +MODULE_DESCRIPTION("Smedia Glamo 336x/337x framebuffer driver");
33140 +MODULE_LICENSE("GPL");
33141 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-gpio.c
33142 ===================================================================
33143 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
33144 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-gpio.c 2008-12-11 22:46:49.000000000 +0100
33145 @@ -0,0 +1,62 @@
33146 +
33147 +#include <linux/kernel.h>
33148 +#include <linux/module.h>
33149 +#include <linux/spinlock.h>
33150 +#include <linux/io.h>
33151 +
33152 +#include <linux/glamo-gpio.h>
33153 +
33154 +#include "glamo-core.h"
33155 +#include "glamo-regs.h"
33156 +
33157 +void glamo_gpio_setpin(struct glamo_core *glamo, unsigned int pin,
33158 + unsigned int value)
33159 +{
33160 + unsigned int reg = REG_OF_GPIO(pin);
33161 + u_int16_t tmp;
33162 +
33163 + spin_lock(&glamo->lock);
33164 + tmp = readw(glamo->base + reg);
33165 + if (value)
33166 + tmp |= OUTPUT_BIT(pin);
33167 + else
33168 + tmp &= ~OUTPUT_BIT(pin);
33169 + writew(tmp, glamo->base + reg);
33170 + spin_unlock(&glamo->lock);
33171 +}
33172 +EXPORT_SYMBOL(glamo_gpio_setpin);
33173 +
33174 +int glamo_gpio_getpin(struct glamo_core *glamo, unsigned int pin)
33175 +{
33176 + return readw(REG_OF_GPIO(pin)) & INPUT_BIT(pin) ? 1 : 0;
33177 +}
33178 +EXPORT_SYMBOL(glamo_gpio_getpin);
33179 +
33180 +void glamo_gpio_cfgpin(struct glamo_core *glamo, unsigned int pinfunc)
33181 +{
33182 + unsigned int reg = REG_OF_GPIO(pinfunc);
33183 + u_int16_t tmp;
33184 +
33185 + spin_lock(&glamo->lock);
33186 + tmp = readw(glamo->base + reg);
33187 +
33188 + if ((pinfunc & 0x00f0) == GLAMO_GPIO_F_FUNC) {
33189 + /* pin is a function pin: clear gpio bit */
33190 + tmp &= ~FUNC_BIT(pinfunc);
33191 + } else {
33192 + /* pin is gpio: set gpio bit */
33193 + tmp |= FUNC_BIT(pinfunc);
33194 +
33195 + if (pinfunc & GLAMO_GPIO_F_IN) {
33196 + /* gpio input: set bit to disable output mode */
33197 + tmp |= GPIO_OUT_BIT(pinfunc);
33198 + } else if (pinfunc & GLAMO_GPIO_F_OUT) {
33199 + /* gpio output: clear bit to enable output mode */
33200 + tmp &= ~GPIO_OUT_BIT(pinfunc);
33201 + }
33202 + }
33203 + writew(tmp, glamo->base + reg);
33204 + spin_unlock(&glamo->lock);
33205 +}
33206 +EXPORT_SYMBOL(glamo_gpio_cfgpin);
33207 +
33208 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-lcm-spi.c
33209 ===================================================================
33210 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
33211 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-lcm-spi.c 2008-12-11 22:46:49.000000000 +0100
33212 @@ -0,0 +1,240 @@
33213 +/*
33214 + * Copyright (C) 2007 Openmoko, Inc.
33215 + * Author: Harald Welte <laforge@openmoko.org>
33216 + *
33217 + * Smedia Glamo GPIO based SPI driver
33218 + *
33219 + * This program is free software; you can redistribute it and/or modify
33220 + * it under the terms of the GNU General Public License version 2 as
33221 + * published by the Free Software Foundation.
33222 + *
33223 + * This driver currently only implements a minimum subset of the hardware
33224 + * features, esp. those features that are required to drive the jbt6k74
33225 + * LCM controller asic in the TD028TTEC1 LCM.
33226 + *
33227 +*/
33228 +
33229 +#define DEBUG
33230 +
33231 +#include <linux/kernel.h>
33232 +#include <linux/init.h>
33233 +#include <linux/delay.h>
33234 +#include <linux/device.h>
33235 +#include <linux/spinlock.h>
33236 +#include <linux/workqueue.h>
33237 +#include <linux/platform_device.h>
33238 +
33239 +#include <linux/spi/spi.h>
33240 +#include <linux/spi/spi_bitbang.h>
33241 +#include <linux/spi/glamo.h>
33242 +
33243 +#include <linux/glamofb.h>
33244 +
33245 +#include <asm/hardware.h>
33246 +
33247 +#include "glamo-core.h"
33248 +#include "glamo-regs.h"
33249 +
33250 +struct glamo_spi {
33251 + struct spi_bitbang bitbang;
33252 + struct spi_master *master;
33253 + struct glamo_spi_info *info;
33254 + struct device *dev;
33255 +};
33256 +
33257 +static inline struct glamo_spi *to_gs(struct spi_device *spi)
33258 +{
33259 + return spi->controller_data;
33260 +}
33261 +
33262 +static int glamo_spi_setupxfer(struct spi_device *spi, struct spi_transfer *t)
33263 +{
33264 + unsigned int bpw;
33265 +
33266 + bpw = t ? t->bits_per_word : spi->bits_per_word;
33267 +
33268 + if (bpw != 9 && bpw != 8) {
33269 + dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw);
33270 + return -EINVAL;
33271 + }
33272 +
33273 + return 0;
33274 +}
33275 +
33276 +static void glamo_spi_chipsel(struct spi_device *spi, int value)
33277 +{
33278 +#if 0
33279 + struct glamo_spi *gs = to_gs(spi);
33280 +
33281 + dev_dbg(&spi->dev, "chipsel %d: spi=%p, gs=%p, info=%p, handle=%p\n",
33282 + value, spi, gs, gs->info, gs->info->glamofb_handle);
33283 +
33284 + glamofb_cmd_mode(gs->info->glamofb_handle, value);
33285 +#endif
33286 +}
33287 +
33288 +static int glamo_spi_txrx(struct spi_device *spi, struct spi_transfer *t)
33289 +{
33290 + struct glamo_spi *gs = to_gs(spi);
33291 + const u_int16_t *ui16 = (const u_int16_t *) t->tx_buf;
33292 + u_int16_t nine_bits;
33293 + int i;
33294 +
33295 + dev_dbg(&spi->dev, "txrx: tx %p, rx %p, bpw %d, len %d\n",
33296 + t->tx_buf, t->rx_buf, t->bits_per_word, t->len);
33297 +
33298 + if (spi->bits_per_word == 9)
33299 + nine_bits = (1 << 9);
33300 + else
33301 + nine_bits = 0;
33302 +
33303 + if (t->len > 3 * sizeof(u_int16_t)) {
33304 + dev_err(&spi->dev, "this driver doesn't support "
33305 + "%u sized xfers\n", t->len);
33306 + return -EINVAL;
33307 + }
33308 +
33309 + for (i = 0; i < t->len/sizeof(u_int16_t); i++) {
33310 + /* actually transfer the data */
33311 +#if 1
33312 + glamofb_cmd_write(gs->info->glamofb_handle,
33313 + GLAMO_LCD_CMD_TYPE_SERIAL | nine_bits |
33314 + (1 << 10) | (1 << 11) | (ui16[i] & 0x1ff));
33315 +#endif
33316 + /* FIXME: fire ?!? */
33317 + if (i == 0 && (ui16[i] & 0x1ff) == 0x29) {
33318 + dev_dbg(&spi->dev, "leaving command mode\n");
33319 + glamofb_cmd_mode(gs->info->glamofb_handle, 0);
33320 + }
33321 + }
33322 +
33323 + return t->len;
33324 +}
33325 +
33326 +static int glamo_spi_setup(struct spi_device *spi)
33327 +{
33328 + int ret;
33329 +
33330 + if (!spi->bits_per_word)
33331 + spi->bits_per_word = 9;
33332 +
33333 + /* FIXME: hardware can do this */
33334 + if (spi->mode & SPI_LSB_FIRST)
33335 + return -EINVAL;
33336 +
33337 + ret = glamo_spi_setupxfer(spi, NULL);
33338 + if (ret < 0) {
33339 + dev_err(&spi->dev, "setupxfer returned %d\n", ret);
33340 + return ret;
33341 + }
33342 +
33343 + dev_dbg(&spi->dev, "%s: mode %d, %u bpw\n",
33344 + __FUNCTION__, spi->mode, spi->bits_per_word);
33345 +
33346 + return 0;
33347 +}
33348 +
33349 +static int glamo_spi_probe(struct platform_device *pdev)
33350 +{
33351 + struct spi_master *master;
33352 + struct glamo_spi *sp;
33353 + int ret;
33354 + int i;
33355 +
33356 + master = spi_alloc_master(&pdev->dev, sizeof(struct glamo_spi));
33357 + if (master == NULL) {
33358 + dev_err(&pdev->dev, "failed to allocate spi master\n");
33359 + ret = -ENOMEM;
33360 + goto err;
33361 + }
33362 +
33363 + sp = spi_master_get_devdata(master);
33364 + memset(sp, 0, sizeof(struct glamo_spi));
33365 +
33366 + sp->master = spi_master_get(master);
33367 + sp->info = pdev->dev.platform_data;
33368 + if (!sp->info) {
33369 + dev_err(&pdev->dev, "can't operate without platform data\n");
33370 + ret = -EIO;
33371 + goto err_no_pdev;
33372 + }
33373 + dev_dbg(&pdev->dev, "sp->info(pdata) = %p\n", sp->info);
33374 +
33375 + sp->dev = &pdev->dev;
33376 +
33377 + platform_set_drvdata(pdev, sp);
33378 +
33379 + sp->bitbang.master = sp->master;
33380 + sp->bitbang.setup_transfer = glamo_spi_setupxfer;
33381 + sp->bitbang.chipselect = glamo_spi_chipsel;
33382 + sp->bitbang.txrx_bufs = glamo_spi_txrx;
33383 + sp->bitbang.master->setup = glamo_spi_setup;
33384 +
33385 + ret = spi_bitbang_start(&sp->bitbang);
33386 + if (ret)
33387 + goto err_no_bitbang;
33388 +
33389 + /* register the chips to go with the board */
33390 +
33391 + glamofb_cmd_mode(sp->info->glamofb_handle, 1);
33392 +
33393 + for (i = 0; i < sp->info->board_size; i++) {
33394 + dev_info(&pdev->dev, "registering %p: %s\n",
33395 + &sp->info->board_info[i],
33396 + sp->info->board_info[i].modalias);
33397 +
33398 + sp->info->board_info[i].controller_data = sp;
33399 + spi_new_device(master, sp->info->board_info + i);
33400 + }
33401 +
33402 + return 0;
33403 +
33404 +err_no_bitbang:
33405 + platform_set_drvdata(pdev, NULL);
33406 +err_no_pdev:
33407 + spi_master_put(sp->bitbang.master);
33408 +err:
33409 + return ret;
33410 +
33411 +}
33412 +
33413 +static int glamo_spi_remove(struct platform_device *pdev)
33414 +{
33415 + struct glamo_spi *sp = platform_get_drvdata(pdev);
33416 +
33417 + spi_bitbang_stop(&sp->bitbang);
33418 + spi_master_put(sp->bitbang.master);
33419 +
33420 + return 0;
33421 +}
33422 +
33423 +#define glamo_spi_suspend NULL
33424 +#define glamo_spi_resume NULL
33425 +
33426 +static struct platform_driver glamo_spi_drv = {
33427 + .probe = glamo_spi_probe,
33428 + .remove = glamo_spi_remove,
33429 + .suspend = glamo_spi_suspend,
33430 + .resume = glamo_spi_resume,
33431 + .driver = {
33432 + .name = "glamo-lcm-spi",
33433 + .owner = THIS_MODULE,
33434 + },
33435 +};
33436 +
33437 +static int __init glamo_spi_init(void)
33438 +{
33439 + return platform_driver_register(&glamo_spi_drv);
33440 +}
33441 +
33442 +static void __exit glamo_spi_exit(void)
33443 +{
33444 + platform_driver_unregister(&glamo_spi_drv);
33445 +}
33446 +
33447 +module_init(glamo_spi_init);
33448 +module_exit(glamo_spi_exit);
33449 +
33450 +MODULE_DESCRIPTION("Smedia Glamo 336x/337x LCM serial command SPI Driver");
33451 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>")
33452 +MODULE_LICENSE("GPL");
33453 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-mci.c
33454 ===================================================================
33455 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
33456 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-mci.c 2008-12-11 22:46:49.000000000 +0100
33457 @@ -0,0 +1,1062 @@
33458 +/*
33459 + * linux/drivers/mmc/host/glamo-mmc.c - Glamo MMC driver
33460 + *
33461 + * Copyright (C) 2007 Openmoko, Inc, Andy Green <andy@openmoko.com>
33462 + * Based on S3C MMC driver that was:
33463 + * Copyright (C) 2004-2006 maintech GmbH, Thomas Kleffel <tk@maintech.de>
33464 + *
33465 + * This program is free software; you can redistribute it and/or modify
33466 + * it under the terms of the GNU General Public License version 2 as
33467 + * published by the Free Software Foundation.
33468 + */
33469 +
33470 +#include <linux/module.h>
33471 +#include <linux/dma-mapping.h>
33472 +#include <linux/clk.h>
33473 +#include <linux/mmc/mmc.h>
33474 +#include <linux/mmc/host.h>
33475 +#include <linux/platform_device.h>
33476 +#include <linux/irq.h>
33477 +#include <linux/pcf50633.h>
33478 +#include <linux/delay.h>
33479 +#include <linux/interrupt.h>
33480 +#include <linux/spinlock.h>
33481 +
33482 +#include <asm/dma.h>
33483 +#include <asm/dma-mapping.h>
33484 +#include <asm/io.h>
33485 +
33486 +#include "glamo-mci.h"
33487 +#include "glamo-core.h"
33488 +#include "glamo-regs.h"
33489 +
33490 +/* from glamo-core.c */
33491 +extern struct glamo_mci_pdata glamo_mci_def_pdata;
33492 +
33493 +static spinlock_t clock_lock;
33494 +
33495 +#define DRIVER_NAME "glamo-mci"
33496 +#define RESSIZE(ressource) (((ressource)->end - (ressource)->start) + 1)
33497 +
33498 +static void glamo_mci_send_request(struct mmc_host *mmc);
33499 +
33500 +/*
33501 + * Max SD clock rate
33502 + *
33503 + * held at /(3 + 1) due to concerns of 100R recommended series resistor
33504 + * allows 16MHz @ 4-bit --> 8MBytes/sec raw
33505 + *
33506 + * you can override this on kernel commandline using
33507 + *
33508 + * glamo_mci.sd_max_clk=10000000
33509 + *
33510 + * for example
33511 + */
33512 +
33513 +static int sd_max_clk = 50000000 / 3;
33514 +module_param(sd_max_clk, int, 0644);
33515 +
33516 +/*
33517 + * Slow SD clock rate
33518 + *
33519 + * you can override this on kernel commandline using
33520 + *
33521 + * glamo_mci.sd_slow_ratio=8
33522 + *
33523 + * for example
33524 + *
33525 + * platform callback is used to decide effective clock rate, if not
33526 + * defined then max is used, if defined and returns nonzero, rate is
33527 + * divided by this factor
33528 + */
33529 +
33530 +static int sd_slow_ratio = 8;
33531 +module_param(sd_slow_ratio, int, 0644);
33532 +
33533 +/*
33534 + * Post-power SD clock rate
33535 + *
33536 + * you can override this on kernel commandline using
33537 + *
33538 + * glamo_mci.sd_post_power_clock=1000000
33539 + *
33540 + * for example
33541 + *
33542 + * After changing power to card, clock is held at this rate until first bulk
33543 + * transfer completes
33544 + */
33545 +
33546 +static int sd_post_power_clock = 1000000;
33547 +module_param(sd_post_power_clock, int, 0644);
33548 +
33549 +
33550 +/*
33551 + * SD Signal drive strength
33552 + *
33553 + * you can override this on kernel commandline using
33554 + *
33555 + * glamo_mci.sd_drive=0
33556 + *
33557 + * for example
33558 + */
33559 +
33560 +static int sd_drive;
33561 +module_param(sd_drive, int, 0644);
33562 +
33563 +/*
33564 + * SD allow SD clock to run while idle
33565 + *
33566 + * you can override this on kernel commandline using
33567 + *
33568 + * glamo_mci.sd_idleclk=0
33569 + *
33570 + * for example
33571 + */
33572 +
33573 +static int sd_idleclk = 0; /* disallow idle clock by default */
33574 +module_param(sd_idleclk, int, 0644);
33575 +
33576 +/* used to stash real idleclk state in suspend: we force it to run in there */
33577 +static int suspend_sd_idleclk;
33578 +
33579 +
33580 +unsigned char CRC7(u8 * pu8, int cnt)
33581 +{
33582 + u8 crc = 0;
33583 +
33584 + while (cnt--) {
33585 + int n;
33586 + u8 d = *pu8++;
33587 + for (n = 0; n < 8; n++) {
33588 + crc <<= 1;
33589 + if ((d & 0x80) ^ (crc & 0x80))
33590 + crc ^= 0x09;
33591 + d <<= 1;
33592 + }
33593 + }
33594 + return (crc << 1) | 1;
33595 +}
33596 +
33597 +/* these _dly versions account for the dead time rules for reg access */
33598 +static u16 readw_dly(u16 __iomem * pu16)
33599 +{
33600 + glamo_reg_access_delay();
33601 + return readw(pu16);
33602 +}
33603 +
33604 +static void writew_dly(u16 val, u16 __iomem * pu16)
33605 +{
33606 + glamo_reg_access_delay();
33607 + writew(val, pu16);
33608 +}
33609 +
33610 +static int get_data_buffer(struct glamo_mci_host *host,
33611 + volatile u32 *words, volatile u16 **pointer)
33612 +{
33613 + struct scatterlist *sg;
33614 +
33615 + *words = 0;
33616 + *pointer = NULL;
33617 +
33618 + if (host->pio_active == XFER_NONE)
33619 + return -EINVAL;
33620 +
33621 + if ((!host->mrq) || (!host->mrq->data))
33622 + return -EINVAL;
33623 +
33624 + if (host->pio_sgptr >= host->mrq->data->sg_len) {
33625 + dev_dbg(&host->pdev->dev, "no more buffers (%i/%i)\n",
33626 + host->pio_sgptr, host->mrq->data->sg_len);
33627 + return -EBUSY;
33628 + }
33629 + sg = &host->mrq->data->sg[host->pio_sgptr];
33630 +
33631 + *words = sg->length >> 1; /* we are working with a 16-bit data bus */
33632 + *pointer = page_address(sg_page(sg)) + sg->offset;
33633 +
33634 + BUG_ON(((long)(*pointer)) & 1);
33635 +
33636 + host->pio_sgptr++;
33637 +
33638 + /* dev_info(&host->pdev->dev, "new buffer (%i/%i)\n",
33639 + host->pio_sgptr, host->mrq->data->sg_len); */
33640 + return 0;
33641 +}
33642 +
33643 +static void do_pio_read(struct glamo_mci_host *host)
33644 +{
33645 + int res;
33646 + u16 __iomem *from_ptr = host->base_data + (RESSIZE(host->mem_data) /
33647 + sizeof(u16) / 2);
33648 +#ifdef DEBUG
33649 + u16 * block;
33650 +#endif
33651 +
33652 + while (1) {
33653 + res = get_data_buffer(host, &host->pio_words, &host->pio_ptr);
33654 + if (res) {
33655 + host->pio_active = XFER_NONE;
33656 + host->complete_what = COMPLETION_FINALIZE;
33657 +
33658 + dev_dbg(&host->pdev->dev, "pio_read(): "
33659 + "complete (no more data).\n");
33660 + return;
33661 + }
33662 +
33663 + dev_dbg(&host->pdev->dev, "pio_read(): host->pio_words: %d\n",
33664 + host->pio_words);
33665 +
33666 + host->pio_count += host->pio_words << 1;
33667 +
33668 +#ifdef DEBUG
33669 + block = (u16 *)host->pio_ptr;
33670 + res = host->pio_words << 1;
33671 +#endif
33672 + while (host->pio_words--)
33673 + *host->pio_ptr++ = *from_ptr++;
33674 +#ifdef DEBUG
33675 + print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1,
33676 + (void *)block, res, 1);
33677 +#endif
33678 + }
33679 +}
33680 +
33681 +static int do_pio_write(struct glamo_mci_host *host)
33682 +{
33683 + int res = 0;
33684 + volatile u16 __iomem *to_ptr = host->base_data;
33685 + int err = 0;
33686 +
33687 + dev_dbg(&host->pdev->dev, "pio_write():\n");
33688 + while (!res) {
33689 + res = get_data_buffer(host, &host->pio_words, &host->pio_ptr);
33690 + if (res)
33691 + continue;
33692 +
33693 + dev_dbg(&host->pdev->dev, "pio_write():new source: [%i]@[%p]\n",
33694 + host->pio_words, host->pio_ptr);
33695 +
33696 + host->pio_count += host->pio_words << 1;
33697 + while (host->pio_words--)
33698 + writew(*host->pio_ptr++, to_ptr++);
33699 + }
33700 +
33701 + dev_dbg(&host->pdev->dev, "pio_write(): complete\n");
33702 + host->pio_active = XFER_NONE;
33703 + return err;
33704 +}
33705 +
33706 +static void __glamo_mci_fix_card_div(struct glamo_mci_host *host, int div)
33707 +{
33708 + unsigned long flags;
33709 +
33710 + spin_lock_irqsave(&clock_lock, flags);
33711 +
33712 + if (div < 0) {
33713 + /* stop clock - remove clock from divider input */
33714 + writew(readw(glamo_mci_def_pdata.pglamo->base +
33715 + GLAMO_REG_CLOCK_GEN5_1) & (~GLAMO_CLOCK_GEN51_EN_DIV_TCLK),
33716 + glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_GEN5_1);
33717 +
33718 + goto done;
33719 + }
33720 +
33721 + if (host->force_slow_during_powerup)
33722 + div = host->clk_rate / sd_post_power_clock;
33723 + else
33724 + if (host->pdata->glamo_mci_use_slow)
33725 + if ((host->pdata->glamo_mci_use_slow)())
33726 + div = div * sd_slow_ratio;
33727 +
33728 + if (div > 255)
33729 + div = 255;
33730 +
33731 + /*
33732 + * set the nearest prescaler factor
33733 + *
33734 + * register shared with SCLK divisor -- no chance of race because
33735 + * we don't use sensor interface
33736 + */
33737 + writew_dly((readw(glamo_mci_def_pdata.pglamo->base +
33738 + GLAMO_REG_CLOCK_GEN8) & 0xff00) | div,
33739 + glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_GEN8);
33740 + /* enable clock to divider input */
33741 + writew_dly(readw(glamo_mci_def_pdata.pglamo->base +
33742 + GLAMO_REG_CLOCK_GEN5_1) | GLAMO_CLOCK_GEN51_EN_DIV_TCLK,
33743 + glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_GEN5_1);
33744 +
33745 +done:
33746 + spin_unlock_irqrestore(&clock_lock, flags);
33747 +}
33748 +
33749 +static int __glamo_mci_set_card_clock(struct glamo_mci_host *host, int freq,
33750 + int *division)
33751 +{
33752 + int div = 0;
33753 + int real_rate = 0;
33754 +
33755 + if (freq) {
33756 + /* Set clock */
33757 + for (div = 0; div < 256; div++) {
33758 + real_rate = host->clk_rate / (div + 1);
33759 + if (real_rate <= freq)
33760 + break;
33761 + }
33762 + if (div > 255)
33763 + div = 255;
33764 +
33765 + if (division)
33766 + *division = div;
33767 +
33768 + __glamo_mci_fix_card_div(host, div);
33769 +
33770 + } else {
33771 + /* stop clock */
33772 + if (division)
33773 + *division = 0xff;
33774 +
33775 + if (!sd_idleclk && !host->force_slow_during_powerup)
33776 + /* clock off */
33777 + __glamo_mci_fix_card_div(host, -1);
33778 + }
33779 +
33780 + return real_rate;
33781 +}
33782 +
33783 +static void glamo_mci_irq(unsigned int irq, struct irq_desc *desc)
33784 +{
33785 + struct glamo_mci_host *host = (struct glamo_mci_host *)
33786 + desc->handler_data;
33787 + u16 status;
33788 + struct mmc_command *cmd;
33789 + unsigned long iflags;
33790 +
33791 + if (!host)
33792 + return;
33793 + if (!host->mrq)
33794 + return;
33795 + cmd = host->mrq->cmd;
33796 + if (!cmd)
33797 + return;
33798 +
33799 + spin_lock_irqsave(&host->complete_lock, iflags);
33800 +
33801 + status = readw_dly(host->base + GLAMO_REG_MMC_RB_STAT1);
33802 +
33803 + /* ack this interrupt source */
33804 + writew(GLAMO_IRQ_MMC,
33805 + glamo_mci_def_pdata.pglamo->base + GLAMO_REG_IRQ_CLEAR);
33806 +
33807 + if (status & (GLAMO_STAT1_MMC_RTOUT |
33808 + GLAMO_STAT1_MMC_DTOUT))
33809 + cmd->error = -ETIMEDOUT;
33810 + if (status & (GLAMO_STAT1_MMC_BWERR |
33811 + GLAMO_STAT1_MMC_BRERR))
33812 + cmd->error = -EILSEQ;
33813 + if (cmd->error) {
33814 + dev_info(&host->pdev->dev, "Error after cmd: 0x%x\n", status);
33815 + goto done;
33816 + }
33817 +
33818 + /* disable the initial slow start after first bulk transfer */
33819 + if (host->force_slow_during_powerup)
33820 + host->force_slow_during_powerup--;
33821 +
33822 + if (host->pio_active == XFER_READ)
33823 + do_pio_read(host);
33824 +
33825 + host->mrq->data->bytes_xfered = host->pio_count;
33826 + dev_dbg(&host->pdev->dev, "status = 0x%04x count=%d\n",
33827 + status, host->pio_count);
33828 +
33829 + /* issue STOP if we have been given one to use */
33830 + if (host->mrq->stop) {
33831 + host->cmd_is_stop = 1;
33832 + glamo_mci_send_request(host->mmc);
33833 + host->cmd_is_stop = 0;
33834 + }
33835 +
33836 + if (!sd_idleclk && !host->force_slow_during_powerup)
33837 + /* clock off */
33838 + __glamo_mci_fix_card_div(host, -1);
33839 +
33840 +done:
33841 + host->complete_what = COMPLETION_NONE;
33842 + host->mrq = NULL;
33843 + mmc_request_done(host->mmc, cmd->mrq);
33844 + spin_unlock_irqrestore(&host->complete_lock, iflags);
33845 +}
33846 +
33847 +static int glamo_mci_send_command(struct glamo_mci_host *host,
33848 + struct mmc_command *cmd)
33849 +{
33850 + u8 u8a[6];
33851 + u16 fire = 0;
33852 +
33853 + /* if we can't do it, reject as busy */
33854 + if (!readw_dly(host->base + GLAMO_REG_MMC_RB_STAT1) &
33855 + GLAMO_STAT1_MMC_IDLE) {
33856 + host->mrq = NULL;
33857 + cmd->error = -EBUSY;
33858 + mmc_request_done(host->mmc, host->mrq);
33859 + return -EBUSY;
33860 + }
33861 +
33862 + /* create an array in wire order for CRC computation */
33863 + u8a[0] = 0x40 | (cmd->opcode & 0x3f);
33864 + u8a[1] = (u8)(cmd->arg >> 24);
33865 + u8a[2] = (u8)(cmd->arg >> 16);
33866 + u8a[3] = (u8)(cmd->arg >> 8);
33867 + u8a[4] = (u8)cmd->arg;
33868 + u8a[5] = CRC7(&u8a[0], 5); /* CRC7 on first 5 bytes of packet */
33869 +
33870 + /* issue the wire-order array including CRC in register order */
33871 + writew_dly((u8a[4] << 8) | u8a[5], host->base + GLAMO_REG_MMC_CMD_REG1);
33872 + writew_dly((u8a[2] << 8) | u8a[3], host->base + GLAMO_REG_MMC_CMD_REG2);
33873 + writew_dly((u8a[0] << 8) | u8a[1], host->base + GLAMO_REG_MMC_CMD_REG3);
33874 +
33875 + /* command index toggle */
33876 + fire |= (host->ccnt & 1) << 12;
33877 +
33878 + /* set type of command */
33879 + switch (mmc_cmd_type(cmd)) {
33880 + case MMC_CMD_BC:
33881 + fire |= GLAMO_FIRE_MMC_CMDT_BNR;
33882 + break;
33883 + case MMC_CMD_BCR:
33884 + fire |= GLAMO_FIRE_MMC_CMDT_BR;
33885 + break;
33886 + case MMC_CMD_AC:
33887 + fire |= GLAMO_FIRE_MMC_CMDT_AND;
33888 + break;
33889 + case MMC_CMD_ADTC:
33890 + fire |= GLAMO_FIRE_MMC_CMDT_AD;
33891 + break;
33892 + }
33893 + /*
33894 + * if it expects a response, set the type expected
33895 + *
33896 + * R1, Length : 48bit, Normal response
33897 + * R1b, Length : 48bit, same R1, but added card busy status
33898 + * R2, Length : 136bit (really 128 bits with CRC snipped)
33899 + * R3, Length : 48bit (OCR register value)
33900 + * R4, Length : 48bit, SDIO_OP_CONDITION, Reverse SDIO Card
33901 + * R5, Length : 48bit, IO_RW_DIRECTION, Reverse SDIO Card
33902 + * R6, Length : 48bit (RCA register)
33903 + * R7, Length : 48bit (interface condition, VHS(voltage supplied),
33904 + * check pattern, CRC7)
33905 + */
33906 + switch (mmc_resp_type(cmd)) {
33907 + case MMC_RSP_R6: /* same index as R7 and R1 */
33908 + fire |= GLAMO_FIRE_MMC_RSPT_R1;
33909 + break;
33910 + case MMC_RSP_R1B:
33911 + fire |= GLAMO_FIRE_MMC_RSPT_R1b;
33912 + break;
33913 + case MMC_RSP_R2:
33914 + fire |= GLAMO_FIRE_MMC_RSPT_R2;
33915 + break;
33916 + case MMC_RSP_R3:
33917 + fire |= GLAMO_FIRE_MMC_RSPT_R3;
33918 + break;
33919 + /* R4 and R5 supported by chip not defined in linux/mmc/core.h (sdio) */
33920 + }
33921 + /*
33922 + * From the command index, set up the command class in the host ctrllr
33923 + *
33924 + * missing guys present on chip but couldn't figure out how to use yet:
33925 + * 0x0 "stream read"
33926 + * 0x9 "cancel running command"
33927 + */
33928 + switch (cmd->opcode) {
33929 + case MMC_READ_SINGLE_BLOCK:
33930 + fire |= GLAMO_FIRE_MMC_CC_SBR; /* single block read */
33931 + break;
33932 + case MMC_SWITCH: /* 64 byte payload */
33933 + case 0x33: /* observed issued by MCI */
33934 + case MMC_READ_MULTIPLE_BLOCK:
33935 + /* we will get an interrupt off this */
33936 + if (!cmd->mrq->stop)
33937 + /* multiblock no stop */
33938 + fire |= GLAMO_FIRE_MMC_CC_MBRNS;
33939 + else
33940 + /* multiblock with stop */
33941 + fire |= GLAMO_FIRE_MMC_CC_MBRS;
33942 + break;
33943 + case MMC_WRITE_BLOCK:
33944 + fire |= GLAMO_FIRE_MMC_CC_SBW; /* single block write */
33945 + break;
33946 + case MMC_WRITE_MULTIPLE_BLOCK:
33947 + if (cmd->mrq->stop)
33948 + /* multiblock with stop */
33949 + fire |= GLAMO_FIRE_MMC_CC_MBWS;
33950 + else
33951 + /* multiblock NO stop-- 'RESERVED'? */
33952 + fire |= GLAMO_FIRE_MMC_CC_MBWNS;
33953 + break;
33954 + case MMC_STOP_TRANSMISSION:
33955 + fire |= GLAMO_FIRE_MMC_CC_STOP; /* STOP */
33956 + break;
33957 + default:
33958 + fire |= GLAMO_FIRE_MMC_CC_BASIC; /* "basic command" */
33959 + break;
33960 + }
33961 +
33962 + /* always largest timeout */
33963 + writew(0xfff, host->base + GLAMO_REG_MMC_TIMEOUT);
33964 +
33965 + /* Generate interrupt on txfer */
33966 + writew_dly((readw_dly(host->base + GLAMO_REG_MMC_BASIC) & 0x3e) |
33967 + 0x0800 | GLAMO_BASIC_MMC_NO_CLK_RD_WAIT |
33968 + GLAMO_BASIC_MMC_EN_COMPL_INT | (sd_drive << 6),
33969 + host->base + GLAMO_REG_MMC_BASIC);
33970 +
33971 + /* send the command out on the wire */
33972 + /* dev_info(&host->pdev->dev, "Using FIRE %04X\n", fire); */
33973 + writew_dly(fire, host->base + GLAMO_REG_MMC_CMD_FIRE);
33974 + cmd->error = 0;
33975 + return 0;
33976 +}
33977 +
33978 +static int glamo_mci_prepare_pio(struct glamo_mci_host *host,
33979 + struct mmc_data *data)
33980 +{
33981 + /*
33982 + * the S-Media-internal RAM offset for our MMC buffer
33983 + * Read is halfway up the buffer and write is at the start
33984 + */
33985 + if (data->flags & MMC_DATA_READ) {
33986 + writew_dly((u16)(GLAMO_FB_SIZE + (RESSIZE(host->mem_data) / 2)),
33987 + host->base + GLAMO_REG_MMC_WDATADS1);
33988 + writew_dly((u16)((GLAMO_FB_SIZE +
33989 + (RESSIZE(host->mem_data) / 2)) >> 16),
33990 + host->base + GLAMO_REG_MMC_WDATADS2);
33991 + } else {
33992 + writew_dly((u16)GLAMO_FB_SIZE, host->base +
33993 + GLAMO_REG_MMC_RDATADS1);
33994 + writew_dly((u16)(GLAMO_FB_SIZE >> 16), host->base +
33995 + GLAMO_REG_MMC_RDATADS2);
33996 + }
33997 +
33998 + /* set up the block info */
33999 + writew_dly(data->blksz, host->base + GLAMO_REG_MMC_DATBLKLEN);
34000 + writew_dly(data->blocks, host->base + GLAMO_REG_MMC_DATBLKCNT);
34001 + dev_dbg(&host->pdev->dev, "(blksz=%d, count=%d)\n",
34002 + data->blksz, data->blocks);
34003 + host->pio_sgptr = 0;
34004 + host->pio_words = 0;
34005 + host->pio_count = 0;
34006 + host->pio_active = 0;
34007 + /* if write, prep the write into the shared RAM before the command */
34008 + if (data->flags & MMC_DATA_WRITE) {
34009 + host->pio_active = XFER_WRITE;
34010 + return do_pio_write(host);
34011 + }
34012 + host->pio_active = XFER_READ;
34013 + return 0;
34014 +}
34015 +
34016 +static void glamo_mci_send_request(struct mmc_host *mmc)
34017 +{
34018 + struct glamo_mci_host *host = mmc_priv(mmc);
34019 + struct mmc_request *mrq = host->mrq;
34020 + struct mmc_command *cmd = host->cmd_is_stop ? mrq->stop : mrq->cmd;
34021 + u16 * pu16 = (u16 *)&cmd->resp[0];
34022 + u16 * reg_resp = (u16 *)(host->base + GLAMO_REG_MMC_CMD_RSP1);
34023 + u16 status;
34024 + int n;
34025 + int timeout = 100000000;
34026 +
34027 + if (host->suspending) {
34028 + dev_err(&host->pdev->dev, "faking cmd %d "
34029 + "during suspend\n", cmd->opcode);
34030 + mmc_request_done(mmc, mrq);
34031 + return;
34032 + }
34033 +
34034 + host->ccnt++;
34035 + /*
34036 + * somehow 2.6.24 MCI manages to issue MMC_WRITE_BLOCK *without* the
34037 + * MMC_DATA_WRITE flag, WTF? Work around the madness.
34038 + */
34039 + if (cmd->opcode == MMC_WRITE_BLOCK)
34040 + if (mrq->data)
34041 + mrq->data->flags |= MMC_DATA_WRITE;
34042 +
34043 + /* this guy has data to read/write? */
34044 + if ((!host->cmd_is_stop) && cmd->data) {
34045 + int res;
34046 + host->dcnt++;
34047 + res = glamo_mci_prepare_pio(host, cmd->data);
34048 + if (res) {
34049 + cmd->error = -EIO;
34050 + cmd->data->error = -EIO;
34051 + mmc_request_done(mmc, mrq);
34052 + return;
34053 + }
34054 + }
34055 +
34056 + dev_dbg(&host->pdev->dev,"cmd 0x%x, "
34057 + "arg 0x%x data=%p mrq->stop=%p flags 0x%x\n",
34058 + cmd->opcode, cmd->arg, cmd->data, cmd->mrq->stop,
34059 + cmd->flags);
34060 +
34061 + /* resume requested clock rate
34062 + * scale it down by sd_slow_ratio if platform requests it
34063 + */
34064 + __glamo_mci_fix_card_div(host, host->clk_div);
34065 +
34066 + if (glamo_mci_send_command(host, cmd))
34067 + goto bail;
34068 + /*
34069 + * we must spin until response is ready or timed out
34070 + * -- we don't get interrupts unless there is a bulk rx
34071 + */
34072 + do
34073 + status = readw_dly(host->base + GLAMO_REG_MMC_RB_STAT1);
34074 + while ((((status >> 15) & 1) != (host->ccnt & 1)) ||
34075 + (!(status & (GLAMO_STAT1_MMC_RB_RRDY |
34076 + GLAMO_STAT1_MMC_RTOUT |
34077 + GLAMO_STAT1_MMC_DTOUT |
34078 + GLAMO_STAT1_MMC_BWERR |
34079 + GLAMO_STAT1_MMC_BRERR))));
34080 +
34081 + if (status & (GLAMO_STAT1_MMC_RTOUT |
34082 + GLAMO_STAT1_MMC_DTOUT))
34083 + cmd->error = -ETIMEDOUT;
34084 + if (status & (GLAMO_STAT1_MMC_BWERR |
34085 + GLAMO_STAT1_MMC_BRERR))
34086 + cmd->error = -EILSEQ;
34087 +
34088 + if (host->cmd_is_stop)
34089 + goto bail;
34090 +
34091 + if (cmd->error) {
34092 + dev_info(&host->pdev->dev, "Error after cmd: 0x%x\n", status);
34093 + goto done;
34094 + }
34095 + /*
34096 + * mangle the response registers in two different exciting
34097 + * undocumented ways discovered by trial and error
34098 + */
34099 + if (mmc_resp_type(cmd) == MMC_RSP_R2)
34100 + /* grab the response */
34101 + for (n = 0; n < 8; n++) /* super mangle power 1 */
34102 + pu16[n ^ 6] = readw_dly(&reg_resp[n]);
34103 + else
34104 + for (n = 0; n < 3; n++) /* super mangle power 2 */
34105 + pu16[n] = (readw_dly(&reg_resp[n]) >> 8) |
34106 + (readw_dly(&reg_resp[n + 1]) << 8);
34107 + /*
34108 + * if we don't have bulk data to take care of, we're done
34109 + */
34110 + if (!cmd->data)
34111 + goto done;
34112 + if (!(cmd->data->flags & (MMC_DATA_READ | MMC_DATA_WRITE)))
34113 + goto done;
34114 +
34115 + /*
34116 + * Otherwise can can use the interrupt as async completion --
34117 + * if there is read data coming, or we wait for write data to complete,
34118 + * exit without mmc_request_done() as the payload interrupt
34119 + * will service it
34120 + */
34121 + dev_dbg(&host->pdev->dev, "Waiting for payload data\n");
34122 + /*
34123 + * if the glamo INT# line isn't wired (*cough* it can happen)
34124 + * I'm afraid we have to spin on the IRQ status bit and "be
34125 + * our own INT# line"
34126 + */
34127 + if (!glamo_mci_def_pdata.pglamo->irq_works) {
34128 + /*
34129 + * we have faith we will get an "interrupt"...
34130 + * but something insane like suspend problems can mean
34131 + * we spin here forever, so we timeout after a LONG time
34132 + */
34133 + while ((!(readw_dly(glamo_mci_def_pdata.pglamo->base +
34134 + GLAMO_REG_IRQ_STATUS) & GLAMO_IRQ_MMC)) &&
34135 + (timeout--))
34136 + ;
34137 +
34138 + if (timeout < 0) {
34139 + if (cmd->data->error)
34140 + cmd->data->error = -ETIMEDOUT;
34141 + dev_err(&host->pdev->dev, "Payload timeout\n");
34142 + goto bail;
34143 + }
34144 +
34145 + /* yay we are an interrupt controller! -- call the ISR
34146 + * it will stop clock to card
34147 + */
34148 + glamo_mci_irq(IRQ_GLAMO(GLAMO_IRQIDX_MMC),
34149 + irq_desc + IRQ_GLAMO(GLAMO_IRQIDX_MMC));
34150 + }
34151 + return;
34152 +
34153 +done:
34154 + host->complete_what = COMPLETION_NONE;
34155 + host->mrq = NULL;
34156 + mmc_request_done(host->mmc, cmd->mrq);
34157 +bail:
34158 + if (!sd_idleclk && !host->force_slow_during_powerup)
34159 + /* stop the clock to card */
34160 + __glamo_mci_fix_card_div(host, -1);
34161 +}
34162 +
34163 +static void glamo_mci_request(struct mmc_host *mmc, struct mmc_request *mrq)
34164 +{
34165 + struct glamo_mci_host *host = mmc_priv(mmc);
34166 +
34167 + host->cmd_is_stop = 0;
34168 + host->mrq = mrq;
34169 + glamo_mci_send_request(mmc);
34170 +}
34171 +
34172 +static void glamo_mci_reset(struct glamo_mci_host *host)
34173 +{
34174 + dev_dbg(&host->pdev->dev, "******* glamo_mci_reset\n");
34175 + /* reset MMC controller */
34176 + writew_dly(GLAMO_CLOCK_MMC_RESET | GLAMO_CLOCK_MMC_DG_TCLK |
34177 + GLAMO_CLOCK_MMC_EN_TCLK | GLAMO_CLOCK_MMC_DG_M9CLK |
34178 + GLAMO_CLOCK_MMC_EN_M9CLK,
34179 + glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_MMC);
34180 + msleep(1);
34181 + /* and disable reset */
34182 + writew_dly(GLAMO_CLOCK_MMC_DG_TCLK |
34183 + GLAMO_CLOCK_MMC_EN_TCLK | GLAMO_CLOCK_MMC_DG_M9CLK |
34184 + GLAMO_CLOCK_MMC_EN_M9CLK,
34185 + glamo_mci_def_pdata.pglamo->base + GLAMO_REG_CLOCK_MMC);
34186 +}
34187 +
34188 +
34189 +static void glamo_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
34190 +{
34191 + struct glamo_mci_host *host = mmc_priv(mmc);
34192 + int n = 0;
34193 + int div;
34194 + int powering = 0;
34195 +
34196 + /* Set power */
34197 + switch(ios->power_mode) {
34198 + case MMC_POWER_ON:
34199 + case MMC_POWER_UP:
34200 + /*
34201 + * we should use very slow clock until first bulk
34202 + * transfer completes OK
34203 + */
34204 + host->force_slow_during_powerup = 1;
34205 +
34206 + if (host->vdd_current != ios->vdd) {
34207 + host->pdata->glamo_set_mci_power(ios->power_mode,
34208 + ios->vdd);
34209 + host->vdd_current = ios->vdd;
34210 + }
34211 + if (host->power_mode_current == MMC_POWER_OFF) {
34212 + glamo_engine_enable(glamo_mci_def_pdata.pglamo,
34213 + GLAMO_ENGINE_MMC);
34214 + powering = 1;
34215 + }
34216 + break;
34217 +
34218 + case MMC_POWER_OFF:
34219 + default:
34220 + if (host->power_mode_current == MMC_POWER_OFF)
34221 + break;
34222 + /* never want clocking with dead card */
34223 + __glamo_mci_fix_card_div(host, -1);
34224 +
34225 + glamo_engine_disable(glamo_mci_def_pdata.pglamo,
34226 + GLAMO_ENGINE_MMC);
34227 + host->pdata->glamo_set_mci_power(MMC_POWER_OFF, 0);
34228 + host->vdd_current = -1;
34229 + break;
34230 + }
34231 + host->power_mode_current = ios->power_mode;
34232 +
34233 + host->real_rate = __glamo_mci_set_card_clock(host, ios->clock, &div);
34234 + host->clk_div = div;
34235 +
34236 + /* after power-up, we are meant to give it >= 74 clocks so it can
34237 + * initialize itself. Doubt any modern cards need it but anyway...
34238 + */
34239 + if (powering)
34240 + msleep(1);
34241 +
34242 + if (!sd_idleclk && !host->force_slow_during_powerup)
34243 + /* stop the clock to card, because we are idle until transfer */
34244 + __glamo_mci_fix_card_div(host, -1);
34245 +
34246 + if ((ios->power_mode == MMC_POWER_ON) ||
34247 + (ios->power_mode == MMC_POWER_UP)) {
34248 + dev_info(&host->pdev->dev,
34249 + "powered (vdd = %d) clk: %lukHz div=%d (req: %ukHz). "
34250 + "Bus width=%d\n",(int)ios->vdd,
34251 + host->real_rate / 1000, (int)host->clk_div,
34252 + ios->clock / 1000, (int)ios->bus_width);
34253 + } else
34254 + dev_info(&host->pdev->dev, "glamo_mci_set_ios: power down.\n");
34255 +
34256 + /* set bus width */
34257 + host->bus_width = ios->bus_width;
34258 + if (host->bus_width == MMC_BUS_WIDTH_4)
34259 + n = GLAMO_BASIC_MMC_EN_4BIT_DATA;
34260 + writew_dly((readw_dly(host->base + GLAMO_REG_MMC_BASIC) &
34261 + (~(GLAMO_BASIC_MMC_EN_4BIT_DATA |
34262 + GLAMO_BASIC_MMC_EN_DR_STR0 |
34263 + GLAMO_BASIC_MMC_EN_DR_STR1))) | n |
34264 + sd_drive << 6, host->base + GLAMO_REG_MMC_BASIC);
34265 +}
34266 +
34267 +
34268 +/*
34269 + * no physical write protect supported by us
34270 + */
34271 +static int glamo_mci_get_ro(struct mmc_host *mmc)
34272 +{
34273 + return 0;
34274 +}
34275 +
34276 +static struct mmc_host_ops glamo_mci_ops = {
34277 + .request = glamo_mci_request,
34278 + .set_ios = glamo_mci_set_ios,
34279 + .get_ro = glamo_mci_get_ro,
34280 +};
34281 +
34282 +static int glamo_mci_probe(struct platform_device *pdev)
34283 +{
34284 + struct mmc_host *mmc;
34285 + struct glamo_mci_host *host;
34286 + int ret;
34287 +
34288 + dev_info(&pdev->dev, "glamo_mci driver (C)2007 Openmoko, Inc\n");
34289 +
34290 + mmc = mmc_alloc_host(sizeof(struct glamo_mci_host), &pdev->dev);
34291 + if (!mmc) {
34292 + ret = -ENOMEM;
34293 + goto probe_out;
34294 + }
34295 +
34296 + host = mmc_priv(mmc);
34297 + host->mmc = mmc;
34298 + host->pdev = pdev;
34299 + host->pdata = &glamo_mci_def_pdata;
34300 + host->power_mode_current = MMC_POWER_OFF;
34301 +
34302 + host->complete_what = COMPLETION_NONE;
34303 + host->pio_active = XFER_NONE;
34304 +
34305 + spin_lock_init(&host->complete_lock);
34306 +
34307 + host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
34308 + if (!host->mem) {
34309 + dev_err(&pdev->dev,
34310 + "failed to get io memory region resouce.\n");
34311 +
34312 + ret = -ENOENT;
34313 + goto probe_free_host;
34314 + }
34315 +
34316 + host->mem = request_mem_region(host->mem->start,
34317 + RESSIZE(host->mem), pdev->name);
34318 +
34319 + if (!host->mem) {
34320 + dev_err(&pdev->dev, "failed to request io memory region.\n");
34321 + ret = -ENOENT;
34322 + goto probe_free_host;
34323 + }
34324 +
34325 + host->base = ioremap(host->mem->start, RESSIZE(host->mem));
34326 + if (!host->base) {
34327 + dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
34328 + ret = -EINVAL;
34329 + goto probe_free_mem_region;
34330 + }
34331 +
34332 + /* set the handler for our bit of the shared chip irq register */
34333 + set_irq_handler(IRQ_GLAMO(GLAMO_IRQIDX_MMC), glamo_mci_irq);
34334 + /* stash host as our handler's private data */
34335 + set_irq_data(IRQ_GLAMO(GLAMO_IRQIDX_MMC), host);
34336 +
34337 + /* Get ahold of our data buffer we use for data in and out on MMC */
34338 + host->mem_data = platform_get_resource(pdev, IORESOURCE_MEM, 1);
34339 + if (!host->mem_data) {
34340 + dev_err(&pdev->dev,
34341 + "failed to get io memory region resource.\n");
34342 + ret = -ENOENT;
34343 + goto probe_iounmap;
34344 + }
34345 +
34346 + host->mem_data = request_mem_region(host->mem_data->start,
34347 + RESSIZE(host->mem_data), pdev->name);
34348 +
34349 + if (!host->mem_data) {
34350 + dev_err(&pdev->dev, "failed to request io memory region.\n");
34351 + ret = -ENOENT;
34352 + goto probe_iounmap;
34353 + }
34354 + host->base_data = ioremap(host->mem_data->start,
34355 + RESSIZE(host->mem_data));
34356 + host->data_max_size = RESSIZE(host->mem_data);
34357 +
34358 + if (host->base_data == 0) {
34359 + dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
34360 + ret = -EINVAL;
34361 + goto probe_free_mem_region_data;
34362 + }
34363 +
34364 + host->vdd_current = 0;
34365 + host->clk_rate = 50000000; /* really it's 49152000 */
34366 + host->clk_div = 16;
34367 +
34368 + /* explain our host controller capabilities */
34369 + mmc->ops = &glamo_mci_ops;
34370 + mmc->ocr_avail = host->pdata->ocr_avail;
34371 + mmc->caps = MMC_CAP_4_BIT_DATA |
34372 + MMC_CAP_MULTIWRITE |
34373 + MMC_CAP_MMC_HIGHSPEED |
34374 + MMC_CAP_SD_HIGHSPEED;
34375 + mmc->f_min = host->clk_rate / 256;
34376 + mmc->f_max = sd_max_clk;
34377 +
34378 + mmc->max_blk_count = (1 << 16) - 1; /* GLAMO_REG_MMC_RB_BLKCNT */
34379 + mmc->max_blk_size = (1 << 12) - 1; /* GLAMO_REG_MMC_RB_BLKLEN */
34380 + mmc->max_req_size = RESSIZE(host->mem_data) / 2;
34381 + mmc->max_seg_size = mmc->max_req_size;
34382 + mmc->max_phys_segs = 1; /* hw doesn't talk about segs??? */
34383 + mmc->max_hw_segs = 1;
34384 +
34385 + dev_info(&host->pdev->dev, "probe: mapped mci_base:%p irq:%u.\n",
34386 + host->base, host->irq);
34387 +
34388 + if ((ret = mmc_add_host(mmc))) {
34389 + dev_err(&pdev->dev, "failed to add mmc host.\n");
34390 + goto probe_free_mem_region_data;
34391 + }
34392 +
34393 + platform_set_drvdata(pdev, mmc);
34394 +
34395 + dev_info(&pdev->dev,"initialisation done.\n");
34396 + return 0;
34397 +
34398 + probe_free_mem_region_data:
34399 + release_mem_region(host->mem_data->start, RESSIZE(host->mem_data));
34400 +
34401 + probe_iounmap:
34402 + iounmap(host->base);
34403 +
34404 + probe_free_mem_region:
34405 + release_mem_region(host->mem->start, RESSIZE(host->mem));
34406 +
34407 + probe_free_host:
34408 + mmc_free_host(mmc);
34409 + probe_out:
34410 + return ret;
34411 +}
34412 +
34413 +static int glamo_mci_remove(struct platform_device *pdev)
34414 +{
34415 + struct mmc_host *mmc = platform_get_drvdata(pdev);
34416 + struct glamo_mci_host *host = mmc_priv(mmc);
34417 +
34418 + mmc_remove_host(mmc);
34419 + /* stop using our handler, revert it to default */
34420 + set_irq_handler(IRQ_GLAMO(GLAMO_IRQIDX_MMC), handle_level_irq);
34421 + iounmap(host->base);
34422 + iounmap(host->base_data);
34423 + release_mem_region(host->mem->start, RESSIZE(host->mem));
34424 + release_mem_region(host->mem_data->start, RESSIZE(host->mem_data));
34425 + mmc_free_host(mmc);
34426 +
34427 + glamo_engine_disable(glamo_mci_def_pdata.pglamo, GLAMO_ENGINE_MMC);
34428 + return 0;
34429 +}
34430 +
34431 +
34432 +#ifdef CONFIG_PM
34433 +
34434 +static int glamo_mci_suspend(struct platform_device *dev, pm_message_t state)
34435 +{
34436 + struct mmc_host *mmc = platform_get_drvdata(dev);
34437 + struct glamo_mci_host *host = mmc_priv(mmc);
34438 + int ret;
34439 +
34440 + /*
34441 + * possible workaround for SD corruption during suspend - resume
34442 + * make sure the clock was running during suspend and consequently
34443 + * resume
34444 + */
34445 + __glamo_mci_fix_card_div(host, host->clk_div);
34446 +
34447 + /* we are going to do more commands to override this in
34448 + * mmc_suspend_host(), so we need to change sd_idleclk for the
34449 + * duration as well
34450 + */
34451 + suspend_sd_idleclk = sd_idleclk;
34452 + sd_idleclk = 1;
34453 +
34454 + host->suspending++;
34455 + if (host->pdata->mci_all_dependencies_resumed)
34456 + (host->pdata->mci_suspending)(dev);
34457 +
34458 + ret = mmc_suspend_host(mmc, state);
34459 +
34460 + /* so that when we resume, we use any modified max rate */
34461 + mmc->f_max = sd_max_clk;
34462 +
34463 + return ret;
34464 +}
34465 +
34466 +int glamo_mci_resume(struct platform_device *dev)
34467 +{
34468 + struct mmc_host *mmc = platform_get_drvdata(dev);
34469 + struct glamo_mci_host *host = mmc_priv(mmc);
34470 + int ret;
34471 +
34472 + if (host->pdata->mci_all_dependencies_resumed)
34473 + if (!(host->pdata->mci_all_dependencies_resumed)(dev))
34474 + return 0;
34475 +
34476 + host->suspending--;
34477 +
34478 + ret = mmc_resume_host(mmc);
34479 +
34480 + /* put sd_idleclk back to pre-suspend state */
34481 + sd_idleclk = suspend_sd_idleclk;
34482 +
34483 + return ret;
34484 +}
34485 +EXPORT_SYMBOL_GPL(glamo_mci_resume);
34486 +
34487 +#else /* CONFIG_PM */
34488 +#define glamo_mci_suspend NULL
34489 +#define glamo_mci_resume NULL
34490 +#endif /* CONFIG_PM */
34491 +
34492 +
34493 +static struct platform_driver glamo_mci_driver =
34494 +{
34495 + .driver.name = "glamo-mci",
34496 + .probe = glamo_mci_probe,
34497 + .remove = glamo_mci_remove,
34498 + .suspend = glamo_mci_suspend,
34499 + .resume = glamo_mci_resume,
34500 +};
34501 +
34502 +static int __init glamo_mci_init(void)
34503 +{
34504 + spin_lock_init(&clock_lock);
34505 + platform_driver_register(&glamo_mci_driver);
34506 + return 0;
34507 +}
34508 +
34509 +static void __exit glamo_mci_exit(void)
34510 +{
34511 + platform_driver_unregister(&glamo_mci_driver);
34512 +}
34513 +
34514 +module_init(glamo_mci_init);
34515 +module_exit(glamo_mci_exit);
34516 +
34517 +MODULE_DESCRIPTION("Glamo MMC/SD Card Interface driver");
34518 +MODULE_LICENSE("GPL");
34519 +MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
34520 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-mci.h
34521 ===================================================================
34522 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
34523 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-mci.h 2008-12-11 22:46:49.000000000 +0100
34524 @@ -0,0 +1,80 @@
34525 +/*
34526 + * linux/drivers/mmc/host/glamo-mmc.h - GLAMO MCI driver
34527 + *
34528 + * Copyright (C) 2007-2008 Openmoko, Inc, Andy Green <andy@openmoko.com>
34529 + * based on S3C MMC driver -->
34530 + * Copyright (C) 2004-2006 Thomas Kleffel, All Rights Reserved.
34531 + *
34532 + * This program is free software; you can redistribute it and/or modify
34533 + * it under the terms of the GNU General Public License version 2 as
34534 + * published by the Free Software Foundation.
34535 + */
34536 +
34537 +
34538 +enum glamo_mci_waitfor {
34539 + COMPLETION_NONE,
34540 + COMPLETION_FINALIZE,
34541 + COMPLETION_CMDSENT,
34542 + COMPLETION_RSPFIN,
34543 + COMPLETION_XFERFINISH,
34544 + COMPLETION_XFERFINISH_RSPFIN,
34545 +};
34546 +
34547 +struct glamo_mci_host {
34548 + struct platform_device *pdev;
34549 + struct glamo_mci_pdata *pdata;
34550 + struct mmc_host *mmc;
34551 + struct resource *mem;
34552 + struct resource *mem_data;
34553 + struct clk *clk;
34554 + void __iomem *base;
34555 + u16 __iomem *base_data;
34556 + int irq;
34557 + int irq_cd;
34558 + int dma;
34559 + int data_max_size;
34560 +
34561 + int suspending;
34562 +
34563 + int power_mode_current;
34564 + unsigned int vdd_current;
34565 +
34566 + unsigned long clk_rate;
34567 + unsigned long clk_div;
34568 + unsigned long real_rate;
34569 + u8 prescaler;
34570 +
34571 + int force_slow_during_powerup;
34572 +
34573 + unsigned sdiimsk;
34574 + int dodma;
34575 +
34576 + volatile int dmatogo;
34577 +
34578 + struct mmc_request *mrq;
34579 + int cmd_is_stop;
34580 +
34581 + spinlock_t complete_lock;
34582 + volatile enum glamo_mci_waitfor
34583 + complete_what;
34584 +
34585 + volatile int dma_complete;
34586 +
34587 + volatile u32 pio_sgptr;
34588 + volatile u32 pio_words;
34589 + volatile u32 pio_count;
34590 + volatile u16 *pio_ptr;
34591 +#define XFER_NONE 0
34592 +#define XFER_READ 1
34593 +#define XFER_WRITE 2
34594 + volatile u32 pio_active;
34595 +
34596 + int bus_width;
34597 +
34598 + char dbgmsg_cmd[301];
34599 + char dbgmsg_dat[301];
34600 + volatile char *status;
34601 +
34602 + unsigned int ccnt, dcnt;
34603 + struct tasklet_struct pio_tasklet;
34604 +};
34605 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-regs.h
34606 ===================================================================
34607 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
34608 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-regs.h 2008-12-11 22:46:49.000000000 +0100
34609 @@ -0,0 +1,632 @@
34610 +#ifndef _GLAMO_REGS_H
34611 +#define _GLAMO_REGS_H
34612 +
34613 +/* Smedia Glamo 336x/337x driver
34614 + *
34615 + * (C) 2007 by Openmoko, Inc.
34616 + * Author: Harald Welte <laforge@openmoko.org>
34617 + * All rights reserved.
34618 + *
34619 + * This program is free software; you can redistribute it and/or
34620 + * modify it under the terms of the GNU General Public License as
34621 + * published by the Free Software Foundation; either version 2 of
34622 + * the License, or (at your option) any later version.
34623 + *
34624 + * This program is distributed in the hope that it will be useful,
34625 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
34626 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34627 + * GNU General Public License for more details.
34628 + *
34629 + * You should have received a copy of the GNU General Public License
34630 + * along with this program; if not, write to the Free Software
34631 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
34632 + * MA 02111-1307 USA
34633 + */
34634 +
34635 +enum glamo_regster_offsets {
34636 + GLAMO_REGOFS_GENERIC = 0x0000,
34637 + GLAMO_REGOFS_HOSTBUS = 0x0200,
34638 + GLAMO_REGOFS_MEMORY = 0x0300,
34639 + GLAMO_REGOFS_VIDCAP = 0x0400,
34640 + GLAMO_REGOFS_ISP = 0x0500,
34641 + GLAMO_REGOFS_JPEG = 0x0800,
34642 + GLAMO_REGOFS_MPEG = 0x0c00,
34643 + GLAMO_REGOFS_LCD = 0x1100,
34644 + GLAMO_REGOFS_MMC = 0x1400,
34645 + GLAMO_REGOFS_MPROC0 = 0x1500,
34646 + GLAMO_REGOFS_MPROC1 = 0x1580,
34647 + GLAMO_REGOFS_CMDQUEUE = 0x1600,
34648 + GLAMO_REGOFS_RISC = 0x1680,
34649 + GLAMO_REGOFS_2D = 0x1700,
34650 + GLAMO_REGOFS_3D = 0x1b00,
34651 + GLAMO_REGOFS_END = 0x2400,
34652 +};
34653 +
34654 +
34655 +enum glamo_register_generic {
34656 + GLAMO_REG_GCONF1 = 0x0000,
34657 + GLAMO_REG_GCONF2 = 0x0002,
34658 +#define GLAMO_REG_DEVICE_ID GLAMO_REG_GCONF2
34659 + GLAMO_REG_GCONF3 = 0x0004,
34660 +#define GLAMO_REG_REVISION_ID GLAMO_REG_GCONF3
34661 + GLAMO_REG_IRQ_GEN1 = 0x0006,
34662 +#define GLAMO_REG_IRQ_ENABLE GLAMO_REG_IRQ_GEN1
34663 + GLAMO_REG_IRQ_GEN2 = 0x0008,
34664 +#define GLAMO_REG_IRQ_SET GLAMO_REG_IRQ_GEN2
34665 + GLAMO_REG_IRQ_GEN3 = 0x000a,
34666 +#define GLAMO_REG_IRQ_CLEAR GLAMO_REG_IRQ_GEN3
34667 + GLAMO_REG_IRQ_GEN4 = 0x000c,
34668 +#define GLAMO_REG_IRQ_STATUS GLAMO_REG_IRQ_GEN4
34669 + GLAMO_REG_CLOCK_HOST = 0x0010,
34670 + GLAMO_REG_CLOCK_MEMORY = 0x0012,
34671 + GLAMO_REG_CLOCK_LCD = 0x0014,
34672 + GLAMO_REG_CLOCK_MMC = 0x0016,
34673 + GLAMO_REG_CLOCK_ISP = 0x0018,
34674 + GLAMO_REG_CLOCK_JPEG = 0x001a,
34675 + GLAMO_REG_CLOCK_3D = 0x001c,
34676 + GLAMO_REG_CLOCK_2D = 0x001e,
34677 + GLAMO_REG_CLOCK_RISC1 = 0x0020, /* 3365 only? */
34678 + GLAMO_REG_CLOCK_RISC2 = 0x0022, /* 3365 only? */
34679 + GLAMO_REG_CLOCK_MPEG = 0x0024,
34680 + GLAMO_REG_CLOCK_MPROC = 0x0026,
34681 +
34682 + GLAMO_REG_CLOCK_GEN5_1 = 0x0030,
34683 + GLAMO_REG_CLOCK_GEN5_2 = 0x0032,
34684 + GLAMO_REG_CLOCK_GEN6 = 0x0034,
34685 + GLAMO_REG_CLOCK_GEN7 = 0x0036,
34686 + GLAMO_REG_CLOCK_GEN8 = 0x0038,
34687 + GLAMO_REG_CLOCK_GEN9 = 0x003a,
34688 + GLAMO_REG_CLOCK_GEN10 = 0x003c,
34689 + GLAMO_REG_CLOCK_GEN11 = 0x003e,
34690 + GLAMO_REG_PLL_GEN1 = 0x0040,
34691 + GLAMO_REG_PLL_GEN2 = 0x0042,
34692 + GLAMO_REG_PLL_GEN3 = 0x0044,
34693 + GLAMO_REG_PLL_GEN4 = 0x0046,
34694 + GLAMO_REG_PLL_GEN5 = 0x0048,
34695 + GLAMO_REG_GPIO_GEN1 = 0x0050,
34696 + GLAMO_REG_GPIO_GEN2 = 0x0052,
34697 + GLAMO_REG_GPIO_GEN3 = 0x0054,
34698 + GLAMO_REG_GPIO_GEN4 = 0x0056,
34699 + GLAMO_REG_GPIO_GEN5 = 0x0058,
34700 + GLAMO_REG_GPIO_GEN6 = 0x005a,
34701 + GLAMO_REG_GPIO_GEN7 = 0x005c,
34702 + GLAMO_REG_GPIO_GEN8 = 0x005e,
34703 + GLAMO_REG_GPIO_GEN9 = 0x0060,
34704 + GLAMO_REG_GPIO_GEN10 = 0x0062,
34705 + GLAMO_REG_DFT_GEN1 = 0x0070,
34706 + GLAMO_REG_DFT_GEN2 = 0x0072,
34707 + GLAMO_REG_DFT_GEN3 = 0x0074,
34708 + GLAMO_REG_DFT_GEN4 = 0x0076,
34709 +
34710 + GLAMO_REG_DFT_GEN5 = 0x01e0,
34711 + GLAMO_REG_DFT_GEN6 = 0x01f0,
34712 +};
34713 +
34714 +#define GLAMO_REG_HOSTBUS(x) (GLAMO_REGOFS_HOSTBUS-2+(x*2))
34715 +
34716 +#define REG_MEM(x) (GLAMO_REGOFS_MEMORY+(x))
34717 +#define GLAMO_REG_MEM_TIMING(x) (GLAMO_REG_MEM_TIMING1-2+(x*2))
34718 +
34719 +enum glamo_register_mem {
34720 + GLAMO_REG_MEM_TYPE = REG_MEM(0x00),
34721 + GLAMO_REG_MEM_GEN = REG_MEM(0x02),
34722 + GLAMO_REG_MEM_TIMING1 = REG_MEM(0x04),
34723 + GLAMO_REG_MEM_TIMING2 = REG_MEM(0x06),
34724 + GLAMO_REG_MEM_TIMING3 = REG_MEM(0x08),
34725 + GLAMO_REG_MEM_TIMING4 = REG_MEM(0x0a),
34726 + GLAMO_REG_MEM_TIMING5 = REG_MEM(0x0c),
34727 + GLAMO_REG_MEM_TIMING6 = REG_MEM(0x0e),
34728 + GLAMO_REG_MEM_TIMING7 = REG_MEM(0x10),
34729 + GLAMO_REG_MEM_TIMING8 = REG_MEM(0x12),
34730 + GLAMO_REG_MEM_TIMING9 = REG_MEM(0x14),
34731 + GLAMO_REG_MEM_TIMING10 = REG_MEM(0x16),
34732 + GLAMO_REG_MEM_TIMING11 = REG_MEM(0x18),
34733 + GLAMO_REG_MEM_POWER1 = REG_MEM(0x1a),
34734 + GLAMO_REG_MEM_POWER2 = REG_MEM(0x1c),
34735 + GLAMO_REG_MEM_LCD_BUF1 = REG_MEM(0x1e),
34736 + GLAMO_REG_MEM_LCD_BUF2 = REG_MEM(0x20),
34737 + GLAMO_REG_MEM_LCD_BUF3 = REG_MEM(0x22),
34738 + GLAMO_REG_MEM_LCD_BUF4 = REG_MEM(0x24),
34739 + GLAMO_REG_MEM_BIST1 = REG_MEM(0x26),
34740 + GLAMO_REG_MEM_BIST2 = REG_MEM(0x28),
34741 + GLAMO_REG_MEM_BIST3 = REG_MEM(0x2a),
34742 + GLAMO_REG_MEM_BIST4 = REG_MEM(0x2c),
34743 + GLAMO_REG_MEM_BIST5 = REG_MEM(0x2e),
34744 + GLAMO_REG_MEM_MAH1 = REG_MEM(0x30),
34745 + GLAMO_REG_MEM_MAH2 = REG_MEM(0x32),
34746 + GLAMO_REG_MEM_DRAM1 = REG_MEM(0x34),
34747 + GLAMO_REG_MEM_DRAM2 = REG_MEM(0x36),
34748 + GLAMO_REG_MEM_CRC = REG_MEM(0x38),
34749 +};
34750 +
34751 +#define GLAMO_MEM_TYPE_MASK 0x03
34752 +
34753 +enum glamo_reg_mem_dram1 {
34754 + /* b0 - b10 == refresh period, 1 -> 2048 clocks */
34755 + GLAMO_MEM_DRAM1_EN_GATE_CLK = (1 << 11),
34756 + GLAMO_MEM_DRAM1_SELF_REFRESH = (1 << 12),
34757 + GLAMO_MEM_DRAM1_EN_GATE_CKE = (1 << 13),
34758 + GLAMO_MEM_DRAM1_EN_DRAM_REFRESH = (1 << 14),
34759 + GLAMO_MEM_DRAM1_EN_MODEREG_SET = (1 << 15),
34760 +};
34761 +
34762 +enum glamo_reg_mem_dram2 {
34763 + GLAMO_MEM_DRAM2_DEEP_PWRDOWN = (1 << 12),
34764 +};
34765 +
34766 +enum glamo_irq_index {
34767 + GLAMO_IRQIDX_HOSTBUS = 0,
34768 + GLAMO_IRQIDX_JPEG = 1,
34769 + GLAMO_IRQIDX_MPEG = 2,
34770 + GLAMO_IRQIDX_MPROC1 = 3,
34771 + GLAMO_IRQIDX_MPROC0 = 4,
34772 + GLAMO_IRQIDX_CMDQUEUE = 5,
34773 + GLAMO_IRQIDX_2D = 6,
34774 + GLAMO_IRQIDX_MMC = 7,
34775 + GLAMO_IRQIDX_RISC = 8,
34776 +};
34777 +
34778 +enum glamo_irq {
34779 + GLAMO_IRQ_HOSTBUS = (1 << GLAMO_IRQIDX_HOSTBUS),
34780 + GLAMO_IRQ_JPEG = (1 << GLAMO_IRQIDX_JPEG),
34781 + GLAMO_IRQ_MPEG = (1 << GLAMO_IRQIDX_MPEG),
34782 + GLAMO_IRQ_MPROC1 = (1 << GLAMO_IRQIDX_MPROC1),
34783 + GLAMO_IRQ_MPROC0 = (1 << GLAMO_IRQIDX_MPROC0),
34784 + GLAMO_IRQ_CMDQUEUE = (1 << GLAMO_IRQIDX_CMDQUEUE),
34785 + GLAMO_IRQ_2D = (1 << GLAMO_IRQIDX_2D),
34786 + GLAMO_IRQ_MMC = (1 << GLAMO_IRQIDX_MMC),
34787 + GLAMO_IRQ_RISC = (1 << GLAMO_IRQIDX_RISC),
34788 +};
34789 +
34790 +enum glamo_reg_clock_host {
34791 + GLAMO_CLOCK_HOST_DG_BCLK = 0x0001,
34792 + GLAMO_CLOCK_HOST_DG_M0CLK = 0x0004,
34793 + GLAMO_CLOCK_HOST_RESET = 0x1000,
34794 +};
34795 +
34796 +enum glamo_reg_clock_mem {
34797 + GLAMO_CLOCK_MEM_DG_M1CLK = 0x0001,
34798 + GLAMO_CLOCK_MEM_EN_M1CLK = 0x0002,
34799 + GLAMO_CLOCK_MEM_DG_MOCACLK = 0x0004,
34800 + GLAMO_CLOCK_MEM_EN_MOCACLK = 0x0008,
34801 + GLAMO_CLOCK_MEM_RESET = 0x1000,
34802 + GLAMO_CLOCK_MOCA_RESET = 0x2000,
34803 +};
34804 +
34805 +enum glamo_reg_clock_lcd {
34806 + GLAMO_CLOCK_LCD_DG_DCLK = 0x0001,
34807 + GLAMO_CLOCK_LCD_EN_DCLK = 0x0002,
34808 + GLAMO_CLOCK_LCD_DG_DMCLK = 0x0004,
34809 + GLAMO_CLOCK_LCD_EN_DMCLK = 0x0008,
34810 + //
34811 + GLAMO_CLOCK_LCD_EN_DHCLK = 0x0020,
34812 + GLAMO_CLOCK_LCD_DG_M5CLK = 0x0040,
34813 + GLAMO_CLOCK_LCD_EN_M5CLK = 0x0080,
34814 + GLAMO_CLOCK_LCD_RESET = 0x1000,
34815 +};
34816 +
34817 +enum glamo_reg_clock_mmc {
34818 + GLAMO_CLOCK_MMC_DG_TCLK = 0x0001,
34819 + GLAMO_CLOCK_MMC_EN_TCLK = 0x0002,
34820 + GLAMO_CLOCK_MMC_DG_M9CLK = 0x0004,
34821 + GLAMO_CLOCK_MMC_EN_M9CLK = 0x0008,
34822 + GLAMO_CLOCK_MMC_RESET = 0x1000,
34823 +};
34824 +
34825 +enum glamo_reg_basic_mmc {
34826 + /* set to disable CRC error rejection */
34827 + GLAMO_BASIC_MMC_DISABLE_CRC = 0x0001,
34828 + /* enable completion interrupt */
34829 + GLAMO_BASIC_MMC_EN_COMPL_INT = 0x0002,
34830 + /* stop MMC clock while enforced idle waiting for data from card */
34831 + GLAMO_BASIC_MMC_NO_CLK_RD_WAIT = 0x0004,
34832 + /* 0 = 1-bit bus to card, 1 = use 4-bit bus (has to be negotiated) */
34833 + GLAMO_BASIC_MMC_EN_4BIT_DATA = 0x0008,
34834 + /* enable 75K pullups on D3..D0 */
34835 + GLAMO_BASIC_MMC_EN_DATA_PUPS = 0x0010,
34836 + /* enable 75K pullup on CMD */
34837 + GLAMO_BASIC_MMC_EN_CMD_PUP = 0x0020,
34838 + /* IO drive strength 00=weak -> 11=strongest */
34839 + GLAMO_BASIC_MMC_EN_DR_STR0 = 0x0040,
34840 + GLAMO_BASIC_MMC_EN_DR_STR1 = 0x0080,
34841 + /* TCLK delay stage A, 0000 = 500ps --> 1111 = 8ns */
34842 + GLAMO_BASIC_MMC_EN_TCLK_DLYA0 = 0x0100,
34843 + GLAMO_BASIC_MMC_EN_TCLK_DLYA1 = 0x0200,
34844 + GLAMO_BASIC_MMC_EN_TCLK_DLYA2 = 0x0400,
34845 + GLAMO_BASIC_MMC_EN_TCLK_DLYA3 = 0x0800,
34846 + /* TCLK delay stage B (cumulative), 0000 = 500ps --> 1111 = 8ns */
34847 + GLAMO_BASIC_MMC_EN_TCLK_DLYB0 = 0x1000,
34848 + GLAMO_BASIC_MMC_EN_TCLK_DLYB1 = 0x2000,
34849 + GLAMO_BASIC_MMC_EN_TCLK_DLYB2 = 0x4000,
34850 + GLAMO_BASIC_MMC_EN_TCLK_DLYB3 = 0x8000,
34851 +};
34852 +
34853 +enum glamo_reg_stat1_mmc {
34854 + /* command "counter" (really: toggle) */
34855 + GLAMO_STAT1_MMC_CMD_CTR = 0x8000,
34856 + /* engine is idle */
34857 + GLAMO_STAT1_MMC_IDLE = 0x4000,
34858 + /* readback response is ready */
34859 + GLAMO_STAT1_MMC_RB_RRDY = 0x0200,
34860 + /* readback data is ready */
34861 + GLAMO_STAT1_MMC_RB_DRDY = 0x0100,
34862 + /* no response timeout */
34863 + GLAMO_STAT1_MMC_RTOUT = 0x0020,
34864 + /* no data timeout */
34865 + GLAMO_STAT1_MMC_DTOUT = 0x0010,
34866 + /* CRC error on block write */
34867 + GLAMO_STAT1_MMC_BWERR = 0x0004,
34868 + /* CRC error on block read */
34869 + GLAMO_STAT1_MMC_BRERR = 0x0002
34870 +};
34871 +
34872 +enum glamo_reg_fire_mmc {
34873 + /* command "counter" (really: toggle)
34874 + * the STAT1 register reflects this so you can ensure you don't look
34875 + * at status for previous command
34876 + */
34877 + GLAMO_FIRE_MMC_CMD_CTR = 0x8000,
34878 + /* sets kind of response expected */
34879 + GLAMO_FIRE_MMC_RES_MASK = 0x0700,
34880 + /* sets command type */
34881 + GLAMO_FIRE_MMC_TYP_MASK = 0x00C0,
34882 + /* sets command class */
34883 + GLAMO_FIRE_MMC_CLS_MASK = 0x000F,
34884 +};
34885 +
34886 +enum glamo_fire_mmc_response_types {
34887 + GLAMO_FIRE_MMC_RSPT_R1 = 0x0000,
34888 + GLAMO_FIRE_MMC_RSPT_R1b = 0x0100,
34889 + GLAMO_FIRE_MMC_RSPT_R2 = 0x0200,
34890 + GLAMO_FIRE_MMC_RSPT_R3 = 0x0300,
34891 + GLAMO_FIRE_MMC_RSPT_R4 = 0x0400,
34892 + GLAMO_FIRE_MMC_RSPT_R5 = 0x0500,
34893 +};
34894 +
34895 +enum glamo_fire_mmc_command_types {
34896 + /* broadcast, no response */
34897 + GLAMO_FIRE_MMC_CMDT_BNR = 0x0000,
34898 + /* broadcast, with response */
34899 + GLAMO_FIRE_MMC_CMDT_BR = 0x0040,
34900 + /* addressed, no data */
34901 + GLAMO_FIRE_MMC_CMDT_AND = 0x0080,
34902 + /* addressed, with data */
34903 + GLAMO_FIRE_MMC_CMDT_AD = 0x00C0,
34904 +};
34905 +
34906 +enum glamo_fire_mmc_command_class {
34907 + /* "Stream Read" */
34908 + GLAMO_FIRE_MMC_CC_STRR = 0x0000,
34909 + /* Single Block Read */
34910 + GLAMO_FIRE_MMC_CC_SBR = 0x0001,
34911 + /* Multiple Block Read With Stop */
34912 + GLAMO_FIRE_MMC_CC_MBRS = 0x0002,
34913 + /* Multiple Block Read No Stop */
34914 + GLAMO_FIRE_MMC_CC_MBRNS = 0x0003,
34915 + /* RESERVED for "Stream Write" */
34916 + GLAMO_FIRE_MMC_CC_STRW = 0x0004,
34917 + /* "Stream Write" */
34918 + GLAMO_FIRE_MMC_CC_SBW = 0x0005,
34919 + /* RESERVED for Multiple Block Write With Stop */
34920 + GLAMO_FIRE_MMC_CC_MBWS = 0x0006,
34921 + /* Multiple Block Write No Stop */
34922 + GLAMO_FIRE_MMC_CC_MBWNS = 0x0007,
34923 + /* STOP command */
34924 + GLAMO_FIRE_MMC_CC_STOP = 0x0008,
34925 + /* Cancel on Running Command */
34926 + GLAMO_FIRE_MMC_CC_CANCL = 0x0009,
34927 + /* "Basic Command" */
34928 + GLAMO_FIRE_MMC_CC_BASIC = 0x000a,
34929 +};
34930 +
34931 +/* these are offsets from the start of the MMC register region */
34932 +enum glamo_register_mmc {
34933 + /* MMC command, b15..8 = cmd arg b7..0; b7..1 = CRC; b0 = end bit */
34934 + GLAMO_REG_MMC_CMD_REG1 = 0x00,
34935 + /* MMC command, b15..0 = cmd arg b23 .. 8 */
34936 + GLAMO_REG_MMC_CMD_REG2 = 0x02,
34937 + /* MMC command, b15=start, b14=transmission,
34938 + * b13..8=cmd idx, b7..0=cmd arg b31..24
34939 + */
34940 + GLAMO_REG_MMC_CMD_REG3 = 0x04,
34941 + GLAMO_REG_MMC_CMD_FIRE = 0x06,
34942 + GLAMO_REG_MMC_CMD_RSP1 = 0x10,
34943 + GLAMO_REG_MMC_CMD_RSP2 = 0x12,
34944 + GLAMO_REG_MMC_CMD_RSP3 = 0x14,
34945 + GLAMO_REG_MMC_CMD_RSP4 = 0x16,
34946 + GLAMO_REG_MMC_CMD_RSP5 = 0x18,
34947 + GLAMO_REG_MMC_CMD_RSP6 = 0x1a,
34948 + GLAMO_REG_MMC_CMD_RSP7 = 0x1c,
34949 + GLAMO_REG_MMC_CMD_RSP8 = 0x1e,
34950 + GLAMO_REG_MMC_RB_STAT1 = 0x20,
34951 + GLAMO_REG_MMC_RB_BLKCNT = 0x22,
34952 + GLAMO_REG_MMC_RB_BLKLEN = 0x24,
34953 + GLAMO_REG_MMC_BASIC = 0x30,
34954 + GLAMO_REG_MMC_RDATADS1 = 0x34,
34955 + GLAMO_REG_MMC_RDATADS2 = 0x36,
34956 + GLAMO_REG_MMC_WDATADS1 = 0x38,
34957 + GLAMO_REG_MMC_WDATADS2 = 0x3a,
34958 + GLAMO_REG_MMC_DATBLKCNT = 0x3c,
34959 + GLAMO_REG_MMC_DATBLKLEN = 0x3e,
34960 + GLAMO_REG_MMC_TIMEOUT = 0x40,
34961 +
34962 +};
34963 +
34964 +enum glamo_reg_clock_isp {
34965 + GLAMO_CLOCK_ISP_DG_I1CLK = 0x0001,
34966 + GLAMO_CLOCK_ISP_EN_I1CLK = 0x0002,
34967 + GLAMO_CLOCK_ISP_DG_CCLK = 0x0004,
34968 + GLAMO_CLOCK_ISP_EN_CCLK = 0x0008,
34969 + //
34970 + GLAMO_CLOCK_ISP_EN_SCLK = 0x0020,
34971 + GLAMO_CLOCK_ISP_DG_M2CLK = 0x0040,
34972 + GLAMO_CLOCK_ISP_EN_M2CLK = 0x0080,
34973 + GLAMO_CLOCK_ISP_DG_M15CLK = 0x0100,
34974 + GLAMO_CLOCK_ISP_EN_M15CLK = 0x0200,
34975 + GLAMO_CLOCK_ISP1_RESET = 0x1000,
34976 + GLAMO_CLOCK_ISP2_RESET = 0x2000,
34977 +};
34978 +
34979 +enum glamo_reg_clock_jpeg {
34980 + GLAMO_CLOCK_JPEG_DG_JCLK = 0x0001,
34981 + GLAMO_CLOCK_JPEG_EN_JCLK = 0x0002,
34982 + GLAMO_CLOCK_JPEG_DG_M3CLK = 0x0004,
34983 + GLAMO_CLOCK_JPEG_EN_M3CLK = 0x0008,
34984 + GLAMO_CLOCK_JPEG_RESET = 0x1000,
34985 +};
34986 +
34987 +enum glamo_reg_clock_2d {
34988 + GLAMO_CLOCK_2D_DG_GCLK = 0x0001,
34989 + GLAMO_CLOCK_2D_EN_GCLK = 0x0002,
34990 + GLAMO_CLOCK_2D_DG_M7CLK = 0x0004,
34991 + GLAMO_CLOCK_2D_EN_M7CLK = 0x0008,
34992 + GLAMO_CLOCK_2D_DG_M6CLK = 0x0010,
34993 + GLAMO_CLOCK_2D_EN_M6CLK = 0x0020,
34994 + GLAMO_CLOCK_2D_RESET = 0x1000,
34995 + GLAMO_CLOCK_2D_CQ_RESET = 0x2000,
34996 +};
34997 +
34998 +enum glamo_reg_clock_3d {
34999 + GLAMO_CLOCK_3D_DG_ECLK = 0x0001,
35000 + GLAMO_CLOCK_3D_EN_ECLK = 0x0002,
35001 + GLAMO_CLOCK_3D_DG_RCLK = 0x0004,
35002 + GLAMO_CLOCK_3D_EN_RCLK = 0x0008,
35003 + GLAMO_CLOCK_3D_DG_M8CLK = 0x0010,
35004 + GLAMO_CLOCK_3D_EN_M8CLK = 0x0020,
35005 + GLAMO_CLOCK_3D_BACK_RESET = 0x1000,
35006 + GLAMO_CLOCK_3D_FRONT_RESET = 0x2000,
35007 +};
35008 +
35009 +enum glamo_reg_clock_mpeg {
35010 + GLAMO_CLOCK_MPEG_DG_X0CLK = 0x0001,
35011 + GLAMO_CLOCK_MPEG_EN_X0CLK = 0x0002,
35012 + GLAMO_CLOCK_MPEG_DG_X1CLK = 0x0004,
35013 + GLAMO_CLOCK_MPEG_EN_X1CLK = 0x0008,
35014 + GLAMO_CLOCK_MPEG_DG_X2CLK = 0x0010,
35015 + GLAMO_CLOCK_MPEG_EN_X2CLK = 0x0020,
35016 + GLAMO_CLOCK_MPEG_DG_X3CLK = 0x0040,
35017 + GLAMO_CLOCK_MPEG_EN_X3CLK = 0x0080,
35018 + GLAMO_CLOCK_MPEG_DG_X4CLK = 0x0100,
35019 + GLAMO_CLOCK_MPEG_EN_X4CLK = 0x0200,
35020 + GLAMO_CLOCK_MPEG_DG_X6CLK = 0x0400,
35021 + GLAMO_CLOCK_MPEG_EN_X6CLK = 0x0800,
35022 + GLAMO_CLOCK_MPEG_ENC_RESET = 0x1000,
35023 + GLAMO_CLOCK_MPEG_DEC_RESET = 0x2000,
35024 +};
35025 +
35026 +enum glamo_reg_clock51 {
35027 + GLAMO_CLOCK_GEN51_EN_DIV_MCLK = 0x0001,
35028 + GLAMO_CLOCK_GEN51_EN_DIV_SCLK = 0x0002,
35029 + GLAMO_CLOCK_GEN51_EN_DIV_JCLK = 0x0004,
35030 + GLAMO_CLOCK_GEN51_EN_DIV_DCLK = 0x0008,
35031 + GLAMO_CLOCK_GEN51_EN_DIV_DMCLK = 0x0010,
35032 + GLAMO_CLOCK_GEN51_EN_DIV_DHCLK = 0x0020,
35033 + GLAMO_CLOCK_GEN51_EN_DIV_GCLK = 0x0040,
35034 + GLAMO_CLOCK_GEN51_EN_DIV_TCLK = 0x0080,
35035 + /* FIXME: higher bits */
35036 +};
35037 +
35038 +enum glamo_reg_hostbus2 {
35039 + GLAMO_HOSTBUS2_MMIO_EN_ISP = 0x0001,
35040 + GLAMO_HOSTBUS2_MMIO_EN_JPEG = 0x0002,
35041 + GLAMO_HOSTBUS2_MMIO_EN_MPEG = 0x0004,
35042 + GLAMO_HOSTBUS2_MMIO_EN_LCD = 0x0008,
35043 + GLAMO_HOSTBUS2_MMIO_EN_MMC = 0x0010,
35044 + GLAMO_HOSTBUS2_MMIO_EN_MICROP0 = 0x0020,
35045 + GLAMO_HOSTBUS2_MMIO_EN_MICROP1 = 0x0040,
35046 + GLAMO_HOSTBUS2_MMIO_EN_CQ = 0x0080,
35047 + GLAMO_HOSTBUS2_MMIO_EN_RISC = 0x0100,
35048 + GLAMO_HOSTBUS2_MMIO_EN_2D = 0x0200,
35049 + GLAMO_HOSTBUS2_MMIO_EN_3D = 0x0400,
35050 +};
35051 +
35052 +/* LCD Controller */
35053 +
35054 +#define REG_LCD(x) (x)
35055 +enum glamo_reg_lcd {
35056 + GLAMO_REG_LCD_MODE1 = REG_LCD(0x00),
35057 + GLAMO_REG_LCD_MODE2 = REG_LCD(0x02),
35058 + GLAMO_REG_LCD_MODE3 = REG_LCD(0x04),
35059 + GLAMO_REG_LCD_WIDTH = REG_LCD(0x06),
35060 + GLAMO_REG_LCD_HEIGHT = REG_LCD(0x08),
35061 + GLAMO_REG_LCD_POLARITY = REG_LCD(0x0a),
35062 + GLAMO_REG_LCD_A_BASE1 = REG_LCD(0x0c),
35063 + GLAMO_REG_LCD_A_BASE2 = REG_LCD(0x0e),
35064 + GLAMO_REG_LCD_B_BASE1 = REG_LCD(0x10),
35065 + GLAMO_REG_LCD_B_BASE2 = REG_LCD(0x12),
35066 + GLAMO_REG_LCD_C_BASE1 = REG_LCD(0x14),
35067 + GLAMO_REG_LCD_C_BASE2 = REG_LCD(0x16),
35068 + GLAMO_REG_LCD_PITCH = REG_LCD(0x18),
35069 + /* RES */
35070 + GLAMO_REG_LCD_HORIZ_TOTAL = REG_LCD(0x1c),
35071 + /* RES */
35072 + GLAMO_REG_LCD_HORIZ_RETR_START = REG_LCD(0x20),
35073 + /* RES */
35074 + GLAMO_REG_LCD_HORIZ_RETR_END = REG_LCD(0x24),
35075 + /* RES */
35076 + GLAMO_REG_LCD_HORIZ_DISP_START = REG_LCD(0x28),
35077 + /* RES */
35078 + GLAMO_REG_LCD_HORIZ_DISP_END = REG_LCD(0x2c),
35079 + /* RES */
35080 + GLAMO_REG_LCD_VERT_TOTAL = REG_LCD(0x30),
35081 + /* RES */
35082 + GLAMO_REG_LCD_VERT_RETR_START = REG_LCD(0x34),
35083 + /* RES */
35084 + GLAMO_REG_LCD_VERT_RETR_END = REG_LCD(0x38),
35085 + /* RES */
35086 + GLAMO_REG_LCD_VERT_DISP_START = REG_LCD(0x3c),
35087 + /* RES */
35088 + GLAMO_REG_LCD_VERT_DISP_END = REG_LCD(0x40),
35089 + /* RES */
35090 + GLAMO_REG_LCD_POL = REG_LCD(0x44),
35091 + GLAMO_REG_LCD_DATA_START = REG_LCD(0x46),
35092 + GLAMO_REG_LCD_FRATE_CONTRO = REG_LCD(0x48),
35093 + GLAMO_REG_LCD_DATA_CMD_HDR = REG_LCD(0x4a),
35094 + GLAMO_REG_LCD_SP_START = REG_LCD(0x4c),
35095 + GLAMO_REG_LCD_SP_END = REG_LCD(0x4e),
35096 + GLAMO_REG_LCD_CURSOR_BASE1 = REG_LCD(0x50),
35097 + GLAMO_REG_LCD_CURSOR_BASE2 = REG_LCD(0x52),
35098 + GLAMO_REG_LCD_CURSOR_PITCH = REG_LCD(0x54),
35099 + GLAMO_REG_LCD_CURSOR_X_SIZE = REG_LCD(0x56),
35100 + GLAMO_REG_LCD_CURSOR_Y_SIZE = REG_LCD(0x58),
35101 + GLAMO_REG_LCD_CURSOR_X_POS = REG_LCD(0x5a),
35102 + GLAMO_REG_LCD_CURSOR_Y_POS = REG_LCD(0x5c),
35103 + GLAMO_REG_LCD_CURSOR_PRESET = REG_LCD(0x5e),
35104 + GLAMO_REG_LCD_CURSOR_FG_COLOR = REG_LCD(0x60),
35105 + /* RES */
35106 + GLAMO_REG_LCD_CURSOR_BG_COLOR = REG_LCD(0x64),
35107 + /* RES */
35108 + GLAMO_REG_LCD_CURSOR_DST_COLOR = REG_LCD(0x68),
35109 + /* RES */
35110 + GLAMO_REG_LCD_STATUS1 = REG_LCD(0x80),
35111 + GLAMO_REG_LCD_STATUS2 = REG_LCD(0x82),
35112 + GLAMO_REG_LCD_STATUS3 = REG_LCD(0x84),
35113 + GLAMO_REG_LCD_STATUS4 = REG_LCD(0x86),
35114 + /* RES */
35115 + GLAMO_REG_LCD_COMMAND1 = REG_LCD(0xa0),
35116 + GLAMO_REG_LCD_COMMAND2 = REG_LCD(0xa2),
35117 + /* RES */
35118 + GLAMO_REG_LCD_WFORM_DELAY1 = REG_LCD(0xb0),
35119 + GLAMO_REG_LCD_WFORM_DELAY2 = REG_LCD(0xb2),
35120 + /* RES */
35121 + GLAMO_REG_LCD_GAMMA_CORR = REG_LCD(0x100),
35122 + /* RES */
35123 + GLAMO_REG_LCD_GAMMA_R_ENTRY01 = REG_LCD(0x110),
35124 + GLAMO_REG_LCD_GAMMA_R_ENTRY23 = REG_LCD(0x112),
35125 + GLAMO_REG_LCD_GAMMA_R_ENTRY45 = REG_LCD(0x114),
35126 + GLAMO_REG_LCD_GAMMA_R_ENTRY67 = REG_LCD(0x116),
35127 + GLAMO_REG_LCD_GAMMA_R_ENTRY8 = REG_LCD(0x118),
35128 + /* RES */
35129 + GLAMO_REG_LCD_GAMMA_G_ENTRY01 = REG_LCD(0x130),
35130 + GLAMO_REG_LCD_GAMMA_G_ENTRY23 = REG_LCD(0x132),
35131 + GLAMO_REG_LCD_GAMMA_G_ENTRY45 = REG_LCD(0x134),
35132 + GLAMO_REG_LCD_GAMMA_G_ENTRY67 = REG_LCD(0x136),
35133 + GLAMO_REG_LCD_GAMMA_G_ENTRY8 = REG_LCD(0x138),
35134 + /* RES */
35135 + GLAMO_REG_LCD_GAMMA_B_ENTRY01 = REG_LCD(0x150),
35136 + GLAMO_REG_LCD_GAMMA_B_ENTRY23 = REG_LCD(0x152),
35137 + GLAMO_REG_LCD_GAMMA_B_ENTRY45 = REG_LCD(0x154),
35138 + GLAMO_REG_LCD_GAMMA_B_ENTRY67 = REG_LCD(0x156),
35139 + GLAMO_REG_LCD_GAMMA_B_ENTRY8 = REG_LCD(0x158),
35140 + /* RES */
35141 + GLAMO_REG_LCD_SRAM_DRIVING1 = REG_LCD(0x160),
35142 + GLAMO_REG_LCD_SRAM_DRIVING2 = REG_LCD(0x162),
35143 + GLAMO_REG_LCD_SRAM_DRIVING3 = REG_LCD(0x164),
35144 +};
35145 +
35146 +enum glamo_reg_lcd_mode1 {
35147 + GLAMO_LCD_MODE1_PWRSAVE = 0x0001,
35148 + GLAMO_LCD_MODE1_PARTIAL_PRT = 0x0002,
35149 + GLAMO_LCD_MODE1_HWFLIP = 0x0004,
35150 + GLAMO_LCD_MODE1_LCD2 = 0x0008,
35151 + /* RES */
35152 + GLAMO_LCD_MODE1_PARTIAL_MODE = 0x0020,
35153 + GLAMO_LCD_MODE1_CURSOR_DSTCOLOR = 0x0040,
35154 + GLAMO_LCD_MODE1_PARTIAL_ENABLE = 0x0080,
35155 + GLAMO_LCD_MODE1_TVCLK_IN_ENABLE = 0x0100,
35156 + GLAMO_LCD_MODE1_HSYNC_HIGH_ACT = 0x0200,
35157 + GLAMO_LCD_MODE1_VSYNC_HIGH_ACT = 0x0400,
35158 + GLAMO_LCD_MODE1_HSYNC_FLIP = 0x0800,
35159 + GLAMO_LCD_MODE1_GAMMA_COR_EN = 0x1000,
35160 + GLAMO_LCD_MODE1_DITHER_EN = 0x2000,
35161 + GLAMO_LCD_MODE1_CURSOR_EN = 0x4000,
35162 + GLAMO_LCD_MODE1_ROTATE_EN = 0x8000,
35163 +};
35164 +
35165 +enum glamo_reg_lcd_mode2 {
35166 + GLAMO_LCD_MODE2_CRC_CHECK_EN = 0x0001,
35167 + GLAMO_LCD_MODE2_DCMD_PER_LINE = 0x0002,
35168 + GLAMO_LCD_MODE2_NOUSE_BDEF = 0x0004,
35169 + GLAMO_LCD_MODE2_OUT_POS_MODE = 0x0008,
35170 + GLAMO_LCD_MODE2_FRATE_CTRL_EN = 0x0010,
35171 + GLAMO_LCD_MODE2_SINGLE_BUFFER = 0x0020,
35172 + GLAMO_LCD_MODE2_SER_LSB_TO_MSB = 0x0040,
35173 + /* FIXME */
35174 +};
35175 +
35176 +enum glamo_reg_lcd_mode3 {
35177 + /* LCD color source data format */
35178 + GLAMO_LCD_SRC_RGB565 = 0x0000,
35179 + GLAMO_LCD_SRC_ARGB1555 = 0x4000,
35180 + GLAMO_LCD_SRC_ARGB4444 = 0x8000,
35181 + /* interface type */
35182 + GLAMO_LCD_MODE3_LCD = 0x1000,
35183 + GLAMO_LCD_MODE3_RGB = 0x0800,
35184 + GLAMO_LCD_MODE3_CPU = 0x0000,
35185 + /* mode */
35186 + GLAMO_LCD_MODE3_RGB332 = 0x0000,
35187 + GLAMO_LCD_MODE3_RGB444 = 0x0100,
35188 + GLAMO_LCD_MODE3_RGB565 = 0x0200,
35189 + GLAMO_LCD_MODE3_RGB666 = 0x0300,
35190 + /* depth */
35191 + GLAMO_LCD_MODE3_6BITS = 0x0000,
35192 + GLAMO_LCD_MODE3_8BITS = 0x0010,
35193 + GLAMO_LCD_MODE3_9BITS = 0x0020,
35194 + GLAMO_LCD_MODE3_16BITS = 0x0030,
35195 + GLAMO_LCD_MODE3_18BITS = 0x0040,
35196 +};
35197 +
35198 +enum glamo_lcd_rot_mode {
35199 + GLAMO_LCD_ROT_MODE_0 = 0x0000,
35200 + GLAMO_LCD_ROT_MODE_180 = 0x2000,
35201 + GLAMO_LCD_ROT_MODE_MIRROR = 0x4000,
35202 + GLAMO_LCD_ROT_MODE_FLIP = 0x6000,
35203 + GLAMO_LCD_ROT_MODE_90 = 0x8000,
35204 + GLAMO_LCD_ROT_MODE_270 = 0xa000,
35205 +};
35206 +#define GLAMO_LCD_ROT_MODE_MASK 0xe000
35207 +
35208 +enum glamo_lcd_cmd_type {
35209 + GLAMO_LCD_CMD_TYPE_DISP = 0x0000,
35210 + GLAMO_LCD_CMD_TYPE_PARALLEL = 0x4000,
35211 + GLAMO_LCD_CMD_TYPE_SERIAL = 0x8000,
35212 + GLAMO_LCD_CMD_TYPE_SERIAL_DIRECT= 0xc000,
35213 +};
35214 +#define GLAMO_LCD_CMD_TYPE_MASK 0xc000
35215 +
35216 +enum glamo_lcd_cmds {
35217 + GLAMO_LCD_CMD_DATA_DISP_FIRE = 0x00,
35218 + GLAMO_LCD_CMD_DATA_DISP_SYNC = 0x01, /* RGB only */
35219 + /* switch to command mode, no display */
35220 + GLAMO_LCD_CMD_DATA_FIRE_NO_DISP = 0x02,
35221 + /* display until VSYNC, switch to command */
35222 + GLAMO_LCD_CMD_DATA_FIRE_VSYNC = 0x11,
35223 + /* display until HSYNC, switch to command */
35224 + GLAMO_LCD_CMD_DATA_FIRE_HSYNC = 0x12,
35225 + /* display until VSYNC, 1 black frame, VSYNC, switch to command */
35226 + GLAMO_LCD_CMD_DATA_FIRE_VSYNC_B = 0x13,
35227 + /* don't care about display and switch to command */
35228 + GLAMO_LCD_CMD_DATA_FIRE_FREE = 0x14, /* RGB only */
35229 + /* don't care about display, keep data display but disable data,
35230 + * and switch to command */
35231 + GLAMO_LCD_CMD_DATA_FIRE_FREE_D = 0x15, /* RGB only */
35232 +};
35233 +
35234 +enum glamo_core_revisions {
35235 + GLAMO_CORE_REV_A0 = 0x0000,
35236 + GLAMO_CORE_REV_A1 = 0x0001,
35237 + GLAMO_CORE_REV_A2 = 0x0002,
35238 + GLAMO_CORE_REV_A3 = 0x0003,
35239 +};
35240 +
35241 +#endif /* _GLAMO_REGS_H */
35242 Index: linux-2.6.24.7/drivers/mfd/glamo/glamo-spi-gpio.c
35243 ===================================================================
35244 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
35245 +++ linux-2.6.24.7/drivers/mfd/glamo/glamo-spi-gpio.c 2008-12-11 22:46:49.000000000 +0100
35246 @@ -0,0 +1,288 @@
35247 +/*
35248 + * Copyright (C) 2007 Openmoko, Inc.
35249 + * Author: Harald Welte <laforge@openmoko.org>
35250 + *
35251 + * Smedia Glamo GPIO based SPI driver
35252 + *
35253 + * This program is free software; you can redistribute it and/or modify
35254 + * it under the terms of the GNU General Public License version 2 as
35255 + * published by the Free Software Foundation.
35256 + *
35257 + * This driver currently only implements a minimum subset of the hardware
35258 + * features, esp. those features that are required to drive the jbt6k74
35259 + * LCM controller asic in the TD028TTEC1 LCM.
35260 + *
35261 +*/
35262 +
35263 +#define DEBUG
35264 +
35265 +#include <linux/kernel.h>
35266 +#include <linux/init.h>
35267 +#include <linux/delay.h>
35268 +#include <linux/device.h>
35269 +#include <linux/spinlock.h>
35270 +#include <linux/workqueue.h>
35271 +#include <linux/platform_device.h>
35272 +
35273 +#include <linux/spi/spi.h>
35274 +#include <linux/spi/spi_bitbang.h>
35275 +#include <linux/spi/glamo.h>
35276 +
35277 +#include <linux/glamofb.h>
35278 +
35279 +#include <asm/hardware.h>
35280 +
35281 +#include "glamo-core.h"
35282 +#include "glamo-regs.h"
35283 +
35284 +struct glamo_spigpio {
35285 + struct spi_bitbang bitbang;
35286 + struct spi_master *master;
35287 + struct glamo_spigpio_info *info;
35288 + struct glamo_core *glamo;
35289 +};
35290 +
35291 +static inline struct glamo_spigpio *to_sg(struct spi_device *spi)
35292 +{
35293 + return spi->controller_data;
35294 +}
35295 +
35296 +static inline void setsck(struct spi_device *dev, int on)
35297 +{
35298 + struct glamo_spigpio *sg = to_sg(dev);
35299 + glamo_gpio_setpin(sg->glamo, sg->info->pin_clk, on ? 1 : 0);
35300 +}
35301 +
35302 +static inline void setmosi(struct spi_device *dev, int on)
35303 +{
35304 + struct glamo_spigpio *sg = to_sg(dev);
35305 + glamo_gpio_setpin(sg->glamo, sg->info->pin_mosi, on ? 1 : 0);
35306 +}
35307 +
35308 +static inline u32 getmiso(struct spi_device *dev)
35309 +{
35310 + struct glamo_spigpio *sg = to_sg(dev);
35311 + if (sg->info->pin_miso)
35312 + return glamo_gpio_getpin(sg->glamo, sg->info->pin_miso) ? 1 : 0;
35313 + else
35314 + return 0;
35315 +}
35316 +
35317 +#define spidelay(x) ndelay(x)
35318 +
35319 +#define EXPAND_BITBANG_TXRX
35320 +#include <linux/spi/spi_bitbang.h>
35321 +
35322 +static u32 glamo_spigpio_txrx_mode0(struct spi_device *spi,
35323 + unsigned nsecs, u32 word, u8 bits)
35324 +{
35325 + return bitbang_txrx_be_cpha0(spi, nsecs, 0, word, bits);
35326 +}
35327 +
35328 +static u32 glamo_spigpio_txrx_mode1(struct spi_device *spi,
35329 + unsigned nsecs, u32 word, u8 bits)
35330 +{
35331 + return bitbang_txrx_be_cpha1(spi, nsecs, 0, word, bits);
35332 +}
35333 +
35334 +static u32 glamo_spigpio_txrx_mode2(struct spi_device *spi,
35335 + unsigned nsecs, u32 word, u8 bits)
35336 +{
35337 + return bitbang_txrx_be_cpha0(spi, nsecs, 1, word, bits);
35338 +}
35339 +
35340 +static u32 glamo_spigpio_txrx_mode3(struct spi_device *spi,
35341 + unsigned nsecs, u32 word, u8 bits)
35342 +{
35343 + return bitbang_txrx_be_cpha1(spi, nsecs, 1, word, bits);
35344 +}
35345 +
35346 +
35347 +#if 0
35348 +static int glamo_spigpio_setupxfer(struct spi_device *spi,
35349 + struct spi_transfer *t)
35350 +{
35351 + struct glamo_spi *gs = to_sg(spi);
35352 + unsigned int bpw;
35353 +
35354 + bpw = t ? t->bits_per_word : spi->bits_per_word;
35355 +
35356 + if (bpw != 9 && bpw != 8) {
35357 + dev_err(&spi->dev, "invalid bits-per-word (%d)\n", bpw);
35358 + return -EINVAL;
35359 + }
35360 +
35361 + return 0;
35362 +}
35363 +#endif
35364 +
35365 +static void glamo_spigpio_chipsel(struct spi_device *spi, int value)
35366 +{
35367 + struct glamo_spigpio *gs = to_sg(spi);
35368 +#if 0
35369 + dev_dbg(&spi->dev, "chipsel %d: spi=%p, gs=%p, info=%p, handle=%p\n",
35370 + value, spi, gs, gs->info, gs->info->glamo);
35371 +#endif
35372 + glamo_gpio_setpin(gs->glamo, gs->info->pin_cs, value ? 0 : 1);
35373 +}
35374 +
35375 +
35376 +static int glamo_spigpio_probe(struct platform_device *pdev)
35377 +{
35378 + struct spi_master *master;
35379 + struct glamo_spigpio *sp;
35380 + int ret;
35381 + int i;
35382 +
35383 + master = spi_alloc_master(&pdev->dev, sizeof(struct glamo_spigpio));
35384 + if (master == NULL) {
35385 + dev_err(&pdev->dev, "failed to allocate spi master\n");
35386 + ret = -ENOMEM;
35387 + goto err;
35388 + }
35389 +
35390 + sp = spi_master_get_devdata(master);
35391 + platform_set_drvdata(pdev, sp);
35392 + sp->info = pdev->dev.platform_data;
35393 + if (!sp->info) {
35394 + dev_err(&pdev->dev, "can't operate without platform data\n");
35395 + ret = -EIO;
35396 + goto err_no_pdev;
35397 + }
35398 +
35399 + master->num_chipselect = 1;
35400 + master->bus_num = 2; /* FIXME: use dynamic number */
35401 +
35402 + sp->master = spi_master_get(master);
35403 + sp->glamo = sp->info->glamo;
35404 +
35405 + sp->bitbang.master = sp->master;
35406 + sp->bitbang.chipselect = glamo_spigpio_chipsel;
35407 + sp->bitbang.txrx_word[SPI_MODE_0] = glamo_spigpio_txrx_mode0;
35408 + sp->bitbang.txrx_word[SPI_MODE_1] = glamo_spigpio_txrx_mode1;
35409 + sp->bitbang.txrx_word[SPI_MODE_2] = glamo_spigpio_txrx_mode2;
35410 + sp->bitbang.txrx_word[SPI_MODE_3] = glamo_spigpio_txrx_mode3;
35411 +
35412 + /* set state of spi pins */
35413 + glamo_gpio_setpin(sp->glamo, sp->info->pin_clk, 0);
35414 + glamo_gpio_setpin(sp->glamo, sp->info->pin_mosi, 0);
35415 + glamo_gpio_setpin(sp->glamo, sp->info->pin_cs, 1);
35416 +
35417 + glamo_gpio_cfgpin(sp->glamo, sp->info->pin_clk);
35418 + glamo_gpio_cfgpin(sp->glamo, sp->info->pin_mosi);
35419 + glamo_gpio_cfgpin(sp->glamo, sp->info->pin_cs);
35420 + if (sp->info->pin_miso)
35421 + glamo_gpio_cfgpin(sp->glamo, sp->info->pin_miso);
35422 +
35423 + /* bring the LCM panel out of reset if it isn't already */
35424 +
35425 + glamo_gpio_setpin(sp->glamo, GLAMO_GPIO4, 1);
35426 + glamo_gpio_cfgpin(sp->glamo, GLAMO_GPIO4_OUTPUT);
35427 + msleep(90);
35428 +
35429 +#if 0
35430 + sp->dev = &pdev->dev;
35431 +
35432 + sp->bitbang.setup_transfer = glamo_spi_setupxfer;
35433 + sp->bitbang.txrx_bufs = glamo_spi_txrx;
35434 + sp->bitbang.master->setup = glamo_spi_setup;
35435 +#endif
35436 +
35437 + ret = spi_bitbang_start(&sp->bitbang);
35438 + if (ret)
35439 + goto err_no_bitbang;
35440 +
35441 + /* register the chips to go with the board */
35442 +
35443 + for (i = 0; i < sp->info->board_size; i++) {
35444 + dev_info(&pdev->dev, "registering %p: %s\n",
35445 + &sp->info->board_info[i],
35446 + sp->info->board_info[i].modalias);
35447 +
35448 + sp->info->board_info[i].controller_data = sp;
35449 + spi_new_device(master, sp->info->board_info + i);
35450 + }
35451 +
35452 + return 0;
35453 +
35454 +err_no_bitbang:
35455 + platform_set_drvdata(pdev, NULL);
35456 +err_no_pdev:
35457 + spi_master_put(sp->bitbang.master);
35458 +err:
35459 + return ret;
35460 +
35461 +}
35462 +
35463 +static int glamo_spigpio_remove(struct platform_device *pdev)
35464 +{
35465 + struct glamo_spigpio *sp = platform_get_drvdata(pdev);
35466 +
35467 + spi_bitbang_stop(&sp->bitbang);
35468 + spi_master_put(sp->bitbang.master);
35469 +
35470 + return 0;
35471 +}
35472 +
35473 +/*#define glamo_spigpio_suspend NULL
35474 +#define glamo_spigpio_resume NULL
35475 +*/
35476 +
35477 +
35478 +#ifdef CONFIG_PM
35479 +static int glamo_spigpio_suspend(struct platform_device *pdev, pm_message_t state)
35480 +{
35481 + return 0;
35482 +}
35483 +
35484 +static int glamo_spigpio_resume(struct platform_device *pdev)
35485 +{
35486 + struct glamo_spigpio *sp = platform_get_drvdata(pdev);
35487 +
35488 + if (!sp)
35489 + return 0;
35490 +
35491 + /* set state of spi pins */
35492 + glamo_gpio_setpin(sp->glamo, sp->info->pin_clk, 0);
35493 + glamo_gpio_setpin(sp->glamo, sp->info->pin_mosi, 0);
35494 + glamo_gpio_setpin(sp->glamo, sp->info->pin_cs, 1);
35495 +
35496 + glamo_gpio_cfgpin(sp->glamo, sp->info->pin_clk);
35497 + glamo_gpio_cfgpin(sp->glamo, sp->info->pin_mosi);
35498 + glamo_gpio_cfgpin(sp->glamo, sp->info->pin_cs);
35499 + if (sp->info->pin_miso)
35500 + glamo_gpio_cfgpin(sp->glamo, sp->info->pin_miso);
35501 +
35502 + return 0;
35503 +}
35504 +#endif
35505 +
35506 +static struct platform_driver glamo_spi_drv = {
35507 + .probe = glamo_spigpio_probe,
35508 + .remove = glamo_spigpio_remove,
35509 +#ifdef CONFIG_PM
35510 + .suspend_late = glamo_spigpio_suspend,
35511 + .resume_early = glamo_spigpio_resume,
35512 +#endif
35513 + .driver = {
35514 + .name = "glamo-spi-gpio",
35515 + .owner = THIS_MODULE,
35516 + },
35517 +};
35518 +
35519 +static int __init glamo_spi_init(void)
35520 +{
35521 + return platform_driver_register(&glamo_spi_drv);
35522 +}
35523 +
35524 +static void __exit glamo_spi_exit(void)
35525 +{
35526 + platform_driver_unregister(&glamo_spi_drv);
35527 +}
35528 +
35529 +module_init(glamo_spi_init);
35530 +module_exit(glamo_spi_exit);
35531 +
35532 +MODULE_DESCRIPTION("Smedia Glamo 336x/337x LCM serial command SPI Driver");
35533 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>")
35534 +MODULE_LICENSE("GPL");
35535 Index: linux-2.6.24.7/drivers/mfd/glamo/Kconfig
35536 ===================================================================
35537 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
35538 +++ linux-2.6.24.7/drivers/mfd/glamo/Kconfig 2008-12-11 22:46:49.000000000 +0100
35539 @@ -0,0 +1,44 @@
35540 +config MFD_GLAMO
35541 + bool "Smedia Glamo 336x/337x support"
35542 + help
35543 + This enables the core driver for the Smedia Glamo 336x/337x
35544 + multi-function device. It includes irq_chip demultiplex as
35545 + well as clock / power management and GPIO support.
35546 +
35547 +config MFD_GLAMO_FB
35548 + tristate "Smedia Glamo 336x/337x framebuffer support"
35549 + depends on FB && MFD_GLAMO
35550 + help
35551 + Frame buffer driver for the LCD controller in the Smedia Glamo
35552 + 336x/337x.
35553 +
35554 + This driver is also available as a module ( = code which can be
35555 + inserted and removed from the running kernel whenever you want). The
35556 + module will be called glamofb. If you want to compile it as a module,
35557 + say M here and read <file:Documentation/modules.txt>.
35558 +
35559 + If unsure, say N.
35560 +
35561 +config MFD_GLAMO_SPI_GPIO
35562 + tristate "Glamo GPIO SPI bitbang support"
35563 + depends on MFD_GLAMO
35564 + help
35565 + Enable a bitbanging SPI adapter driver for the Smedia Glamo.
35566 +
35567 +config MFD_GLAMO_SPI_FB
35568 + tristate "Glamo LCM control channel SPI support"
35569 + depends on MFD_GLAMO_FB
35570 + help
35571 + Enable a bitbanging SPI adapter driver for the Smedia Glamo LCM
35572 + control channel. This SPI interface is frequently used to
35573 + interconnect the LCM control interface.
35574 +
35575 +config MFD_GLAMO_MCI
35576 + tristate "Glamo S3C SD/MMC Card Interface support"
35577 + depends on MFD_GLAMO && MMC
35578 + help
35579 + This selects a driver for the MCI interface found in
35580 + the S-Media GLAMO chip, as used in Openmoko
35581 + neo1973 GTA-02.
35582 +
35583 + If unsure, say N.
35584 \ No newline at end of file
35585 Index: linux-2.6.24.7/drivers/mfd/glamo/Makefile
35586 ===================================================================
35587 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
35588 +++ linux-2.6.24.7/drivers/mfd/glamo/Makefile 2008-12-11 22:46:49.000000000 +0100
35589 @@ -0,0 +1,12 @@
35590 +#
35591 +# Makefile for the Smedia Glamo framebuffer driver
35592 +#
35593 +
35594 +obj-$(CONFIG_MFD_GLAMO) += glamo-core.o glamo-gpio.o
35595 +obj-$(CONFIG_MFD_GLAMO_SPI) += glamo-spi.o
35596 +obj-$(CONFIG_MFD_GLAMO_SPI_GPIO) += glamo-spi-gpio.o
35597 +
35598 +obj-$(CONFIG_MFD_GLAMO_FB) += glamo-fb.o
35599 +obj-$(CONFIG_MFD_GLAMO_SPI_FB) += glamo-lcm-spi.o
35600 +obj-$(CONFIG_MFD_GLAMO_MCI) += glamo-mci.o
35601 +
35602 Index: linux-2.6.24.7/drivers/mfd/Kconfig
35603 ===================================================================
35604 --- linux-2.6.24.7.orig/drivers/mfd/Kconfig 2008-12-11 22:46:07.000000000 +0100
35605 +++ linux-2.6.24.7/drivers/mfd/Kconfig 2008-12-11 22:46:49.000000000 +0100
35606 @@ -15,6 +15,8 @@ config MFD_SM501
35607 interface. The device may be connected by PCI or local bus with
35608 varying functions enabled.
35609
35610 +source "drivers/mfd/glamo/Kconfig"
35611 +
35612 endmenu
35613
35614 menu "Multimedia Capabilities Port drivers"
35615 Index: linux-2.6.24.7/drivers/mfd/Makefile
35616 ===================================================================
35617 --- linux-2.6.24.7.orig/drivers/mfd/Makefile 2008-12-11 22:46:07.000000000 +0100
35618 +++ linux-2.6.24.7/drivers/mfd/Makefile 2008-12-11 22:46:49.000000000 +0100
35619 @@ -3,6 +3,7 @@
35620 #
35621
35622 obj-$(CONFIG_MFD_SM501) += sm501.o
35623 +obj-$(CONFIG_MFD_GLAMO) += glamo/
35624
35625 obj-$(CONFIG_MCP) += mcp-core.o
35626 obj-$(CONFIG_MCP_SA11X0) += mcp-sa11x0.o
35627 Index: linux-2.6.24.7/drivers/mmc/host/Kconfig
35628 ===================================================================
35629 --- linux-2.6.24.7.orig/drivers/mmc/host/Kconfig 2008-12-11 22:46:07.000000000 +0100
35630 +++ linux-2.6.24.7/drivers/mmc/host/Kconfig 2008-12-11 22:46:49.000000000 +0100
35631 @@ -130,3 +130,14 @@ config MMC_SPI
35632
35633 If unsure, or if your system has no SPI master driver, say N.
35634
35635 +config MMC_S3C
35636 + tristate "Samsung S3C24xx SD/MMC Card Interface support"
35637 + depends on ARCH_S3C2410 && MMC
35638 + help
35639 + This selects a driver for the MCI interface found in
35640 + Samsung's S3C2410, S3C2412, S3C2440, S3C2442 CPUs.
35641 + If you have a board based on one of those and a MMC/SD
35642 + slot, say Y or M here.
35643 +
35644 + If unsure, say N.
35645 +
35646 Index: linux-2.6.24.7/drivers/mmc/host/Makefile
35647 ===================================================================
35648 --- linux-2.6.24.7.orig/drivers/mmc/host/Makefile 2008-12-11 22:46:07.000000000 +0100
35649 +++ linux-2.6.24.7/drivers/mmc/host/Makefile 2008-12-11 22:46:49.000000000 +0100
35650 @@ -17,4 +17,4 @@ obj-$(CONFIG_MMC_OMAP) += omap.o
35651 obj-$(CONFIG_MMC_AT91) += at91_mci.o
35652 obj-$(CONFIG_MMC_TIFM_SD) += tifm_sd.o
35653 obj-$(CONFIG_MMC_SPI) += mmc_spi.o
35654 -
35655 +obj-$(CONFIG_MMC_S3C) += s3cmci.o
35656 Index: linux-2.6.24.7/drivers/mmc/host/s3cmci.c
35657 ===================================================================
35658 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
35659 +++ linux-2.6.24.7/drivers/mmc/host/s3cmci.c 2008-12-11 22:46:49.000000000 +0100
35660 @@ -0,0 +1,1563 @@
35661 +/*
35662 + * linux/drivers/mmc/s3cmci.h - Samsung S3C MCI driver
35663 + *
35664 + * Copyright (C) 2004-2006 maintech GmbH, Thomas Kleffel <tk@maintech.de>
35665 + * Copyright (C) 2007 Harald Welte <laforge@gnumonks.org>
35666 + *
35667 + * This program is free software; you can redistribute it and/or modify
35668 + * it under the terms of the GNU General Public License version 2 as
35669 + * published by the Free Software Foundation.
35670 + */
35671 +
35672 +#include <linux/module.h>
35673 +#include <linux/dma-mapping.h>
35674 +#include <linux/clk.h>
35675 +#include <linux/mmc/host.h>
35676 +#include <linux/platform_device.h>
35677 +#include <linux/irq.h>
35678 +#include <linux/delay.h>
35679 +#include <linux/spinlock.h>
35680 +
35681 +#include <asm/dma.h>
35682 +#include <asm/dma-mapping.h>
35683 +
35684 +#include <asm/io.h>
35685 +#include <asm/arch/regs-sdi.h>
35686 +#include <asm/arch/regs-gpio.h>
35687 +#include <asm/arch/mci.h>
35688 +#include <asm/arch/dma.h>
35689 +
35690 +#include "s3cmci.h"
35691 +
35692 +#define DRIVER_NAME "s3c-mci"
35693 +
35694 +static spinlock_t clock_lock;
35695 +
35696 +/*
35697 + * Max SD clock rate (in Hz)
35698 + *
35699 + * you can override this on the kernel command line using
35700 + *
35701 + * s3cmci.sd_max_clk=10000000
35702 + *
35703 + * for example.
35704 + */
35705 +
35706 +static int sd_max_clk = 25000000;
35707 +module_param(sd_max_clk, int, 0644);
35708 +
35709 +/*
35710 + * SD allow SD clock to run while idle
35711 + *
35712 + * you can override this on kernel commandline using
35713 + *
35714 + * s3cmci.sd_idleclk=0
35715 + *
35716 + * for example.
35717 + */
35718 +
35719 +static int sd_idleclk; /* disallow idle clock by default */
35720 +module_param(sd_idleclk, int, 0644);
35721 +
35722 +/*
35723 + * Slow SD clock rate
35724 + *
35725 + * you can override this on kernel commandline using
35726 + *
35727 + * s3cmci.sd_slow_ratio=8
35728 + *
35729 + * for example.
35730 + *
35731 + * A platform callback is used to decide effective clock rate. If not
35732 + * defined, then the max is used, if defined and the callback returns
35733 + * nonzero, the rate is divided by this factor.
35734 + */
35735 +
35736 +static int sd_slow_ratio = 8;
35737 +module_param(sd_slow_ratio, int, 0644);
35738 +
35739 +/* used to stash real idleclk state in suspend: we force it to run in there */
35740 +static int suspend_sd_idleclk;
35741 +
35742 +enum dbg_channels {
35743 + dbg_err = (1 << 0),
35744 + dbg_debug = (1 << 1),
35745 + dbg_info = (1 << 2),
35746 + dbg_irq = (1 << 3),
35747 + dbg_sg = (1 << 4),
35748 + dbg_dma = (1 << 5),
35749 + dbg_pio = (1 << 6),
35750 + dbg_fail = (1 << 7),
35751 + dbg_conf = (1 << 8),
35752 +};
35753 +
35754 +static const int dbgmap_err = dbg_err | dbg_fail;
35755 +static const int dbgmap_info = dbg_info | dbg_conf;
35756 +static const int dbgmap_debug = dbg_debug;
35757 +
35758 +#define dbg(host, channels, args...) \
35759 + do { \
35760 + if (dbgmap_err & channels) \
35761 + dev_err(&host->pdev->dev, args); \
35762 + else if (dbgmap_info & channels) \
35763 + dev_info(&host->pdev->dev, args);\
35764 + else if (dbgmap_debug & channels) \
35765 + dev_dbg(&host->pdev->dev, args); \
35766 + } while (0)
35767 +
35768 +#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)
35769 +
35770 +static struct s3c2410_dma_client s3cmci_dma_client = {
35771 + .name = "s3c-mci",
35772 +};
35773 +
35774 +static void finalize_request(struct s3cmci_host *host);
35775 +static void s3cmci_send_request(struct mmc_host *mmc);
35776 +static void s3cmci_reset(struct s3cmci_host *host);
35777 +
35778 +#ifdef CONFIG_MMC_DEBUG
35779 +static inline void dbg_dumpregs(struct s3cmci_host *host, char *prefix)
35780 +{
35781 + u32 con, pre, cmdarg, cmdcon, cmdsta, r0, r1, r2, r3, timer, bsize;
35782 + u32 datcon, datcnt, datsta, fsta, imask;
35783 +
35784 + con = readl(host->base + S3C2410_SDICON);
35785 + pre = readl(host->base + S3C2410_SDIPRE);
35786 + cmdarg = readl(host->base + S3C2410_SDICMDARG);
35787 + cmdcon = readl(host->base + S3C2410_SDICMDCON);
35788 + cmdsta = readl(host->base + S3C2410_SDICMDSTAT);
35789 + r0 = readl(host->base + S3C2410_SDIRSP0);
35790 + r1 = readl(host->base + S3C2410_SDIRSP1);
35791 + r2 = readl(host->base + S3C2410_SDIRSP2);
35792 + r3 = readl(host->base + S3C2410_SDIRSP3);
35793 + timer = readl(host->base + S3C2410_SDITIMER);
35794 + bsize = readl(host->base + S3C2410_SDIBSIZE);
35795 + datcon = readl(host->base + S3C2410_SDIDCON);
35796 + datcnt = readl(host->base + S3C2410_SDIDCNT);
35797 + datsta = readl(host->base + S3C2410_SDIDSTA);
35798 + fsta = readl(host->base + S3C2410_SDIFSTA);
35799 + imask = readl(host->base + host->sdiimsk);
35800 +
35801 + dbg(host, dbg_debug, "%s CON:[%08x] PRE:[%08x] TMR:[%08x]\n",
35802 + prefix, con, pre, timer);
35803 +
35804 + dbg(host, dbg_debug, "%s CCON:[%08x] CARG:[%08x] CSTA:[%08x]\n",
35805 + prefix, cmdcon, cmdarg, cmdsta);
35806 +
35807 + dbg(host, dbg_debug, "%s DCON:[%08x] FSTA:[%08x]"
35808 + " DSTA:[%08x] DCNT:[%08x]\n",
35809 + prefix, datcon, fsta, datsta, datcnt);
35810 +
35811 + dbg(host, dbg_debug, "%s R0:[%08x] R1:[%08x]"
35812 + " R2:[%08x] R3:[%08x]\n",
35813 + prefix, r0, r1, r2, r3);
35814 +}
35815 +
35816 +static void prepare_dbgmsg(struct s3cmci_host *host, struct mmc_command *cmd,
35817 + int stop)
35818 +{
35819 + snprintf(host->dbgmsg_cmd, 300,
35820 + "#%u%s op:CMD%d arg:0x%08x flags:0x08%x retries:%u",
35821 + host->ccnt, (stop?" (STOP)":""), cmd->opcode,
35822 + cmd->arg, cmd->flags, cmd->retries);
35823 +
35824 + if (cmd->data) {
35825 + snprintf(host->dbgmsg_dat, 300,
35826 + "#%u bsize:%u blocks:%u bytes:%u",
35827 + host->dcnt, cmd->data->blksz,
35828 + cmd->data->blocks,
35829 + cmd->data->blocks * cmd->data->blksz);
35830 + } else {
35831 + host->dbgmsg_dat[0] = '\0';
35832 + }
35833 +}
35834 +
35835 +static void dbg_dumpcmd(struct s3cmci_host *host, struct mmc_command *cmd,
35836 + int fail)
35837 +{
35838 + unsigned int dbglvl = fail?dbg_fail:dbg_debug;
35839 +
35840 + if (!cmd)
35841 + return;
35842 +
35843 + if (cmd->error == 0)
35844 + dbg(host, dbglvl, "CMD[OK] %s R0:0x%08x\n",
35845 + host->dbgmsg_cmd, cmd->resp[0]);
35846 + else
35847 + dbg(host, dbglvl, "CMD[FAIL(%d)] %s Status:%s\n",
35848 + cmd->error, host->dbgmsg_cmd, host->status);
35849 +
35850 + if (!cmd->data)
35851 + return;
35852 +
35853 + if (cmd->data->error == 0)
35854 + dbg(host, dbglvl, "DAT[OK] %s\n", host->dbgmsg_dat);
35855 + else
35856 + dbg(host, dbglvl, "DAT[FAIL(%d)] %s DCNT:0x%08x\n",
35857 + cmd->data->error, host->dbgmsg_dat,
35858 + readl(host->base + S3C2410_SDIDCNT));
35859 +}
35860 +#endif /* CONFIG_MMC_DEBUG */
35861 +
35862 +static inline u32 enable_imask(struct s3cmci_host *host, u32 imask)
35863 +{
35864 + u32 newmask;
35865 +
35866 + newmask = readl(host->base + host->sdiimsk);
35867 + newmask |= imask;
35868 +
35869 + writel(newmask, host->base + host->sdiimsk);
35870 +
35871 + return newmask;
35872 +}
35873 +
35874 +static inline u32 disable_imask(struct s3cmci_host *host, u32 imask)
35875 +{
35876 + u32 newmask;
35877 +
35878 + newmask = readl(host->base + host->sdiimsk);
35879 + newmask &= ~imask;
35880 +
35881 + writel(newmask, host->base + host->sdiimsk);
35882 +
35883 + return newmask;
35884 +}
35885 +
35886 +static inline void clear_imask(struct s3cmci_host *host)
35887 +{
35888 + writel(0, host->base + host->sdiimsk);
35889 +}
35890 +
35891 +static inline int get_data_buffer(struct s3cmci_host *host,
35892 + u32 *bytes, u8 **pointer)
35893 +{
35894 + struct scatterlist *sg;
35895 +
35896 + if (host->pio_active == XFER_NONE)
35897 + return -EINVAL;
35898 +
35899 + if ((!host->mrq) || (!host->mrq->data))
35900 + return -EINVAL;
35901 +
35902 + if (host->pio_sgptr >= host->mrq->data->sg_len) {
35903 + dbg(host, dbg_debug, "no more buffers (%i/%i)\n",
35904 + host->pio_sgptr, host->mrq->data->sg_len);
35905 + return -EBUSY;
35906 + }
35907 + sg = &host->mrq->data->sg[host->pio_sgptr];
35908 +
35909 + *bytes = sg->length;
35910 + *pointer = page_address(sg_page(sg)) + sg->offset;
35911 +
35912 + host->pio_sgptr++;
35913 +
35914 + dbg(host, dbg_sg, "new buffer (%i/%i)\n",
35915 + host->pio_sgptr, host->mrq->data->sg_len);
35916 +
35917 + return 0;
35918 +}
35919 +
35920 +#define FIFO_FILL(host) (readl(host->base + S3C2410_SDIFSTA) & \
35921 + S3C2410_SDIFSTA_COUNTMASK)
35922 +#define FIFO_FREE(host) (63 - (readl(host->base + S3C2410_SDIFSTA) \
35923 + & S3C2410_SDIFSTA_COUNTMASK))
35924 +
35925 +static inline void do_pio_read(struct s3cmci_host *host)
35926 +{
35927 + int res;
35928 + int fifo;
35929 + void __iomem *from_ptr;
35930 +
35931 + /* write real prescaler to host, it might be set slow to fix */
35932 + writel(host->sdipre, host->base + S3C2410_SDIPRE);
35933 +
35934 + from_ptr = host->base + host->sdidata;
35935 +
35936 + while ((fifo = FIFO_FILL(host))) {
35937 + if (!host->pio_bytes) {
35938 + res = get_data_buffer(host, &host->pio_bytes,
35939 + &host->pio_ptr);
35940 + if (res) {
35941 + host->pio_active = XFER_NONE;
35942 + host->complete_what = COMPLETION_FINALIZE;
35943 +
35944 + dbg(host, dbg_pio, "pio_read(): "
35945 + "complete (no more data).\n");
35946 + return;
35947 + }
35948 +
35949 + dbg(host, dbg_pio, "pio_read(): new target: "
35950 + "[%i]@[%p]\n", host->pio_bytes, host->pio_ptr);
35951 + }
35952 +
35953 + dbg(host, dbg_pio, "pio_read(): fifo:[%02i] "
35954 + "buffer:[%03i] dcnt:[%08X]\n", fifo, host->pio_bytes,
35955 + readl(host->base + S3C2410_SDIDCNT));
35956 +
35957 + if (fifo > host->pio_bytes)
35958 + fifo = host->pio_bytes;
35959 +
35960 + host->pio_bytes -= fifo;
35961 + host->pio_count += fifo;
35962 +
35963 + /* we might have an unaligned start of data */
35964 + while (((unsigned long)host->pio_ptr & 0x03) && fifo) {
35965 + *(host->pio_ptr++) = readb(host->base + host->sdidata_b);
35966 + fifo--;
35967 + }
35968 +
35969 + /* and a major chunk of data in the middle */
35970 + for (; fifo >= 4; fifo -=4) {
35971 + *(u32 *) host->pio_ptr = readl(from_ptr);
35972 + host->pio_ptr+= 4;
35973 + }
35974 +
35975 + /* as well as some non-modulo-four trailer */
35976 + while (fifo) {
35977 + *(host->pio_ptr++) = readb(host->base + host->sdidata_b);
35978 + fifo--;
35979 + }
35980 + }
35981 +
35982 + if (!host->pio_bytes) {
35983 + res = get_data_buffer(host, &host->pio_bytes, &host->pio_ptr);
35984 + if (res) {
35985 + dbg(host, dbg_pio, "pio_read(): "
35986 + "complete (no more buffers).\n");
35987 + host->pio_active = XFER_NONE;
35988 + host->complete_what = COMPLETION_FINALIZE;
35989 +
35990 + return;
35991 + }
35992 + }
35993 +
35994 + enable_imask(host, S3C2410_SDIIMSK_RXFIFOHALF
35995 + | S3C2410_SDIIMSK_RXFIFOLAST);
35996 +}
35997 +
35998 +static inline void do_pio_write(struct s3cmci_host *host)
35999 +{
36000 + int res;
36001 + int fifo;
36002 +
36003 + void __iomem *to_ptr;
36004 +
36005 + to_ptr = host->base + host->sdidata;
36006 +
36007 + while ((fifo = FIFO_FREE(host))) {
36008 + if (!host->pio_bytes) {
36009 + res = get_data_buffer(host, &host->pio_bytes,
36010 + &host->pio_ptr);
36011 + if (res) {
36012 + dbg(host, dbg_pio, "pio_write(): "
36013 + "complete (no more data).\n");
36014 + host->pio_active = XFER_NONE;
36015 +
36016 + return;
36017 + }
36018 +
36019 + dbg(host, dbg_pio, "pio_write(): "
36020 + "new source: [%i]@[%p]\n",
36021 + host->pio_bytes, host->pio_ptr);
36022 +
36023 + }
36024 +
36025 + if (fifo > host->pio_bytes)
36026 + fifo = host->pio_bytes;
36027 +
36028 + host->pio_bytes -= fifo;
36029 + host->pio_count += fifo;
36030 +
36031 + /* we might have an unaligned start of data */
36032 + while (((unsigned long)host->pio_ptr & 0x03) && fifo) {
36033 + writeb(*(host->pio_ptr++), host->base + host->sdidata_b);
36034 + fifo--;
36035 + }
36036 +
36037 + /* and a major chunk of data in the middle */
36038 + for (; fifo >= 4; fifo -=4) {
36039 + writel(*(u32 *) host->pio_ptr, to_ptr);
36040 + host->pio_ptr += 4;
36041 + }
36042 +
36043 + /* as well as some non-modulo-four trailer */
36044 + while (fifo) {
36045 + writeb(*(host->pio_ptr++), host->base + host->sdidata_b);
36046 + fifo--;
36047 + }
36048 + }
36049 +
36050 + enable_imask(host, S3C2410_SDIIMSK_TXFIFOHALF);
36051 +}
36052 +
36053 +static void pio_tasklet(unsigned long data)
36054 +{
36055 + struct s3cmci_host *host = (struct s3cmci_host *) data;
36056 +
36057 + disable_irq(host->irq);
36058 +
36059 + if (host->pio_active == XFER_WRITE)
36060 + do_pio_write(host);
36061 +
36062 + if (host->pio_active == XFER_READ)
36063 + do_pio_read(host);
36064 +
36065 + if (host->complete_what == COMPLETION_FINALIZE) {
36066 + clear_imask(host);
36067 + if (host->pio_active != XFER_NONE) {
36068 + dbg(host, dbg_err, "unfinished %s "
36069 + "- pio_count:[%u] pio_bytes:[%u]\n",
36070 + (host->pio_active == XFER_READ)?"read":"write",
36071 + host->pio_count, host->pio_bytes);
36072 +
36073 + host->mrq->data->error = -EIO;
36074 + }
36075 +
36076 + finalize_request(host);
36077 + } else
36078 + enable_irq(host->irq);
36079 +}
36080 +
36081 +static void __s3cmci_enable_clock(struct s3cmci_host *host)
36082 +{
36083 + u32 mci_con;
36084 + unsigned long flags;
36085 +
36086 + /* enable the clock if clock rate is > 0 */
36087 + if (host->real_rate) {
36088 + spin_lock_irqsave(&clock_lock, flags);
36089 +
36090 + mci_con = readl(host->base + S3C2410_SDICON);
36091 + mci_con |= S3C2410_SDICON_CLOCKTYPE;
36092 + writel(mci_con, host->base + S3C2410_SDICON);
36093 +
36094 + spin_unlock_irqrestore(&clock_lock, flags);
36095 + }
36096 +}
36097 +
36098 +static void __s3cmci_disable_clock(struct s3cmci_host *host)
36099 +{
36100 + u32 mci_con;
36101 + unsigned long flags;
36102 +
36103 + if (!sd_idleclk) {
36104 + spin_lock_irqsave(&clock_lock, flags);
36105 +
36106 + mci_con = readl(host->base + S3C2410_SDICON);
36107 + mci_con &= ~S3C2410_SDICON_CLOCKTYPE;
36108 + writel(mci_con, host->base + S3C2410_SDICON);
36109 +
36110 + spin_unlock_irqrestore(&clock_lock, flags);
36111 + }
36112 +}
36113 +
36114 +
36115 +/*
36116 + * ISR for SDI Interface IRQ
36117 + * Communication between driver and ISR works as follows:
36118 + * host->mrq points to current request
36119 + * host->complete_what tells ISR when the request is considered done
36120 + * COMPLETION_CMDSENT when the command was sent
36121 + * COMPLETION_RSPFIN when a response was received
36122 + * COMPLETION_XFERFINISH when the data transfer is finished
36123 + * COMPLETION_XFERFINISH_RSPFIN both of the above.
36124 + * host->complete_request is the completion-object the driver waits for
36125 + *
36126 + * 1) Driver sets up host->mrq and host->complete_what
36127 + * 2) Driver prepares the transfer
36128 + * 3) Driver enables interrupts
36129 + * 4) Driver starts transfer
36130 + * 5) Driver waits for host->complete_rquest
36131 + * 6) ISR checks for request status (errors and success)
36132 + * 6) ISR sets host->mrq->cmd->error and host->mrq->data->error
36133 + * 7) ISR completes host->complete_request
36134 + * 8) ISR disables interrupts
36135 + * 9) Driver wakes up and takes care of the request
36136 + *
36137 + * Note: "->error"-fields are expected to be set to 0 before the request
36138 + * was issued by mmc.c - therefore they are only set, when an error
36139 + * contition comes up
36140 + */
36141 +
36142 +static irqreturn_t s3cmci_irq(int irq, void *dev_id)
36143 +{
36144 + struct s3cmci_host *host;
36145 + struct mmc_command *cmd;
36146 + u32 mci_csta, mci_dsta, mci_fsta, mci_dcnt, mci_imsk;
36147 + u32 mci_cclear, mci_dclear;
36148 + unsigned long iflags;
36149 + int cardint = 0;
36150 +
36151 + host = (struct s3cmci_host *)dev_id;
36152 +
36153 + spin_lock_irqsave(&host->complete_lock, iflags);
36154 +
36155 + mci_csta = readl(host->base + S3C2410_SDICMDSTAT);
36156 + mci_dsta = readl(host->base + S3C2410_SDIDSTA);
36157 + mci_dcnt = readl(host->base + S3C2410_SDIDCNT);
36158 + mci_fsta = readl(host->base + S3C2410_SDIFSTA);
36159 + mci_imsk = readl(host->base + host->sdiimsk);
36160 + mci_cclear = 0;
36161 + mci_dclear = 0;
36162 +
36163 + if ((host->complete_what == COMPLETION_NONE) ||
36164 + (host->complete_what == COMPLETION_FINALIZE)) {
36165 + host->status = "nothing to complete";
36166 + clear_imask(host);
36167 + goto irq_out;
36168 + }
36169 +
36170 + if (!host->mrq) {
36171 + host->status = "no active mrq";
36172 + clear_imask(host);
36173 + goto irq_out;
36174 + }
36175 +
36176 + cmd = host->cmd_is_stop?host->mrq->stop:host->mrq->cmd;
36177 +
36178 + if (!cmd) {
36179 + host->status = "no active cmd";
36180 + clear_imask(host);
36181 + goto irq_out;
36182 + }
36183 +
36184 + if (!host->dodma) {
36185 + if ((host->pio_active == XFER_WRITE) &&
36186 + (mci_fsta & S3C2410_SDIFSTA_TFDET)) {
36187 +
36188 + disable_imask(host, S3C2410_SDIIMSK_TXFIFOHALF);
36189 + tasklet_schedule(&host->pio_tasklet);
36190 + host->status = "pio tx";
36191 + }
36192 +
36193 + if ((host->pio_active == XFER_READ) &&
36194 + (mci_fsta & S3C2410_SDIFSTA_RFDET)) {
36195 +
36196 + disable_imask(host, S3C2410_SDIIMSK_RXFIFOHALF |
36197 + S3C2410_SDIIMSK_RXFIFOLAST);
36198 +
36199 + tasklet_schedule(&host->pio_tasklet);
36200 + host->status = "pio rx";
36201 + }
36202 + }
36203 +
36204 + if (mci_csta & S3C2410_SDICMDSTAT_CMDTIMEOUT) {
36205 + cmd->error = -ETIMEDOUT;
36206 + host->status = "error: command timeout";
36207 + goto fail_transfer;
36208 + }
36209 +
36210 + if (mci_csta & S3C2410_SDICMDSTAT_CMDSENT) {
36211 + if (host->complete_what == COMPLETION_CMDSENT) {
36212 + host->status = "ok: command sent";
36213 + goto close_transfer;
36214 + }
36215 +
36216 + mci_cclear |= S3C2410_SDICMDSTAT_CMDSENT;
36217 + }
36218 +
36219 + if (mci_csta & S3C2410_SDICMDSTAT_CRCFAIL) {
36220 + if (cmd->flags & MMC_RSP_CRC) {
36221 + if (host->mrq->cmd->flags & MMC_RSP_136) {
36222 + dbg(host, dbg_irq, "fixup for chip bug: "
36223 + "ignore CRC fail with long rsp\n");
36224 + } else {
36225 + cmd->error = -EILSEQ;
36226 + host->status = "error: bad command crc";
36227 + goto fail_transfer;
36228 + }
36229 + }
36230 +
36231 + mci_cclear |= S3C2410_SDICMDSTAT_CRCFAIL;
36232 + }
36233 +
36234 + if (mci_csta & S3C2410_SDICMDSTAT_RSPFIN) {
36235 + if (host->complete_what == COMPLETION_RSPFIN) {
36236 + host->status = "ok: command response received";
36237 + goto close_transfer;
36238 + }
36239 +
36240 + if (host->complete_what == COMPLETION_XFERFINISH_RSPFIN)
36241 + host->complete_what = COMPLETION_XFERFINISH;
36242 +
36243 + mci_cclear |= S3C2410_SDICMDSTAT_RSPFIN;
36244 + }
36245 +
36246 + /* errors handled after this point are only relevant
36247 + when a data transfer is in progress */
36248 +
36249 + if (!cmd->data)
36250 + goto clear_status_bits;
36251 +
36252 + /* Check for FIFO failure */
36253 + if (host->is2440) {
36254 + if (mci_fsta & S3C2440_SDIFSTA_FIFOFAIL) {
36255 + host->mrq->data->error = -EIO;
36256 + host->status = "error: 2440 fifo failure";
36257 + goto fail_transfer;
36258 + }
36259 + } else {
36260 + if (mci_dsta & S3C2410_SDIDSTA_FIFOFAIL) {
36261 + cmd->data->error = -EIO;
36262 + host->status = "error: fifo failure";
36263 + goto fail_transfer;
36264 + }
36265 + }
36266 +
36267 + if (mci_dsta & S3C2410_SDIDSTA_RXCRCFAIL) {
36268 + cmd->data->error = -EILSEQ;
36269 + host->status = "error: bad data crc (outgoing)";
36270 + goto fail_transfer;
36271 + }
36272 +
36273 + if (mci_dsta & S3C2410_SDIDSTA_CRCFAIL) {
36274 + cmd->data->error = -EIO;
36275 + host->status = "error: bad data crc (incoming)";
36276 + goto fail_transfer;
36277 + }
36278 +
36279 + if (mci_dsta & S3C2410_SDIDSTA_DATATIMEOUT) {
36280 + cmd->data->error = -ETIMEDOUT;
36281 + host->status = "error: data timeout";
36282 + goto fail_transfer;
36283 + }
36284 +
36285 + if (mci_dsta & S3C2410_SDIDSTA_XFERFINISH) {
36286 + if (host->complete_what == COMPLETION_XFERFINISH) {
36287 + host->status = "ok: data transfer completed";
36288 + goto close_transfer;
36289 + }
36290 +
36291 + if (host->complete_what == COMPLETION_XFERFINISH_RSPFIN)
36292 + host->complete_what = COMPLETION_RSPFIN;
36293 +
36294 + mci_dclear |= S3C2410_SDIDSTA_XFERFINISH;
36295 + }
36296 +
36297 + if (mci_dsta & S3C2410_SDIDSTA_SDIOIRQDETECT) {
36298 + cardint = 1;
36299 + mci_dclear |= S3C2410_SDIDSTA_SDIOIRQDETECT;
36300 + }
36301 +
36302 +clear_status_bits:
36303 + writel(mci_cclear, host->base + S3C2410_SDICMDSTAT);
36304 + writel(mci_dclear, host->base + S3C2410_SDIDSTA);
36305 +
36306 + goto irq_out;
36307 +
36308 +fail_transfer:
36309 + host->pio_active = XFER_NONE;
36310 +
36311 +close_transfer:
36312 + host->complete_what = COMPLETION_FINALIZE;
36313 +
36314 + clear_imask(host);
36315 + tasklet_schedule(&host->pio_tasklet);
36316 +
36317 + goto irq_out;
36318 +
36319 +irq_out:
36320 + dbg(host, dbg_irq, "csta:0x%08x dsta:0x%08x "
36321 + "fsta:0x%08x dcnt:0x%08x status:%s.\n",
36322 + mci_csta, mci_dsta, mci_fsta,
36323 + mci_dcnt, host->status);
36324 +
36325 + spin_unlock_irqrestore(&host->complete_lock, iflags);
36326 +
36327 + /* We have to delay this as it calls back into the driver */
36328 + if (cardint)
36329 + mmc_signal_sdio_irq(host->mmc);
36330 +
36331 + return IRQ_HANDLED;
36332 +
36333 +}
36334 +
36335 +/*
36336 + * ISR for the CardDetect Pin
36337 +*/
36338 +
36339 +static irqreturn_t s3cmci_irq_cd(int irq, void *dev_id)
36340 +{
36341 + struct s3cmci_host *host = (struct s3cmci_host *)dev_id;
36342 +
36343 + dbg(host, dbg_irq, "card detect\n");
36344 +
36345 + mmc_detect_change(host->mmc, 500);
36346 +
36347 + return IRQ_HANDLED;
36348 +}
36349 +
36350 +void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch, void *buf_id,
36351 + int size, enum s3c2410_dma_buffresult result)
36352 +{
36353 + unsigned long iflags;
36354 + u32 mci_csta, mci_dsta, mci_fsta, mci_dcnt;
36355 + struct s3cmci_host *host = (struct s3cmci_host *)buf_id;
36356 +
36357 + mci_csta = readl(host->base + S3C2410_SDICMDSTAT);
36358 + mci_dsta = readl(host->base + S3C2410_SDIDSTA);
36359 + mci_fsta = readl(host->base + S3C2410_SDIFSTA);
36360 + mci_dcnt = readl(host->base + S3C2410_SDIDCNT);
36361 +
36362 + if ((!host->mrq) || (!host->mrq) || (!host->mrq->data))
36363 + return;
36364 +
36365 + if (!host->dmatogo)
36366 + return;
36367 +
36368 + spin_lock_irqsave(&host->complete_lock, iflags);
36369 +
36370 + if (result != S3C2410_RES_OK) {
36371 + dbg(host, dbg_fail, "DMA FAILED: csta=0x%08x dsta=0x%08x "
36372 + "fsta=0x%08x dcnt:0x%08x result:0x%08x toGo:%u\n",
36373 + mci_csta, mci_dsta, mci_fsta,
36374 + mci_dcnt, result, host->dmatogo);
36375 +
36376 + goto fail_request;
36377 + }
36378 +
36379 + host->dmatogo--;
36380 + if (host->dmatogo) {
36381 + dbg(host, dbg_dma, "DMA DONE Size:%i DSTA:[%08x] "
36382 + "DCNT:[%08x] toGo:%u\n",
36383 + size, mci_dsta, mci_dcnt, host->dmatogo);
36384 +
36385 + goto out;
36386 + }
36387 +
36388 + dbg(host, dbg_dma, "DMA FINISHED Size:%i DSTA:%08x DCNT:%08x\n",
36389 + size, mci_dsta, mci_dcnt);
36390 +
36391 + host->complete_what = COMPLETION_FINALIZE;
36392 +
36393 +out:
36394 + tasklet_schedule(&host->pio_tasklet);
36395 + spin_unlock_irqrestore(&host->complete_lock, iflags);
36396 + return;
36397 +
36398 +
36399 +fail_request:
36400 + host->mrq->data->error = -EIO;
36401 + host->complete_what = COMPLETION_FINALIZE;
36402 + writel(0, host->base + host->sdiimsk);
36403 + goto out;
36404 +
36405 +}
36406 +
36407 +static void finalize_request(struct s3cmci_host *host)
36408 +{
36409 + struct mmc_request *mrq = host->mrq;
36410 + struct mmc_command *cmd = host->cmd_is_stop?mrq->stop:mrq->cmd;
36411 + int debug_as_failure = 0;
36412 +
36413 + if (host->complete_what != COMPLETION_FINALIZE)
36414 + return;
36415 +
36416 + if (!mrq)
36417 + return;
36418 +
36419 + if (cmd->data && (cmd->error == 0) &&
36420 + (cmd->data->error == 0)) {
36421 +
36422 + if (host->dodma && (!host->dma_complete)) {
36423 + dbg(host, dbg_dma, "DMA Missing!\n");
36424 + return;
36425 + }
36426 + }
36427 +
36428 + /* Read response */
36429 + cmd->resp[0] = readl(host->base + S3C2410_SDIRSP0);
36430 + cmd->resp[1] = readl(host->base + S3C2410_SDIRSP1);
36431 + cmd->resp[2] = readl(host->base + S3C2410_SDIRSP2);
36432 + cmd->resp[3] = readl(host->base + S3C2410_SDIRSP3);
36433 +
36434 + /* reset clock speed, as it could still be set low for */
36435 + writel(host->sdipre, host->base + S3C2410_SDIPRE);
36436 +
36437 + if (cmd->error)
36438 + debug_as_failure = 1;
36439 +
36440 + if (cmd->data && cmd->data->error)
36441 + debug_as_failure = 1;
36442 +
36443 +#ifdef CONFIG_MMC_DEBUG
36444 + dbg_dumpcmd(host, cmd, debug_as_failure);
36445 +#endif
36446 + /* Cleanup controller */
36447 + writel(0, host->base + S3C2410_SDICMDARG);
36448 + writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
36449 + writel(0, host->base + S3C2410_SDICMDCON);
36450 + writel(0, host->base + host->sdiimsk);
36451 +
36452 + if (cmd->data && cmd->error)
36453 + cmd->data->error = cmd->error;
36454 +
36455 + if (cmd->data && cmd->data->stop && (!host->cmd_is_stop)) {
36456 + host->cmd_is_stop = 1;
36457 + s3cmci_send_request(host->mmc);
36458 + return;
36459 + }
36460 +
36461 + /* If we have no data transfer we are finished here */
36462 + if (!mrq->data)
36463 + goto request_done;
36464 +
36465 + /* Calulate the amout of bytes transfer, but only if there was
36466 + * no error */
36467 + if (mrq->data->error == 0)
36468 + mrq->data->bytes_xfered =
36469 + (mrq->data->blocks * mrq->data->blksz);
36470 + else
36471 + mrq->data->bytes_xfered = 0;
36472 +
36473 + /* If we had an error while transfering data we flush the
36474 + * DMA channel and the fifo to clear out any garbage */
36475 + if (mrq->data->error) {
36476 + if (host->dodma)
36477 + s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
36478 +
36479 + if (host->is2440) {
36480 + /* Clear failure register and reset fifo */
36481 + writel(S3C2440_SDIFSTA_FIFORESET |
36482 + S3C2440_SDIFSTA_FIFOFAIL,
36483 + host->base + S3C2410_SDIFSTA);
36484 + } else {
36485 + u32 mci_con;
36486 +
36487 + /* reset fifo */
36488 + mci_con = readl(host->base + S3C2410_SDICON);
36489 + mci_con |= S3C2410_SDICON_FIFORESET;
36490 +
36491 + writel(mci_con, host->base + S3C2410_SDICON);
36492 + }
36493 + }
36494 +
36495 +request_done:
36496 + __s3cmci_disable_clock(host);
36497 + host->complete_what = COMPLETION_NONE;
36498 + host->mrq = NULL;
36499 + mmc_request_done(host->mmc, mrq);
36500 +}
36501 +
36502 +
36503 +void s3cmci_dma_setup(struct s3cmci_host *host, enum s3c2410_dmasrc source)
36504 +{
36505 + static int setup_ok;
36506 + static enum s3c2410_dmasrc last_source = -1;
36507 +
36508 + if (last_source == source)
36509 + return;
36510 +
36511 + last_source = source;
36512 +
36513 + s3c2410_dma_devconfig(host->dma, source, 3,
36514 + host->mem->start + host->sdidata);
36515 +
36516 + if (!setup_ok) {
36517 + s3c2410_dma_config(host->dma, 4,
36518 + (S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI));
36519 + s3c2410_dma_set_buffdone_fn(host->dma,
36520 + s3cmci_dma_done_callback);
36521 + s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);
36522 + setup_ok = 1;
36523 + }
36524 +}
36525 +
36526 +static void s3cmci_send_command(struct s3cmci_host *host,
36527 + struct mmc_command *cmd)
36528 +{
36529 + u32 ccon, imsk;
36530 +
36531 + imsk = S3C2410_SDIIMSK_CRCSTATUS | S3C2410_SDIIMSK_CMDTIMEOUT |
36532 + S3C2410_SDIIMSK_RESPONSEND | S3C2410_SDIIMSK_CMDSENT |
36533 + S3C2410_SDIIMSK_RESPONSECRC;
36534 +
36535 + enable_imask(host, imsk);
36536 +
36537 + if (cmd->data)
36538 + host->complete_what = COMPLETION_XFERFINISH_RSPFIN;
36539 + else if (cmd->flags & MMC_RSP_PRESENT)
36540 + host->complete_what = COMPLETION_RSPFIN;
36541 + else
36542 + host->complete_what = COMPLETION_CMDSENT;
36543 +
36544 + writel(cmd->arg, host->base + S3C2410_SDICMDARG);
36545 +
36546 + ccon = cmd->opcode & S3C2410_SDICMDCON_INDEX;
36547 + ccon |= S3C2410_SDICMDCON_SENDERHOST | S3C2410_SDICMDCON_CMDSTART;
36548 +
36549 + if (cmd->flags & MMC_RSP_PRESENT)
36550 + ccon |= S3C2410_SDICMDCON_WAITRSP;
36551 +
36552 + if (cmd->flags & MMC_RSP_136)
36553 + ccon |= S3C2410_SDICMDCON_LONGRSP;
36554 +
36555 + writel(ccon, host->base + S3C2410_SDICMDCON);
36556 +}
36557 +
36558 +static int s3cmci_setup_data(struct s3cmci_host *host, struct mmc_data *data)
36559 +{
36560 + u32 dcon, imsk, stoptries = 3;
36561 +
36562 + /* write DCON register */
36563 +
36564 + if (!data) {
36565 + writel(0, host->base + S3C2410_SDIDCON);
36566 + return 0;
36567 + }
36568 +
36569 + while (readl(host->base + S3C2410_SDIDSTA) &
36570 + (S3C2410_SDIDSTA_TXDATAON | S3C2410_SDIDSTA_RXDATAON)) {
36571 +
36572 + dbg(host, dbg_err,
36573 + "mci_setup_data() transfer stillin progress.\n");
36574 +
36575 + writel(S3C2410_SDIDCON_STOP, host->base + S3C2410_SDIDCON);
36576 + s3cmci_reset(host);
36577 +
36578 + if (0 == (stoptries--)) {
36579 +#ifdef CONFIG_MMC_DEBUG
36580 + dbg_dumpregs(host, "DRF");
36581 +#endif
36582 +
36583 + return -EINVAL;
36584 + }
36585 + }
36586 +
36587 + dcon = data->blocks & S3C2410_SDIDCON_BLKNUM_MASK;
36588 +
36589 + if (host->dodma)
36590 + dcon |= S3C2410_SDIDCON_DMAEN;
36591 +
36592 + if (host->bus_width == MMC_BUS_WIDTH_4)
36593 + dcon |= S3C2410_SDIDCON_WIDEBUS;
36594 +
36595 + if (!(data->flags & MMC_DATA_STREAM))
36596 + dcon |= S3C2410_SDIDCON_BLOCKMODE;
36597 +
36598 + if (data->flags & MMC_DATA_WRITE) {
36599 + dcon |= S3C2410_SDIDCON_TXAFTERRESP;
36600 + dcon |= S3C2410_SDIDCON_XFER_TXSTART;
36601 + }
36602 +
36603 + if (data->flags & MMC_DATA_READ) {
36604 + dcon |= S3C2410_SDIDCON_RXAFTERCMD;
36605 + dcon |= S3C2410_SDIDCON_XFER_RXSTART;
36606 + }
36607 +
36608 + if (host->is2440) {
36609 + dcon |= S3C2440_SDIDCON_DS_WORD;
36610 + dcon |= S3C2440_SDIDCON_DATSTART;
36611 + }
36612 +
36613 + writel(dcon, host->base + S3C2410_SDIDCON);
36614 +
36615 + /* write BSIZE register */
36616 +
36617 + writel(data->blksz, host->base + S3C2410_SDIBSIZE);
36618 +
36619 + /* add to IMASK register */
36620 + imsk = S3C2410_SDIIMSK_FIFOFAIL | S3C2410_SDIIMSK_DATACRC |
36621 + S3C2410_SDIIMSK_DATATIMEOUT | S3C2410_SDIIMSK_DATAFINISH;
36622 +
36623 + enable_imask(host, imsk);
36624 +
36625 + /* write TIMER register */
36626 +
36627 + if (host->is2440) {
36628 + writel(0x007FFFFF, host->base + S3C2410_SDITIMER);
36629 + } else {
36630 + writel(0x0000FFFF, host->base + S3C2410_SDITIMER);
36631 +
36632 + /* FIX: set slow clock to prevent timeouts on read */
36633 + if (data->flags & MMC_DATA_READ)
36634 + writel(0xFF, host->base + S3C2410_SDIPRE);
36635 + }
36636 +
36637 + return 0;
36638 +}
36639 +
36640 +static int s3cmci_prepare_pio(struct s3cmci_host *host, struct mmc_data *data)
36641 +{
36642 + int rw = (data->flags & MMC_DATA_WRITE)?1:0;
36643 +
36644 + if (rw != ((data->flags & MMC_DATA_READ)?0:1))
36645 + return -EINVAL;
36646 +
36647 + host->pio_sgptr = 0;
36648 + host->pio_bytes = 0;
36649 + host->pio_count = 0;
36650 + host->pio_active = rw?XFER_WRITE:XFER_READ;
36651 +
36652 + if (rw) {
36653 + do_pio_write(host);
36654 + enable_imask(host, S3C2410_SDIIMSK_TXFIFOHALF);
36655 + } else {
36656 + enable_imask(host, S3C2410_SDIIMSK_RXFIFOHALF
36657 + | S3C2410_SDIIMSK_RXFIFOLAST);
36658 + }
36659 +
36660 + return 0;
36661 +}
36662 +
36663 +static int s3cmci_prepare_dma(struct s3cmci_host *host, struct mmc_data *data)
36664 +{
36665 + int dma_len, i;
36666 +
36667 + int rw = (data->flags & MMC_DATA_WRITE)?1:0;
36668 +
36669 + if (rw != ((data->flags & MMC_DATA_READ)?0:1))
36670 + return -EINVAL;
36671 +
36672 + s3cmci_dma_setup(host, rw?S3C2410_DMASRC_MEM:S3C2410_DMASRC_HW);
36673 + s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
36674 +
36675 + dma_len = dma_map_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
36676 + (rw)?DMA_TO_DEVICE:DMA_FROM_DEVICE);
36677 +
36678 +
36679 + if (dma_len == 0)
36680 + return -ENOMEM;
36681 +
36682 + host->dma_complete = 0;
36683 + host->dmatogo = dma_len;
36684 +
36685 + for (i = 0; i < dma_len; i++) {
36686 + int res;
36687 +
36688 + dbg(host, dbg_dma, "enqueue %i:%u@%u\n", i,
36689 + sg_dma_address(&data->sg[i]),
36690 + sg_dma_len(&data->sg[i]));
36691 +
36692 + res = s3c2410_dma_enqueue(host->dma, (void *) host,
36693 + sg_dma_address(&data->sg[i]),
36694 + sg_dma_len(&data->sg[i]));
36695 +
36696 + if (res) {
36697 + s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_FLUSH);
36698 + return -EBUSY;
36699 + }
36700 + }
36701 +
36702 + s3c2410_dma_ctrl(host->dma, S3C2410_DMAOP_START);
36703 +
36704 + return 0;
36705 +}
36706 +
36707 +static void s3cmci_send_request(struct mmc_host *mmc)
36708 +{
36709 + struct s3cmci_host *host = mmc_priv(mmc);
36710 + struct mmc_request *mrq = host->mrq;
36711 + struct mmc_command *cmd = host->cmd_is_stop?mrq->stop:mrq->cmd;
36712 + int pre;
36713 +
36714 + host->ccnt++;
36715 +#ifdef CONFIG_MMC_DEBUG
36716 + prepare_dbgmsg(host, cmd, host->cmd_is_stop);
36717 +#endif
36718 + /* clear command, data and fifo status registers;
36719 + * Fifo clear only necessary on 2440, but doesn't hurt on 2410 */
36720 + writel(0xFFFFFFFF, host->base + S3C2410_SDICMDSTAT);
36721 + writel(0xFFFFFFFF, host->base + S3C2410_SDIDSTA);
36722 + writel(0xFFFFFFFF, host->base + S3C2410_SDIFSTA);
36723 +
36724 + if (cmd->data) {
36725 + int res;
36726 + res = s3cmci_setup_data(host, cmd->data);
36727 +
36728 + host->dcnt++;
36729 +
36730 + if (res) {
36731 + cmd->error = -EIO;
36732 + cmd->data->error = -EIO;
36733 +
36734 + mmc_request_done(mmc, mrq);
36735 + return;
36736 + }
36737 +
36738 +
36739 + if (host->dodma)
36740 + res = s3cmci_prepare_dma(host, cmd->data);
36741 + else
36742 + res = s3cmci_prepare_pio(host, cmd->data);
36743 +
36744 + if (res) {
36745 + cmd->error = -EIO;
36746 + cmd->data->error = -EIO;
36747 +
36748 + mmc_request_done(mmc, mrq);
36749 + return;
36750 + }
36751 +
36752 + }
36753 +
36754 + /* establish the correct prescaler depending on the sd_slow_ratio */
36755 +
36756 + if ((sd_slow_ratio > 1) &&
36757 + host->pdata->use_slow && (host->pdata->use_slow)()) {
36758 + /* compute the slower speed */
36759 + pre = host->prescaler * sd_slow_ratio;
36760 + if (pre > 255)
36761 + pre = 255;
36762 + } else {
36763 + /* use the normal speed */
36764 + pre = host->prescaler;
36765 + }
36766 +
36767 + if (host->sdipre != pre) {
36768 + dbg(host, dbg_conf, "prescaler changed: %d -> %d\n",
36769 + (int)host->sdipre, pre);
36770 + host->sdipre = pre;
36771 + writel(host->sdipre, host->base + S3C2410_SDIPRE);
36772 + }
36773 +
36774 + __s3cmci_enable_clock(host);
36775 + s3cmci_send_command(host, cmd);
36776 + enable_irq(host->irq);
36777 +}
36778 +
36779 +static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq)
36780 +{
36781 + struct s3cmci_host *host = mmc_priv(mmc);
36782 +
36783 + host->cmd_is_stop = 0;
36784 + host->mrq = mrq;
36785 +
36786 + s3cmci_send_request(mmc);
36787 +}
36788 +
36789 +static void s3cmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
36790 +{
36791 + struct s3cmci_host *host = mmc_priv(mmc);
36792 + u32 mci_psc, mci_con;
36793 +
36794 + /* Set power */
36795 + mci_con = readl(host->base + S3C2410_SDICON);
36796 + switch (ios->power_mode) {
36797 + case MMC_POWER_ON:
36798 + case MMC_POWER_UP:
36799 + s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_SDCLK);
36800 + s3c2410_gpio_cfgpin(S3C2410_GPE6, S3C2410_GPE6_SDCMD);
36801 + s3c2410_gpio_cfgpin(S3C2410_GPE7, S3C2410_GPE7_SDDAT0);
36802 + s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);
36803 + s3c2410_gpio_cfgpin(S3C2410_GPE9, S3C2410_GPE9_SDDAT2);
36804 + s3c2410_gpio_cfgpin(S3C2410_GPE10, S3C2410_GPE10_SDDAT3);
36805 +
36806 + if (host->pdata->set_power)
36807 + host->pdata->set_power(ios->power_mode, ios->vdd);
36808 +
36809 + if (!host->is2440)
36810 + mci_con |= S3C2410_SDICON_FIFORESET;
36811 +
36812 + break;
36813 +
36814 + case MMC_POWER_OFF:
36815 + default:
36816 + s3c2410_gpio_setpin(S3C2410_GPE5, 0);
36817 + s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_OUTP);
36818 +
36819 + if (host->pdata->set_power)
36820 + host->pdata->set_power(ios->power_mode, ios->vdd);
36821 +
36822 + if (host->is2440)
36823 + mci_con |= S3C2440_SDICON_SDRESET;
36824 +
36825 + break;
36826 + }
36827 +
36828 + /* Set clock */
36829 + for (mci_psc = 0; mci_psc < 255; mci_psc++) {
36830 + host->real_rate = host->clk_rate / (host->clk_div*(mci_psc+1));
36831 +
36832 + if (host->real_rate <= ios->clock)
36833 + break;
36834 + }
36835 +
36836 + if (mci_psc > 255)
36837 + mci_psc = 255;
36838 + host->prescaler = mci_psc;
36839 + host->sdipre = mci_psc;
36840 +
36841 + writel(host->prescaler, host->base + S3C2410_SDIPRE);
36842 +
36843 + /* If requested clock is 0, real_rate will be 0, too */
36844 + if (ios->clock == 0)
36845 + host->real_rate = 0;
36846 +
36847 + /* Set CLOCK_ENABLE */
36848 + if (ios->clock)
36849 + mci_con |= S3C2410_SDICON_CLOCKTYPE;
36850 + else
36851 + mci_con &= ~S3C2410_SDICON_CLOCKTYPE;
36852 +
36853 + writel(mci_con, host->base + S3C2410_SDICON);
36854 +
36855 + if ((ios->power_mode == MMC_POWER_ON)
36856 + || (ios->power_mode == MMC_POWER_UP)) {
36857 +
36858 + dbg(host, dbg_conf,
36859 + "powered (vdd: %d), clk: %lukHz div=%lu (req: %ukHz),"
36860 + " bus width: %d\n", ios->vdd, host->real_rate / 1000,
36861 + host->clk_div * (host->prescaler + 1),
36862 + ios->clock / 1000, ios->bus_width);
36863 +
36864 + /* After power-up, we need to give the card 74 clocks to
36865 + * initialize, so sleep just a moment before we disable
36866 + * the clock again.
36867 + */
36868 + if (ios->clock)
36869 + msleep(1);
36870 +
36871 + } else {
36872 + dbg(host, dbg_conf, "powered down.\n");
36873 + }
36874 +
36875 + host->bus_width = ios->bus_width;
36876 +
36877 + /* No need to run the clock until we have data to move */
36878 + if (!sd_idleclk) {
36879 + __s3cmci_disable_clock(host);
36880 + dbg(host, dbg_conf, "SD clock disabled when idle.\n");
36881 + }
36882 +}
36883 +
36884 +static void s3cmci_reset(struct s3cmci_host *host)
36885 +{
36886 + u32 con = readl(host->base + S3C2410_SDICON);
36887 +
36888 + con |= S3C2440_SDICON_SDRESET;
36889 +
36890 + writel(con, host->base + S3C2410_SDICON);
36891 +}
36892 +
36893 +static int s3cmci_get_ro(struct mmc_host *mmc)
36894 +{
36895 + struct s3cmci_host *host = mmc_priv(mmc);
36896 +
36897 + if (host->pdata->gpio_wprotect == 0)
36898 + return 0;
36899 +
36900 + return s3c2410_gpio_getpin(host->pdata->gpio_wprotect);
36901 +}
36902 +
36903 +static void s3cmci_enable_sdio_irq(struct mmc_host *mmc, int enable)
36904 +{
36905 + struct s3cmci_host *host = mmc_priv(mmc);
36906 +
36907 + if (enable)
36908 + enable_imask(host, S3C2410_SDIIMSK_SDIOIRQ);
36909 + else
36910 + disable_imask(host, S3C2410_SDIIMSK_SDIOIRQ);
36911 +}
36912 +
36913 +static struct mmc_host_ops s3cmci_ops = {
36914 + .request = s3cmci_request,
36915 + .set_ios = s3cmci_set_ios,
36916 + .get_ro = s3cmci_get_ro,
36917 + .enable_sdio_irq = s3cmci_enable_sdio_irq,
36918 +};
36919 +
36920 +static struct s3c24xx_mci_pdata s3cmci_def_pdata = {
36921 + .do_dma = 0,
36922 + .gpio_detect = 0,
36923 + .set_power = NULL,
36924 + .ocr_avail = MMC_VDD_32_33,
36925 +};
36926 +
36927 +static int s3cmci_probe(struct platform_device *pdev, int is2440)
36928 +{
36929 + struct mmc_host *mmc;
36930 + struct s3cmci_host *host;
36931 +
36932 + int ret;
36933 +
36934 + mmc = mmc_alloc_host(sizeof(struct s3cmci_host), &pdev->dev);
36935 + if (!mmc) {
36936 + ret = -ENOMEM;
36937 + goto probe_out;
36938 + }
36939 +
36940 + host = mmc_priv(mmc);
36941 + host->mmc = mmc;
36942 + host->pdev = pdev;
36943 +
36944 + host->pdata = pdev->dev.platform_data;
36945 + if (!host->pdata) {
36946 + pdev->dev.platform_data = &s3cmci_def_pdata;
36947 + host->pdata = &s3cmci_def_pdata;
36948 + }
36949 +
36950 + spin_lock_init(&host->complete_lock);
36951 + tasklet_init(&host->pio_tasklet, pio_tasklet, (unsigned long) host);
36952 + if (is2440) {
36953 + host->is2440 = 1;
36954 + host->sdiimsk = S3C2440_SDIIMSK;
36955 + host->sdidata = S3C2440_SDIDATA;
36956 + host->sdidata_b = S3C2440_SDIDATA_BYTE;
36957 + host->clk_div = 1;
36958 + } else {
36959 + host->is2440 = 0;
36960 + host->sdiimsk = S3C2410_SDIIMSK;
36961 + host->sdidata = S3C2410_SDIDATA;
36962 + host->sdidata_b = S3C2410_SDIDATA_BYTE;
36963 + host->clk_div = 2;
36964 + }
36965 + host->dodma = host->pdata->do_dma;
36966 + host->complete_what = COMPLETION_NONE;
36967 + host->pio_active = XFER_NONE;
36968 +
36969 + host->dma = DMACH_SDI;
36970 + host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
36971 + s3c2410_gpio_cfgpin(host->pdata->gpio_detect, S3C2410_GPIO_IRQ);
36972 +
36973 + host->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
36974 + if (!host->mem) {
36975 + dev_err(&pdev->dev,
36976 + "failed to get io memory region resouce.\n");
36977 +
36978 + ret = -ENOENT;
36979 + goto probe_free_host;
36980 + }
36981 +
36982 + host->mem = request_mem_region(host->mem->start,
36983 + RESSIZE(host->mem), pdev->name);
36984 +
36985 + if (!host->mem) {
36986 + dev_err(&pdev->dev, "failed to request io memory region.\n");
36987 + ret = -ENOENT;
36988 + goto probe_free_host;
36989 + }
36990 +
36991 + host->base = ioremap(host->mem->start, RESSIZE(host->mem));
36992 + if (host->base == 0) {
36993 + dev_err(&pdev->dev, "failed to ioremap() io memory region.\n");
36994 + ret = -EINVAL;
36995 + goto probe_free_mem_region;
36996 + }
36997 +
36998 + host->irq = platform_get_irq(pdev, 0);
36999 + if (host->irq == 0) {
37000 + dev_err(&pdev->dev, "failed to get interrupt resouce.\n");
37001 + ret = -EINVAL;
37002 + goto probe_iounmap;
37003 + }
37004 +
37005 + if (request_irq(host->irq, s3cmci_irq, 0, DRIVER_NAME, host)) {
37006 + dev_err(&pdev->dev, "failed to request mci interrupt.\n");
37007 + ret = -ENOENT;
37008 + goto probe_iounmap;
37009 + }
37010 +
37011 + disable_irq(host->irq);
37012 +
37013 + s3c2410_gpio_cfgpin(host->pdata->gpio_detect, S3C2410_GPIO_IRQ);
37014 + set_irq_type(host->irq_cd, IRQT_BOTHEDGE);
37015 +
37016 + if (request_irq(host->irq_cd, s3cmci_irq_cd, 0, DRIVER_NAME, host)) {
37017 + dev_err(&pdev->dev,
37018 + "failed to request card detect interrupt.\n");
37019 +
37020 + ret = -ENOENT;
37021 + goto probe_free_irq;
37022 + }
37023 +
37024 + if (host->pdata->gpio_wprotect)
37025 + s3c2410_gpio_cfgpin(host->pdata->gpio_wprotect,
37026 + S3C2410_GPIO_INPUT);
37027 +
37028 + if (s3c2410_dma_request(host->dma, &s3cmci_dma_client, NULL)) {
37029 + dev_err(&pdev->dev, "unable to get DMA channel.\n");
37030 + ret = -EBUSY;
37031 + goto probe_free_irq_cd;
37032 + }
37033 +
37034 + host->clk = clk_get(&pdev->dev, "sdi");
37035 + if (IS_ERR(host->clk)) {
37036 + dev_err(&pdev->dev, "failed to find clock source.\n");
37037 + ret = PTR_ERR(host->clk);
37038 + host->clk = NULL;
37039 + goto probe_free_host;
37040 + }
37041 +
37042 + ret = clk_enable(host->clk);
37043 + if (ret) {
37044 + dev_err(&pdev->dev, "failed to enable clock source.\n");
37045 + goto clk_free;
37046 + }
37047 +
37048 + host->clk_rate = clk_get_rate(host->clk);
37049 +
37050 + mmc->ops = &s3cmci_ops;
37051 + mmc->ocr_avail = host->pdata->ocr_avail;
37052 + mmc->caps = MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ;
37053 + mmc->f_min = host->clk_rate / (host->clk_div * 256);
37054 + mmc->f_max = sd_max_clk;
37055 +
37056 + mmc->max_blk_count = 4095;
37057 + mmc->max_blk_size = 4095;
37058 + mmc->max_req_size = 4095 * 512;
37059 + mmc->max_seg_size = mmc->max_req_size;
37060 +
37061 + mmc->max_phys_segs = 128;
37062 + mmc->max_hw_segs = 128;
37063 +
37064 + dbg(host, dbg_debug, "probe: mode:%s mapped mci_base:%p irq:%u "
37065 + "irq_cd:%u dma:%u.\n", (host->is2440?"2440":""),
37066 + host->base, host->irq, host->irq_cd, host->dma);
37067 +
37068 + ret = mmc_add_host(mmc);
37069 + if (ret) {
37070 + dev_err(&pdev->dev, "failed to add mmc host.\n");
37071 + goto free_dmabuf;
37072 + }
37073 +
37074 + platform_set_drvdata(pdev, mmc);
37075 +
37076 + dev_info(&pdev->dev, "initialisation done.\n");
37077 + return 0;
37078 +
37079 + free_dmabuf:
37080 + clk_disable(host->clk);
37081 +
37082 + clk_free:
37083 + clk_put(host->clk);
37084 +
37085 + probe_free_irq_cd:
37086 + free_irq(host->irq_cd, host);
37087 +
37088 + probe_free_irq:
37089 + free_irq(host->irq, host);
37090 +
37091 + probe_iounmap:
37092 + iounmap(host->base);
37093 +
37094 + probe_free_mem_region:
37095 + release_mem_region(host->mem->start, RESSIZE(host->mem));
37096 +
37097 + probe_free_host:
37098 + mmc_free_host(mmc);
37099 + probe_out:
37100 + return ret;
37101 +}
37102 +
37103 +static int s3cmci_remove(struct platform_device *pdev)
37104 +{
37105 + struct mmc_host *mmc = platform_get_drvdata(pdev);
37106 + struct s3cmci_host *host = mmc_priv(mmc);
37107 +
37108 + mmc_remove_host(mmc);
37109 + clk_disable(host->clk);
37110 + clk_put(host->clk);
37111 + s3c2410_dma_free(host->dma, &s3cmci_dma_client);
37112 + free_irq(host->irq_cd, host);
37113 + free_irq(host->irq, host);
37114 + iounmap(host->base);
37115 + release_mem_region(host->mem->start, RESSIZE(host->mem));
37116 + mmc_free_host(mmc);
37117 +
37118 + return 0;
37119 +}
37120 +
37121 +static int s3cmci_probe_2410(struct platform_device *dev)
37122 +{
37123 + return s3cmci_probe(dev, 0);
37124 +}
37125 +
37126 +static int s3cmci_probe_2412(struct platform_device *dev)
37127 +{
37128 + return s3cmci_probe(dev, 1);
37129 +}
37130 +
37131 +static int s3cmci_probe_2440(struct platform_device *dev)
37132 +{
37133 + return s3cmci_probe(dev, 1);
37134 +}
37135 +
37136 +#ifdef CONFIG_PM
37137 +
37138 +static int s3cmci_suspend(struct platform_device *dev, pm_message_t state)
37139 +{
37140 + struct mmc_host *mmc = platform_get_drvdata(dev);
37141 + struct s3cmci_host *host = mmc_priv(mmc);
37142 + int ret;
37143 +
37144 + /* Ensure clock is running so it will be running on resume */
37145 + __s3cmci_enable_clock(host);
37146 +
37147 + /* We will do more commands, make sure the clock stays running,
37148 + * and save our state so that we can restore it on resume.
37149 + */
37150 + suspend_sd_idleclk = sd_idleclk;
37151 + sd_idleclk = 1;
37152 +
37153 + ret = mmc_suspend_host(mmc, state);
37154 +
37155 + /* so that when we resume, we use any modified max rate */
37156 + mmc->f_max = sd_max_clk;
37157 +
37158 + return ret;
37159 +}
37160 +
37161 +static int s3cmci_resume(struct platform_device *dev)
37162 +{
37163 + struct mmc_host *mmc = platform_get_drvdata(dev);
37164 +
37165 + /* Put the sd_idleclk state back to what it was */
37166 + sd_idleclk = suspend_sd_idleclk;
37167 +
37168 + return mmc_resume_host(mmc);
37169 +}
37170 +
37171 +#else /* CONFIG_PM */
37172 +#define s3cmci_suspend NULL
37173 +#define s3cmci_resume NULL
37174 +#endif /* CONFIG_PM */
37175 +
37176 +
37177 +static struct platform_driver s3cmci_driver_2410 = {
37178 + .driver.name = "s3c2410-sdi",
37179 + .probe = s3cmci_probe_2410,
37180 + .remove = s3cmci_remove,
37181 + .suspend = s3cmci_suspend,
37182 + .resume = s3cmci_resume,
37183 +};
37184 +
37185 +static struct platform_driver s3cmci_driver_2412 = {
37186 + .driver.name = "s3c2412-sdi",
37187 + .probe = s3cmci_probe_2412,
37188 + .remove = s3cmci_remove,
37189 + .suspend = s3cmci_suspend,
37190 + .resume = s3cmci_resume,
37191 +};
37192 +
37193 +static struct platform_driver s3cmci_driver_2440 = {
37194 + .driver.name = "s3c2440-sdi",
37195 + .probe = s3cmci_probe_2440,
37196 + .remove = s3cmci_remove,
37197 + .suspend = s3cmci_suspend,
37198 + .resume = s3cmci_resume,
37199 +};
37200 +
37201 +
37202 +static int __init s3cmci_init(void)
37203 +{
37204 + spin_lock_init(&clock_lock);
37205 + platform_driver_register(&s3cmci_driver_2410);
37206 + platform_driver_register(&s3cmci_driver_2412);
37207 + platform_driver_register(&s3cmci_driver_2440);
37208 + return 0;
37209 +}
37210 +
37211 +static void __exit s3cmci_exit(void)
37212 +{
37213 + platform_driver_unregister(&s3cmci_driver_2410);
37214 + platform_driver_unregister(&s3cmci_driver_2412);
37215 + platform_driver_unregister(&s3cmci_driver_2440);
37216 +}
37217 +
37218 +module_init(s3cmci_init);
37219 +module_exit(s3cmci_exit);
37220 +
37221 +MODULE_DESCRIPTION("Samsung S3C MMC/SD Card Interface driver");
37222 +MODULE_LICENSE("GPL");
37223 +MODULE_AUTHOR("Thomas Kleffel <tk@maintech.de>");
37224 Index: linux-2.6.24.7/drivers/mmc/host/s3cmci.h
37225 ===================================================================
37226 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
37227 +++ linux-2.6.24.7/drivers/mmc/host/s3cmci.h 2008-12-11 22:46:49.000000000 +0100
37228 @@ -0,0 +1,70 @@
37229 +/*
37230 + * linux/drivers/mmc/s3cmci.h - Samsung S3C MCI driver
37231 + *
37232 + * Copyright (C) 2004-2006 Thomas Kleffel, All Rights Reserved.
37233 + *
37234 + * This program is free software; you can redistribute it and/or modify
37235 + * it under the terms of the GNU General Public License version 2 as
37236 + * published by the Free Software Foundation.
37237 + */
37238 +
37239 +enum s3cmci_waitfor {
37240 + COMPLETION_NONE,
37241 + COMPLETION_FINALIZE,
37242 + COMPLETION_CMDSENT,
37243 + COMPLETION_RSPFIN,
37244 + COMPLETION_XFERFINISH,
37245 + COMPLETION_XFERFINISH_RSPFIN,
37246 +};
37247 +
37248 +struct s3cmci_host {
37249 + struct platform_device *pdev;
37250 + struct s3c24xx_mci_pdata *pdata;
37251 + struct mmc_host *mmc;
37252 + struct resource *mem;
37253 + struct clk *clk;
37254 + void __iomem *base;
37255 + int irq;
37256 + int irq_cd;
37257 + int dma;
37258 +
37259 + unsigned long clk_rate;
37260 + unsigned long clk_div;
37261 + unsigned long real_rate;
37262 + u8 prescaler;
37263 + u8 sdipre;
37264 +
37265 + int is2440;
37266 + unsigned sdiimsk;
37267 + unsigned sdidata;
37268 + unsigned sdidata_b;
37269 + int dodma;
37270 +
37271 + int dmatogo;
37272 +
37273 + struct mmc_request *mrq;
37274 + int cmd_is_stop;
37275 +
37276 + spinlock_t complete_lock;
37277 + enum s3cmci_waitfor complete_what;
37278 +
37279 + int dma_complete;
37280 +
37281 + u32 pio_sgptr;
37282 + u32 pio_bytes;
37283 + u32 pio_count;
37284 + u8 *pio_ptr;
37285 +#define XFER_NONE 0
37286 +#define XFER_READ 1
37287 +#define XFER_WRITE 2
37288 + u32 pio_active;
37289 +
37290 + int bus_width;
37291 +
37292 + char dbgmsg_cmd[301];
37293 + char dbgmsg_dat[301];
37294 + char *status;
37295 +
37296 + unsigned int ccnt, dcnt;
37297 + struct tasklet_struct pio_tasklet;
37298 +};
37299 Index: linux-2.6.24.7/drivers/mtd/nand/nand_bbt.c
37300 ===================================================================
37301 --- linux-2.6.24.7.orig/drivers/mtd/nand/nand_bbt.c 2008-12-11 22:46:07.000000000 +0100
37302 +++ linux-2.6.24.7/drivers/mtd/nand/nand_bbt.c 2008-12-11 22:46:49.000000000 +0100
37303 @@ -430,8 +430,10 @@ static int create_bbt(struct mtd_info *m
37304
37305 if (ret) {
37306 this->bbt[i >> 3] |= 0x03 << (i & 0x6);
37307 +#if 0
37308 printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n",
37309 i >> 1, (unsigned int)from);
37310 +#endif
37311 mtd->ecc_stats.badblocks++;
37312 }
37313
37314 Index: linux-2.6.24.7/drivers/mtd/nand/s3c2410.c
37315 ===================================================================
37316 --- linux-2.6.24.7.orig/drivers/mtd/nand/s3c2410.c 2008-12-11 22:46:07.000000000 +0100
37317 +++ linux-2.6.24.7/drivers/mtd/nand/s3c2410.c 2008-12-11 22:46:49.000000000 +0100
37318 @@ -158,6 +158,10 @@ static int s3c_nand_calc_rate(int wanted
37319 {
37320 int result;
37321
37322 + /* Tacls can be 0ns in some cases */
37323 + if (wanted == 0)
37324 + return 0;
37325 +
37326 result = (wanted * clk) / NS_IN_KHZ;
37327 result++;
37328
37329 @@ -168,9 +172,6 @@ static int s3c_nand_calc_rate(int wanted
37330 return -1;
37331 }
37332
37333 - if (result < 1)
37334 - result = 1;
37335 -
37336 return result;
37337 }
37338
37339 @@ -202,7 +203,7 @@ static int s3c2410_nand_inithw(struct s3
37340 twrph1 = 8;
37341 }
37342
37343 - if (tacls < 0 || twrph0 < 0 || twrph1 < 0) {
37344 + if (tacls < 0 || twrph0 < 1 || twrph1 < 1) {
37345 dev_err(info->device, "cannot get suitable timings\n");
37346 return -EINVAL;
37347 }
37348 @@ -213,14 +214,14 @@ static int s3c2410_nand_inithw(struct s3
37349 switch (info->cpu_type) {
37350 case TYPE_S3C2410:
37351 cfg = S3C2410_NFCONF_EN;
37352 - cfg |= S3C2410_NFCONF_TACLS(tacls - 1);
37353 + cfg |= S3C2410_NFCONF_TACLS(tacls);
37354 cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
37355 cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
37356 break;
37357
37358 case TYPE_S3C2440:
37359 case TYPE_S3C2412:
37360 - cfg = S3C2440_NFCONF_TACLS(tacls - 1);
37361 + cfg = S3C2440_NFCONF_TACLS(tacls);
37362 cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);
37363 cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
37364
37365 @@ -364,23 +365,21 @@ static int s3c2410_nand_correct_data(str
37366 ((diff2 ^ (diff2 >> 1)) & 0x55) == 0x55) {
37367 /* calculate the bit position of the error */
37368
37369 - bit = (diff2 >> 2) & 1;
37370 - bit |= (diff2 >> 3) & 2;
37371 - bit |= (diff2 >> 4) & 4;
37372 + bit = ((diff2 >> 3) & 1) |
37373 + ((diff2 >> 4) & 2) |
37374 + ((diff2 >> 5) & 4);
37375
37376 /* calculate the byte position of the error */
37377
37378 - byte = (diff1 << 1) & 0x80;
37379 - byte |= (diff1 << 2) & 0x40;
37380 - byte |= (diff1 << 3) & 0x20;
37381 - byte |= (diff1 << 4) & 0x10;
37382 -
37383 - byte |= (diff0 >> 3) & 0x08;
37384 - byte |= (diff0 >> 2) & 0x04;
37385 - byte |= (diff0 >> 1) & 0x02;
37386 - byte |= (diff0 >> 0) & 0x01;
37387 -
37388 - byte |= (diff2 << 8) & 0x100;
37389 + byte = ((diff2 << 7) & 0x100) |
37390 + ((diff1 << 0) & 0x80) |
37391 + ((diff1 << 1) & 0x40) |
37392 + ((diff1 << 2) & 0x20) |
37393 + ((diff1 << 3) & 0x10) |
37394 + ((diff0 >> 4) & 0x08) |
37395 + ((diff0 >> 3) & 0x04) |
37396 + ((diff0 >> 2) & 0x02) |
37397 + ((diff0 >> 1) & 0x01);
37398
37399 dev_dbg(info->device, "correcting error bit %d, byte %d\n",
37400 bit, byte);
37401 @@ -399,7 +398,7 @@ static int s3c2410_nand_correct_data(str
37402 if ((diff0 & ~(1<<fls(diff0))) == 0)
37403 return 1;
37404
37405 - return 0;
37406 + return -EBADMSG;
37407 }
37408
37409 /* ECC functions
37410 @@ -473,7 +472,7 @@ static int s3c2440_nand_calculate_ecc(st
37411 ecc_code[1] = ecc >> 8;
37412 ecc_code[2] = ecc >> 16;
37413
37414 - pr_debug("%s: returning ecc %06lx\n", __func__, ecc);
37415 + pr_debug("%s: returning ecc %06lx\n", __func__, ecc & 0xffffff);
37416
37417 return 0;
37418 }
37419 @@ -559,17 +558,31 @@ static int s3c2410_nand_remove(struct pl
37420 }
37421
37422 #ifdef CONFIG_MTD_PARTITIONS
37423 +const char *part_probes[] = { "cmdlinepart", NULL };
37424 static int s3c2410_nand_add_partition(struct s3c2410_nand_info *info,
37425 struct s3c2410_nand_mtd *mtd,
37426 struct s3c2410_nand_set *set)
37427 {
37428 + struct mtd_partition *part_info;
37429 + int nr_part = 0;
37430 +
37431 if (set == NULL)
37432 return add_mtd_device(&mtd->mtd);
37433
37434 - if (set->nr_partitions > 0 && set->partitions != NULL) {
37435 - return add_mtd_partitions(&mtd->mtd, set->partitions, set->nr_partitions);
37436 + if (set->nr_partitions == 0) {
37437 + mtd->mtd.name = set->name;
37438 + nr_part = parse_mtd_partitions(&mtd->mtd, part_probes,
37439 + &part_info, 0);
37440 + } else {
37441 + if (set->nr_partitions > 0 && set->partitions != NULL) {
37442 + nr_part = set->nr_partitions;
37443 + part_info = set->partitions;
37444 + }
37445 }
37446
37447 + if (nr_part > 0 && part_info)
37448 + return add_mtd_partitions(&mtd->mtd, part_info, nr_part);
37449 +
37450 return add_mtd_device(&mtd->mtd);
37451 }
37452 #else
37453 @@ -598,9 +611,13 @@ static void s3c2410_nand_init_chip(struc
37454 chip->select_chip = s3c2410_nand_select_chip;
37455 chip->chip_delay = 50;
37456 chip->priv = nmtd;
37457 - chip->options = 0;
37458 chip->controller = &info->controller;
37459
37460 + if (set->flags & S3C2410_NAND_BBT)
37461 + chip->options = NAND_USE_FLASH_BBT;
37462 + else
37463 + chip->options = 0;
37464 +
37465 switch (info->cpu_type) {
37466 case TYPE_S3C2410:
37467 chip->IO_ADDR_W = regs + S3C2410_NFDATA;
37468 @@ -640,13 +657,10 @@ static void s3c2410_nand_init_chip(struc
37469 nmtd->mtd.owner = THIS_MODULE;
37470 nmtd->set = set;
37471
37472 - if (hardware_ecc) {
37473 + if (!info->platform->software_ecc && hardware_ecc) {
37474 chip->ecc.calculate = s3c2410_nand_calculate_ecc;
37475 chip->ecc.correct = s3c2410_nand_correct_data;
37476 chip->ecc.mode = NAND_ECC_HW;
37477 - chip->ecc.size = 512;
37478 - chip->ecc.bytes = 3;
37479 - chip->ecc.layout = &nand_hw_eccoob;
37480
37481 switch (info->cpu_type) {
37482 case TYPE_S3C2410:
37483 @@ -670,6 +684,34 @@ static void s3c2410_nand_init_chip(struc
37484 }
37485 }
37486
37487 +/* s3c2410_nand_update_chip
37488 + *
37489 + * post-probe chip update, to change any items, such as the
37490 + * layout for large page nand
37491 + */
37492 +
37493 +static void s3c2410_nand_update_chip(struct s3c2410_nand_info *info,
37494 + struct s3c2410_nand_mtd *nmtd)
37495 +{
37496 + struct nand_chip *chip = &nmtd->chip;
37497 +
37498 + printk("%s: chip %p: %d\n", __func__, chip, chip->page_shift);
37499 +
37500 + if (hardware_ecc) {
37501 + /* change the behaviour depending on wether we are using
37502 + * the large or small page nand device */
37503 +
37504 + if (chip->page_shift > 10) {
37505 + chip->ecc.size = 256;
37506 + chip->ecc.bytes = 3;
37507 + } else {
37508 + chip->ecc.size = 512;
37509 + chip->ecc.bytes = 3;
37510 + chip->ecc.layout = &nand_hw_eccoob;
37511 + }
37512 + }
37513 +}
37514 +
37515 /* s3c2410_nand_probe
37516 *
37517 * called by device layer when it finds a device matching
37518 @@ -776,9 +818,12 @@ static int s3c24xx_nand_probe(struct pla
37519
37520 s3c2410_nand_init_chip(info, nmtd, sets);
37521
37522 - nmtd->scan_res = nand_scan(&nmtd->mtd, (sets) ? sets->nr_chips : 1);
37523 + nmtd->scan_res = nand_scan_ident(&nmtd->mtd,
37524 + (sets) ? sets->nr_chips : 1);
37525
37526 if (nmtd->scan_res == 0) {
37527 + s3c2410_nand_update_chip(info, nmtd);
37528 + nand_scan_tail(&nmtd->mtd);
37529 s3c2410_nand_add_partition(info, nmtd, sets);
37530 }
37531
37532 Index: linux-2.6.24.7/drivers/net/cs89x0.c
37533 ===================================================================
37534 --- linux-2.6.24.7.orig/drivers/net/cs89x0.c 2008-12-11 22:46:07.000000000 +0100
37535 +++ linux-2.6.24.7/drivers/net/cs89x0.c 2008-12-11 22:46:49.000000000 +0100
37536 @@ -194,6 +194,10 @@ static unsigned int cs8900_irq_map[] = {
37537 #define CIRRUS_DEFAULT_IRQ VH_INTC_INT_NUM_CASCADED_INTERRUPT_1 /* Event inputs bank 1 - ID 35/bit 3 */
37538 static unsigned int netcard_portlist[] __initdata = {CIRRUS_DEFAULT_BASE, 0};
37539 static unsigned int cs8900_irq_map[] = {CIRRUS_DEFAULT_IRQ, 0, 0, 0};
37540 +#elif defined(CONFIG_MACH_QT2410)
37541 +#include <asm/arch/irqs.h>
37542 +static unsigned int netcard_portlist [] __initdata = { 0xe0000300, 0 };
37543 +static unsigned int cs8900_irq_map[] = { IRQ_EINT9, 0, 0, 0 };
37544 #else
37545 static unsigned int netcard_portlist[] __initdata =
37546 { 0x300, 0x320, 0x340, 0x360, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2a0, 0x2c0, 0x2e0, 0};
37547 @@ -829,6 +833,14 @@ cs89x0_probe1(struct net_device *dev, in
37548
37549 printk(" IRQ %d", dev->irq);
37550
37551 + dev->dev_addr[0] = 0x00;
37552 + dev->dev_addr[1] = 0x00;
37553 + dev->dev_addr[2] = 0xc0;
37554 + dev->dev_addr[3] = 0xff;
37555 + dev->dev_addr[4] = 0xee;
37556 + dev->dev_addr[5] = 0x08;
37557 + set_mac_address(dev, dev->dev_addr);
37558 +
37559 #if ALLOW_DMA
37560 if (lp->use_dma) {
37561 get_dma_channel(dev);
37562 @@ -1304,7 +1316,7 @@ net_open(struct net_device *dev)
37563 else
37564 #endif
37565 {
37566 -#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X)
37567 +#if !defined(CONFIG_MACH_IXDP2351) && !defined(CONFIG_ARCH_IXDP2X01) && !defined(CONFIG_ARCH_PNX010X) && !defined(CONFIG_MACH_QT2410)
37568 if (((1 << dev->irq) & lp->irq_map) == 0) {
37569 printk(KERN_ERR "%s: IRQ %d is not in our map of allowable IRQs, which is %x\n",
37570 dev->name, dev->irq, lp->irq_map);
37571 Index: linux-2.6.24.7/drivers/net/Kconfig
37572 ===================================================================
37573 --- linux-2.6.24.7.orig/drivers/net/Kconfig 2008-12-11 22:46:09.000000000 +0100
37574 +++ linux-2.6.24.7/drivers/net/Kconfig 2008-12-11 22:46:49.000000000 +0100
37575 @@ -1332,7 +1332,7 @@ source "drivers/net/ibm_newemac/Kconfig"
37576
37577 config NET_PCI
37578 bool "EISA, VLB, PCI and on board controllers"
37579 - depends on ISA || EISA || PCI
37580 + depends on ISA || EISA || PCI || MACH_QT2410
37581 help
37582 This is another class of network cards which attach directly to the
37583 bus. If you have one of those, say Y and read the Ethernet-HOWTO,
37584 @@ -1508,7 +1508,7 @@ config FORCEDETH_NAPI
37585
37586 config CS89x0
37587 tristate "CS89x0 support"
37588 - depends on NET_PCI && (ISA || MACH_IXDP2351 || ARCH_IXDP2X01 || ARCH_PNX010X)
37589 + depends on NET_PCI && (ISA || MACH_IXDP2351 || ARCH_IXDP2X01 || ARCH_PNX010X || MACH_QT2410)
37590 ---help---
37591 Support for CS89x0 chipset based Ethernet cards. If you have a
37592 network (Ethernet) card of this type, say Y and read the
37593 Index: linux-2.6.24.7/drivers/pnp/Kconfig
37594 ===================================================================
37595 --- linux-2.6.24.7.orig/drivers/pnp/Kconfig 2008-12-11 22:46:07.000000000 +0100
37596 +++ linux-2.6.24.7/drivers/pnp/Kconfig 2008-12-11 22:46:49.000000000 +0100
37597 @@ -5,7 +5,7 @@
37598 menuconfig PNP
37599 bool "Plug and Play support"
37600 depends on HAS_IOMEM
37601 - depends on ISA || ACPI
37602 + depends on ISA || ACPI || SDIO
37603 ---help---
37604 Plug and Play (PnP) is a standard for peripherals which allows those
37605 peripherals to be configured by software, e.g. assign IRQ's or other
37606 Index: linux-2.6.24.7/drivers/pnp/resource.c
37607 ===================================================================
37608 --- linux-2.6.24.7.orig/drivers/pnp/resource.c 2008-12-11 22:46:07.000000000 +0100
37609 +++ linux-2.6.24.7/drivers/pnp/resource.c 2008-12-11 22:46:49.000000000 +0100
37610 @@ -431,6 +431,7 @@ int pnp_check_dma(struct pnp_dev *dev, i
37611 }
37612 }
37613
37614 +#if 0
37615 /* check if the resource is already in use, skip if the
37616 * device is active because it itself may be in use */
37617 if (!dev->active) {
37618 @@ -438,6 +439,7 @@ int pnp_check_dma(struct pnp_dev *dev, i
37619 return 0;
37620 free_dma(*dma);
37621 }
37622 +#endif
37623
37624 /* check for conflicts with other pnp devices */
37625 pnp_for_each_dev(tdev) {
37626 Index: linux-2.6.24.7/drivers/power/bq27000_battery.c
37627 ===================================================================
37628 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
37629 +++ linux-2.6.24.7/drivers/power/bq27000_battery.c 2008-12-11 22:46:49.000000000 +0100
37630 @@ -0,0 +1,424 @@
37631 +/*
37632 + * Driver for batteries with bq27000 chips inside via HDQ
37633 + *
37634 + * Copyright 2008 Openmoko, Inc
37635 + * Andy Green <andy@openmoko.com>
37636 + *
37637 + * based on ds2760 driver, original copyright notice for that --->
37638 + *
37639 + * Copyright © 2007 Anton Vorontsov
37640 + * 2004-2007 Matt Reimer
37641 + * 2004 Szabolcs Gyurko
37642 + *
37643 + * Use consistent with the GNU GPL is permitted,
37644 + * provided that this copyright notice is
37645 + * preserved in its entirety in all copies and derived works.
37646 + *
37647 + * Author: Anton Vorontsov <cbou@mail.ru>
37648 + * February 2007
37649 + *
37650 + * Matt Reimer <mreimer@vpop.net>
37651 + * April 2004, 2005, 2007
37652 + *
37653 + * Szabolcs Gyurko <szabolcs.gyurko@tlt.hu>
37654 + * September 2004
37655 + */
37656 +
37657 +#include <linux/module.h>
37658 +#include <linux/param.h>
37659 +#include <linux/jiffies.h>
37660 +#include <linux/delay.h>
37661 +#include <linux/pm.h>
37662 +#include <linux/platform_device.h>
37663 +#include <linux/power_supply.h>
37664 +#include <linux/bq27000_battery.h>
37665 +
37666 +enum bq27000_regs {
37667 + /* RAM regs */
37668 + /* read-write after this */
37669 + BQ27000_CTRL = 0, /* Device Control Register */
37670 + BQ27000_MODE, /* Device Mode Register */
37671 + BQ27000_AR_L, /* At-Rate H L */
37672 + BQ27000_AR_H,
37673 + /* read-only after this */
37674 + BQ27000_ARTTE_L, /* At-Rate Time To Empty H L */
37675 + BQ27000_ARTTE_H,
37676 + BQ27000_TEMP_L, /* Reported Temperature H L */
37677 + BQ27000_TEMP_H,
37678 + BQ27000_VOLT_L, /* Reported Voltage H L */
37679 + BQ27000_VOLT_H,
37680 + BQ27000_FLAGS, /* Status Flags */
37681 + BQ27000_RSOC, /* Relative State of Charge */
37682 + BQ27000_NAC_L, /* Nominal Available Capacity H L */
37683 + BQ27000_NAC_H,
37684 + BQ27000_CACD_L, /* Discharge Compensated H L */
37685 + BQ27000_CACD_H,
37686 + BQ27000_CACT_L, /* Temperature Compensated H L */
37687 + BQ27000_CACT_H,
37688 + BQ27000_LMD_L, /* Last measured discharge H L */
37689 + BQ27000_LMD_H,
37690 + BQ27000_AI_L, /* Average Current H L */
37691 + BQ27000_AI_H,
37692 + BQ27000_TTE_L, /* Time to Empty H L */
37693 + BQ27000_TTE_H,
37694 + BQ27000_TTF_L, /* Time to Full H L */
37695 + BQ27000_TTF_H,
37696 + BQ27000_SI_L, /* Standby Current H L */
37697 + BQ27000_SI_H,
37698 + BQ27000_STTE_L, /* Standby Time To Empty H L */
37699 + BQ27000_STTE_H,
37700 + BQ27000_MLI_L, /* Max Load Current H L */
37701 + BQ27000_MLI_H,
37702 + BQ27000_MLTTE_L, /* Max Load Time To Empty H L */
37703 + BQ27000_MLTTE_H,
37704 + BQ27000_SAE_L, /* Available Energy H L */
37705 + BQ27000_SAE_H,
37706 + BQ27000_AP_L, /* Available Power H L */
37707 + BQ27000_AP_H,
37708 + BQ27000_TTECP_L, /* Time to Empty at Constant Power H L */
37709 + BQ27000_TTECP_H,
37710 + BQ27000_CYCL_L, /* Cycle count since learning cycle H L */
37711 + BQ27000_CYCL_H,
37712 + BQ27000_CYCT_L, /* Cycle Count Total H L */
37713 + BQ27000_CYCT_H,
37714 + BQ27000_CSOC, /* Compensated State Of Charge */
37715 + /* EEPROM regs */
37716 + /* read-write after this */
37717 + BQ27000_EE_EE_EN = 0x6e, /* EEPROM Program Enable */
37718 + BQ27000_EE_ILMD = 0x76, /* Initial Last Measured Discharge High Byte */
37719 + BQ27000_EE_SEDVF, /* Scaled EDVF Threshold */
37720 + BQ27000_EE_SEDV1, /* Scaled EDV1 Threshold */
37721 + BQ27000_EE_ISLC, /* Initial Standby Load Current */
37722 + BQ27000_EE_DMFSD, /* Digital Magnitude Filter and Self Discharge */
37723 + BQ27000_EE_TAPER, /* Aging Estimate Enable, Charge Termination Taper */
37724 + BQ27000_EE_PKCFG, /* Pack Configuration Values */
37725 + BQ27000_EE_IMLC, /* Initial Max Load Current or ID #3 */
37726 + BQ27000_EE_DCOMP, /* Discharge rate compensation constants or ID #2 */
37727 + BQ27000_EE_TCOMP, /* Temperature Compensation constants or ID #1 */
37728 +};
37729 +
37730 +enum bq27000_status_flags {
37731 + BQ27000_STATUS_CHGS = 0x80, /* 1 = being charged */
37732 + BQ27000_STATUS_NOACT = 0x40, /* 1 = no activity */
37733 + BQ27000_STATUS_IMIN = 0x20, /* 1 = Lion taper current mode */
37734 + BQ27000_STATUS_CI = 0x10, /* 1 = capacity likely innacurate */
37735 + BQ27000_STATUS_CALIP = 0x08, /* 1 = calibration in progress */
37736 + BQ27000_STATUS_VDQ = 0x04, /* 1 = capacity should be accurate */
37737 + BQ27000_STATUS_EDV1 = 0x02, /* 1 = end of discharge.. <6% left */
37738 + BQ27000_STATUS_EDVF = 0x01, /* 1 = no, it's really empty now */
37739 +};
37740 +
37741 +#define NANOVOLTS_UNIT 3750
37742 +
37743 +struct bq27000_device_info {
37744 + struct device *dev;
37745 + struct power_supply bat;
37746 + struct bq27000_platform_data *pdata;
37747 +};
37748 +
37749 +/*
37750 + * reading 16 bit values over HDQ has a special hazard where the
37751 + * hdq device firmware can update the 16-bit register during the time we
37752 + * read the two halves. TI document SLUS556D recommends the algorithm here
37753 + * to avoid trouble
37754 + */
37755 +
37756 +static int hdq_read16(struct bq27000_device_info *di, int address)
37757 +{
37758 + int acc;
37759 + int high;
37760 + int retries = 3;
37761 +
37762 + while (retries--) {
37763 +
37764 + high = (di->pdata->hdq_read)(address + 1); /* high part */
37765 +
37766 + if (high < 0)
37767 + return high;
37768 + acc = (di->pdata->hdq_read)(address);
37769 + if (acc < 0)
37770 + return acc;
37771 +
37772 + /* confirm high didn't change between reading it and low */
37773 + if (high == (di->pdata->hdq_read)(address + 1))
37774 + return (high << 8) | acc;
37775 + }
37776 +
37777 + return -ETIME;
37778 +}
37779 +
37780 +#define to_bq27000_device_info(x) container_of((x), \
37781 + struct bq27000_device_info, \
37782 + bat);
37783 +
37784 +static void bq27000_battery_external_power_changed(struct power_supply *psy)
37785 +{
37786 + struct bq27000_device_info *di = to_bq27000_device_info(psy);
37787 +
37788 + dev_dbg(di->dev, "%s\n", __FUNCTION__);
37789 +}
37790 +
37791 +static int bq27000_battery_get_property(struct power_supply *psy,
37792 + enum power_supply_property psp,
37793 + union power_supply_propval *val)
37794 +{
37795 + int v, n;
37796 + struct bq27000_device_info *di = to_bq27000_device_info(psy);
37797 +
37798 + if (!(di->pdata->hdq_initialized)())
37799 + return -EINVAL;
37800 +
37801 + switch (psp) {
37802 + case POWER_SUPPLY_PROP_STATUS:
37803 + val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
37804 +
37805 + if (!di->pdata->get_charger_online_status)
37806 + goto use_bat;
37807 + if ((di->pdata->get_charger_online_status)()) {
37808 + /*
37809 + * charger is definitively present
37810 + * we report our state in terms of what it says it
37811 + * is doing
37812 + */
37813 + if (!di->pdata->get_charger_active_status)
37814 + goto use_bat;
37815 +
37816 + if ((di->pdata->get_charger_active_status)()) {
37817 + val->intval = POWER_SUPPLY_STATUS_CHARGING;
37818 + break;
37819 + }
37820 + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
37821 + break;
37822 + }
37823 +
37824 + /*
37825 + * platform provided definite indication of charger presence,
37826 + * and it is telling us it isn't there... but we are on so we
37827 + * must be running from battery --->
37828 + */
37829 +
37830 + val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
37831 + break;
37832 +
37833 +use_bat:
37834 + /*
37835 + * either the charger is not connected, or the
37836 + * platform doesn't give info about charger, use battery state
37837 + * but... battery state can be out of date by 4 seconds or
37838 + * so... use the platform callbacks if possible.
37839 + */
37840 + v = hdq_read16(di, BQ27000_AI_L);
37841 + if (v < 0)
37842 + return v;
37843 +
37844 + /* no real activity on the battery */
37845 + if (v < 2) {
37846 + if (!hdq_read16(di, BQ27000_TTF_L))
37847 + val->intval = POWER_SUPPLY_STATUS_FULL;
37848 + else
37849 + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
37850 + break;
37851 + }
37852 + /* power is actually going in or out... */
37853 + v = (di->pdata->hdq_read)(BQ27000_FLAGS);
37854 + if (v < 0)
37855 + return v;
37856 + if (v & BQ27000_STATUS_CHGS)
37857 + val->intval = POWER_SUPPLY_STATUS_CHARGING;
37858 + else
37859 + val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
37860 + break;
37861 + case POWER_SUPPLY_PROP_VOLTAGE_NOW:
37862 + v = hdq_read16(di, BQ27000_VOLT_L);
37863 + if (v < 0)
37864 + return v;
37865 + /* mV -> uV */
37866 + val->intval = v * 1000;
37867 + break;
37868 + case POWER_SUPPLY_PROP_CURRENT_NOW:
37869 + v = (di->pdata->hdq_read)(BQ27000_FLAGS);
37870 + if (v < 0)
37871 + return v;
37872 + if (v & BQ27000_STATUS_CHGS)
37873 + n = -NANOVOLTS_UNIT;
37874 + else
37875 + n = NANOVOLTS_UNIT;
37876 + v = hdq_read16(di, BQ27000_AI_L);
37877 + if (v < 0)
37878 + return v;
37879 + val->intval = (v * n) / di->pdata->rsense_mohms;
37880 + break;
37881 + case POWER_SUPPLY_PROP_CHARGE_FULL:
37882 + v = hdq_read16(di, BQ27000_LMD_L);
37883 + if (v < 0)
37884 + return v;
37885 + val->intval = (v * 3570) / di->pdata->rsense_mohms;
37886 + break;
37887 + case POWER_SUPPLY_PROP_TEMP:
37888 + v = hdq_read16(di, BQ27000_TEMP_L);
37889 + if (v < 0)
37890 + return v;
37891 + /* K (in 0.25K units) is 273.15 up from C (in 0.1C)*/
37892 + /* 10926 = 27315 * 4 / 10 */
37893 + val->intval = (((long)v * 10l) - 10926) / 4;
37894 + break;
37895 + case POWER_SUPPLY_PROP_TECHNOLOGY:
37896 + val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
37897 + break;
37898 + case POWER_SUPPLY_PROP_CAPACITY:
37899 + val->intval = (di->pdata->hdq_read)(BQ27000_RSOC);
37900 + if (val->intval < 0)
37901 + return val->intval;
37902 + break;
37903 + case POWER_SUPPLY_PROP_PRESENT:
37904 + v = (di->pdata->hdq_read)(BQ27000_RSOC);
37905 + val->intval = !(v < 0);
37906 + break;
37907 + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
37908 + v = hdq_read16(di, BQ27000_TTE_L);
37909 + if (v < 0)
37910 + return v;
37911 + val->intval = 60 * v;
37912 + break;
37913 + case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
37914 + v = hdq_read16(di, BQ27000_TTF_L);
37915 + if (v < 0)
37916 + return v;
37917 + val->intval = 60 * v;
37918 + break;
37919 + case POWER_SUPPLY_PROP_ONLINE:
37920 + if (di->pdata->get_charger_online_status)
37921 + val->intval = (di->pdata->get_charger_online_status)();
37922 + else
37923 + return -EINVAL;
37924 + break;
37925 + default:
37926 + return -EINVAL;
37927 + }
37928 +
37929 + return 0;
37930 +}
37931 +
37932 +static enum power_supply_property bq27000_battery_props[] = {
37933 + POWER_SUPPLY_PROP_STATUS,
37934 + POWER_SUPPLY_PROP_VOLTAGE_NOW,
37935 + POWER_SUPPLY_PROP_CURRENT_NOW,
37936 + POWER_SUPPLY_PROP_CHARGE_FULL,
37937 + POWER_SUPPLY_PROP_TEMP,
37938 + POWER_SUPPLY_PROP_TECHNOLOGY,
37939 + POWER_SUPPLY_PROP_PRESENT,
37940 + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW,
37941 + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW,
37942 + POWER_SUPPLY_PROP_CAPACITY,
37943 + POWER_SUPPLY_PROP_ONLINE
37944 +};
37945 +
37946 +static int bq27000_battery_probe(struct platform_device *pdev)
37947 +{
37948 + int retval = 0;
37949 + struct bq27000_device_info *di;
37950 + struct bq27000_platform_data *pdata;
37951 +
37952 + dev_info(&pdev->dev, "BQ27000 Battery Driver (C) 2008 Openmoko, Inc\n");
37953 +
37954 + di = kzalloc(sizeof(*di), GFP_KERNEL);
37955 + if (!di) {
37956 + retval = -ENOMEM;
37957 + goto di_alloc_failed;
37958 + }
37959 +
37960 + platform_set_drvdata(pdev, di);
37961 +
37962 + pdata = pdev->dev.platform_data;
37963 + di->dev = &pdev->dev;
37964 + /* di->w1_dev = pdev->dev.parent; */
37965 + di->bat.name = pdata->name;
37966 + di->bat.type = POWER_SUPPLY_TYPE_BATTERY;
37967 + di->bat.properties = bq27000_battery_props;
37968 + di->bat.num_properties = ARRAY_SIZE(bq27000_battery_props);
37969 + di->bat.get_property = bq27000_battery_get_property;
37970 + di->bat.external_power_changed =
37971 + bq27000_battery_external_power_changed;
37972 + di->bat.use_for_apm = 1;
37973 + di->pdata = pdata;
37974 +
37975 + retval = power_supply_register(&pdev->dev, &di->bat);
37976 + if (retval) {
37977 + dev_err(di->dev, "failed to register battery\n");
37978 + goto batt_failed;
37979 + }
37980 +
37981 + return 0;
37982 +
37983 +batt_failed:
37984 + kfree(di);
37985 +di_alloc_failed:
37986 + return retval;
37987 +}
37988 +
37989 +static int bq27000_battery_remove(struct platform_device *pdev)
37990 +{
37991 + struct bq27000_device_info *di = platform_get_drvdata(pdev);
37992 +
37993 + power_supply_unregister(&di->bat);
37994 +
37995 + return 0;
37996 +}
37997 +
37998 +void bq27000_charging_state_change(struct platform_device *pdev)
37999 +{
38000 + struct bq27000_device_info *di = platform_get_drvdata(pdev);
38001 +
38002 + if (!di)
38003 + return;
38004 +
38005 + power_supply_changed(&di->bat);
38006 +}
38007 +EXPORT_SYMBOL_GPL(bq27000_charging_state_change);
38008 +
38009 +#ifdef CONFIG_PM
38010 +
38011 +static int bq27000_battery_suspend(struct platform_device *pdev,
38012 + pm_message_t state)
38013 +{
38014 + return 0;
38015 +}
38016 +
38017 +static int bq27000_battery_resume(struct platform_device *pdev)
38018 +{
38019 + return 0;
38020 +}
38021 +
38022 +#else
38023 +
38024 +#define bq27000_battery_suspend NULL
38025 +#define bq27000_battery_resume NULL
38026 +
38027 +#endif /* CONFIG_PM */
38028 +
38029 +static struct platform_driver bq27000_battery_driver = {
38030 + .driver = {
38031 + .name = "bq27000-battery",
38032 + },
38033 + .probe = bq27000_battery_probe,
38034 + .remove = bq27000_battery_remove,
38035 + .suspend = bq27000_battery_suspend,
38036 + .resume = bq27000_battery_resume,
38037 +};
38038 +
38039 +static int __init bq27000_battery_init(void)
38040 +{
38041 + return platform_driver_register(&bq27000_battery_driver);
38042 +}
38043 +
38044 +static void __exit bq27000_battery_exit(void)
38045 +{
38046 + platform_driver_unregister(&bq27000_battery_driver);
38047 +}
38048 +
38049 +module_init(bq27000_battery_init);
38050 +module_exit(bq27000_battery_exit);
38051 +
38052 +MODULE_LICENSE("GPL");
38053 +MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
38054 +MODULE_DESCRIPTION("bq27000 battery driver");
38055 Index: linux-2.6.24.7/drivers/power/gta01_battery.c
38056 ===================================================================
38057 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
38058 +++ linux-2.6.24.7/drivers/power/gta01_battery.c 2008-12-11 22:46:49.000000000 +0100
38059 @@ -0,0 +1,97 @@
38060 +/*
38061 + * Battery driver for the Openmoko GTA01 device, using the pcf50606 chip.
38062 + *
38063 + * This is nothing more than a write-thru interface to the real logic,
38064 + * which is part of the pcf50606.c multifunction chip driver.
38065 + * Copyright © 2008 Mike Westerhof <mwester@dls.net>
38066 + *
38067 + *
38068 + * Portions liberally borrowed from olpc_battery.c, copyright below:
38069 + * Copyright © 2006 David Woodhouse <dwmw2@infradead.org>
38070 + *
38071 + * This program is free software; you can redistribute it and/or modify
38072 + * it under the terms of the GNU General Public License version 2 as
38073 + * published by the Free Software Foundation.
38074 + */
38075 +
38076 +#include <linux/module.h>
38077 +#include <linux/err.h>
38078 +#include <linux/platform_device.h>
38079 +#include <linux/power_supply.h>
38080 +#include <linux/jiffies.h>
38081 +#include <linux/sched.h>
38082 +
38083 +/*********************************************************************
38084 + * This global is set by the pcf50606 driver to the correct callback
38085 + *********************************************************************/
38086 +
38087 +extern int (*pmu_bat_get_property)(struct power_supply *,
38088 + enum power_supply_property,
38089 + union power_supply_propval *);
38090 +
38091 +
38092 +/*********************************************************************
38093 + * Battery properties
38094 + *********************************************************************/
38095 +static int gta01_bat_get_property(struct power_supply *psy,
38096 + enum power_supply_property psp,
38097 + union power_supply_propval *val)
38098 +{
38099 + if (pmu_bat_get_property)
38100 + return (pmu_bat_get_property)(psy, psp, val);
38101 + else
38102 + return -ENODEV;
38103 +}
38104 +
38105 +static enum power_supply_property gta01_bat_props[] = {
38106 + POWER_SUPPLY_PROP_STATUS,
38107 + POWER_SUPPLY_PROP_PRESENT,
38108 + POWER_SUPPLY_PROP_ONLINE,
38109 + POWER_SUPPLY_PROP_VOLTAGE_NOW,
38110 + POWER_SUPPLY_PROP_CURRENT_NOW,
38111 + POWER_SUPPLY_PROP_TEMP,
38112 + POWER_SUPPLY_PROP_CAPACITY,
38113 +};
38114 +
38115 +/*********************************************************************
38116 + * Initialisation
38117 + *********************************************************************/
38118 +
38119 +static struct platform_device *bat_pdev;
38120 +
38121 +static struct power_supply gta01_bat = {
38122 + .properties = gta01_bat_props,
38123 + .num_properties = ARRAY_SIZE(gta01_bat_props),
38124 + .get_property = gta01_bat_get_property,
38125 + .use_for_apm = 0, /* pcf50606 driver has its own apm driver */
38126 +};
38127 +
38128 +static int __init gta01_bat_init(void)
38129 +{
38130 + int ret;
38131 +
38132 + bat_pdev = platform_device_register_simple("bat", 0, NULL, 0);
38133 + if (IS_ERR(bat_pdev))
38134 + return PTR_ERR(bat_pdev);
38135 +
38136 + gta01_bat.name = bat_pdev->name;
38137 +
38138 + ret = power_supply_register(&bat_pdev->dev, &gta01_bat);
38139 + if (ret)
38140 + platform_device_unregister(bat_pdev);
38141 +
38142 + return ret;
38143 +}
38144 +
38145 +static void __exit gta01_bat_exit(void)
38146 +{
38147 + power_supply_unregister(&gta01_bat);
38148 + platform_device_unregister(bat_pdev);
38149 +}
38150 +
38151 +module_init(gta01_bat_init);
38152 +module_exit(gta01_bat_exit);
38153 +
38154 +MODULE_AUTHOR("Mike Westerhof <mwester@dls.net>");
38155 +MODULE_LICENSE("GPL");
38156 +MODULE_DESCRIPTION("Battery driver for GTA01");
38157 Index: linux-2.6.24.7/drivers/power/gta02_hdq.c
38158 ===================================================================
38159 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
38160 +++ linux-2.6.24.7/drivers/power/gta02_hdq.c 2008-12-11 22:46:49.000000000 +0100
38161 @@ -0,0 +1,250 @@
38162 +/*
38163 + * HDQ driver for the FIC Neo1973 GTA02 GSM phone
38164 + *
38165 + * (C) 2006-2007 by Openmoko, Inc.
38166 + * Author: Andy Green <andy@openmoko.com>
38167 + * All rights reserved.
38168 + *
38169 + * This program is free software; you can redistribute it and/or modify
38170 + * it under the terms of the GNU General Public License version 2 as
38171 + * published by the Free Software Foundation.
38172 + *
38173 + */
38174 +
38175 +#include <linux/kernel.h>
38176 +#include <linux/init.h>
38177 +#include <linux/delay.h>
38178 +#include <linux/platform_device.h>
38179 +#include <asm/hardware.h>
38180 +#include <asm/mach-types.h>
38181 +#include <asm/arch/gta02.h>
38182 +#include <asm/arch/fiq_ipc_gta02.h>
38183 +
38184 +
38185 +
38186 +#define HDQ_READ 0
38187 +#define HDQ_WRITE 0x80
38188 +
38189 +
38190 +int gta02hdq_initialized(void)
38191 +{
38192 + return fiq_ipc.hdq_probed;
38193 +}
38194 +EXPORT_SYMBOL_GPL(gta02hdq_initialized);
38195 +
38196 +int gta02hdq_read(int address)
38197 +{
38198 + int count_sleeps = 5;
38199 + int ret = -ETIME;
38200 +
38201 + mutex_lock(&fiq_ipc.hdq_lock);
38202 +
38203 + fiq_ipc.hdq_ads = address | HDQ_READ;
38204 + fiq_ipc.hdq_request_ctr++;
38205 + fiq_kick();
38206 + /*
38207 + * FIQ takes care of it while we block our calling process
38208 + * But we're not spinning -- other processes run normally while
38209 + * we wait for the result
38210 + */
38211 + while (count_sleeps--) {
38212 + msleep(10); /* valid transaction always completes in < 10ms */
38213 +
38214 + if (fiq_ipc.hdq_request_ctr != fiq_ipc.hdq_transaction_ctr)
38215 + continue;
38216 +
38217 + if (fiq_ipc.hdq_error)
38218 + goto done; /* didn't see a response in good time */
38219 +
38220 + ret = fiq_ipc.hdq_rx_data;
38221 + goto done;
38222 + }
38223 + ret = -EINVAL;
38224 +
38225 +done:
38226 + mutex_unlock(&fiq_ipc.hdq_lock);
38227 + return ret;
38228 +}
38229 +EXPORT_SYMBOL_GPL(gta02hdq_read);
38230 +
38231 +int gta02hdq_write(int address, u8 data)
38232 +{
38233 + int count_sleeps = 5;
38234 + int ret = -ETIME;
38235 +
38236 + mutex_lock(&fiq_ipc.hdq_lock);
38237 +
38238 + fiq_ipc.hdq_ads = address | HDQ_WRITE;
38239 + fiq_ipc.hdq_tx_data = data;
38240 + fiq_ipc.hdq_request_ctr++;
38241 + fiq_kick();
38242 + /*
38243 + * FIQ takes care of it while we block our calling process
38244 + * But we're not spinning -- other processes run normally while
38245 + * we wait for the result
38246 + */
38247 + while (count_sleeps--) {
38248 + msleep(10); /* valid transaction always completes in < 10ms */
38249 +
38250 + if (fiq_ipc.hdq_request_ctr != fiq_ipc.hdq_transaction_ctr)
38251 + continue; /* something bad with FIQ */
38252 +
38253 + if (fiq_ipc.hdq_error)
38254 + goto done; /* didn't see a response in good time */
38255 + }
38256 + ret = -EINVAL;
38257 +
38258 +done:
38259 + mutex_unlock(&fiq_ipc.hdq_lock);
38260 + return ret;
38261 +}
38262 +EXPORT_SYMBOL_GPL(gta02hdq_write);
38263 +
38264 +/* sysfs */
38265 +
38266 +static ssize_t hdq_sysfs_dump(struct device *dev, struct device_attribute *attr,
38267 + char *buf)
38268 +{
38269 + int n;
38270 + int v;
38271 + u8 u8a[128]; /* whole address space for HDQ */
38272 + char *end = buf;
38273 +
38274 + /* the dump does not take care about 16 bit regs, because at this
38275 + * bus level we don't know about the chip details
38276 + */
38277 + for (n = 0; n < sizeof(u8a); n++) {
38278 + v = gta02hdq_read(n);
38279 + if (v < 0)
38280 + goto bail;
38281 + u8a[n] = v;
38282 + }
38283 +
38284 + for (n = 0; n < sizeof(u8a); n += 16) {
38285 + hex_dump_to_buffer(u8a + n, sizeof(u8a), 16, 1, end, 4096, 0);
38286 + end += strlen(end);
38287 + *end++ = '\n';
38288 + *end = '\0';
38289 + }
38290 + return (end - buf);
38291 +
38292 +bail:
38293 + return sprintf(buf, "ERROR %d\n", v);
38294 +}
38295 +
38296 +/* you write by <address> <data>, eg, "34 128" */
38297 +
38298 +#define atoi(str) simple_strtoul(((str != NULL) ? str : ""), NULL, 0)
38299 +
38300 +static ssize_t hdq_sysfs_write(struct device *dev,
38301 + struct device_attribute *attr,
38302 + const char *buf, size_t count)
38303 +{
38304 + const char *end = buf + count;
38305 + int address = atoi(buf);
38306 +
38307 + while ((buf != end) && (*buf != ' '))
38308 + buf++;
38309 + if (buf >= end)
38310 + return 0;
38311 + while ((buf < end) && (*buf == ' '))
38312 + buf++;
38313 + if (buf >= end)
38314 + return 0;
38315 +
38316 + gta02hdq_write(address, atoi(buf));
38317 +
38318 + return count;
38319 +}
38320 +
38321 +static DEVICE_ATTR(dump, 0400, hdq_sysfs_dump, NULL);
38322 +static DEVICE_ATTR(write, 0600, NULL, hdq_sysfs_write);
38323 +
38324 +static struct attribute *gta02hdq_sysfs_entries[] = {
38325 + &dev_attr_dump.attr,
38326 + &dev_attr_write.attr,
38327 + NULL
38328 +};
38329 +
38330 +static struct attribute_group gta02hdq_attr_group = {
38331 + .name = "hdq",
38332 + .attrs = gta02hdq_sysfs_entries,
38333 +};
38334 +
38335 +
38336 +#ifdef CONFIG_PM
38337 +static int gta02hdq_suspend(struct platform_device *pdev, pm_message_t state)
38338 +{
38339 + /* after 18s of this, the battery monitor will also go to sleep */
38340 + s3c2410_gpio_setpin(fiq_ipc.hdq_gpio_pin, 0);
38341 + s3c2410_gpio_cfgpin(fiq_ipc.hdq_gpio_pin, S3C2410_GPIO_OUTPUT);
38342 + return 0;
38343 +}
38344 +
38345 +static int gta02hdq_resume(struct platform_device *pdev)
38346 +{
38347 + s3c2410_gpio_setpin(fiq_ipc.hdq_gpio_pin, 1);
38348 + s3c2410_gpio_cfgpin(fiq_ipc.hdq_gpio_pin, S3C2410_GPIO_OUTPUT);
38349 + return 0;
38350 +}
38351 +#endif
38352 +
38353 +static int __init gta02hdq_probe(struct platform_device *pdev)
38354 +{
38355 + struct resource *r = platform_get_resource(pdev, 0, 0);
38356 +
38357 + if (!machine_is_neo1973_gta02())
38358 + return -EIO;
38359 +
38360 + if (!r)
38361 + return -EINVAL;
38362 +
38363 + platform_set_drvdata(pdev, NULL);
38364 +
38365 + mutex_init(&fiq_ipc.hdq_lock);
38366 +
38367 + /* set our HDQ comms pin from the platform data */
38368 + fiq_ipc.hdq_gpio_pin = r->start;
38369 +
38370 + s3c2410_gpio_setpin(fiq_ipc.hdq_gpio_pin, 1);
38371 + s3c2410_gpio_cfgpin(fiq_ipc.hdq_gpio_pin, S3C2410_GPIO_OUTPUT);
38372 +
38373 + fiq_ipc.hdq_probed = 1; /* we are ready to do stuff now */
38374 +
38375 + return sysfs_create_group(&pdev->dev.kobj, &gta02hdq_attr_group);
38376 +}
38377 +
38378 +static int gta02hdq_remove(struct platform_device *pdev)
38379 +{
38380 + sysfs_remove_group(&pdev->dev.kobj, &gta02hdq_attr_group);
38381 + return 0;
38382 +}
38383 +
38384 +static struct platform_driver gta02hdq_driver = {
38385 + .probe = gta02hdq_probe,
38386 + .remove = gta02hdq_remove,
38387 +#ifdef CONFIG_PM
38388 + .suspend = gta02hdq_suspend,
38389 + .resume = gta02hdq_resume,
38390 +#endif
38391 + .driver = {
38392 + .name = "gta02-hdq",
38393 + },
38394 +};
38395 +
38396 +static int __init gta02hdq_init(void)
38397 +{
38398 + return platform_driver_register(&gta02hdq_driver);
38399 +}
38400 +
38401 +static void __exit gta02hdq_exit(void)
38402 +{
38403 + platform_driver_unregister(&gta02hdq_driver);
38404 +}
38405 +
38406 +module_init(gta02hdq_init);
38407 +module_exit(gta02hdq_exit);
38408 +
38409 +MODULE_AUTHOR("Andy Green <andy@openmoko.com>");
38410 +MODULE_DESCRIPTION("GTA02 HDQ driver");
38411 +MODULE_LICENSE("GPL");
38412 Index: linux-2.6.24.7/drivers/power/Kconfig
38413 ===================================================================
38414 --- linux-2.6.24.7.orig/drivers/power/Kconfig 2008-12-11 22:46:07.000000000 +0100
38415 +++ linux-2.6.24.7/drivers/power/Kconfig 2008-12-11 22:46:49.000000000 +0100
38416 @@ -49,4 +49,24 @@ config BATTERY_OLPC
38417 help
38418 Say Y to enable support for the battery on the OLPC laptop.
38419
38420 +config BATTERY_BQ27000_HDQ
38421 + tristate "BQ27000 HDQ battery monitor driver"
38422 + help
38423 + Say Y to enable support for the battery on the Neo Freerunner
38424 +
38425 +config GTA02_HDQ
38426 + tristate "Neo Freerunner HDQ"
38427 + depends on MACH_NEO1973_GTA02 && FIQ && S3C2440_C_FIQ
38428 + help
38429 + Say Y to enable support for communicating with an HDQ battery
38430 + on the Neo Freerunner. You probably want to select
38431 + at least BATTERY_BQ27000_HDQ as well
38432 +
38433 +config BATTERY_GTA01
38434 + tristate "Neo GTA01 battery"
38435 + depends on MACH_NEO1973_GTA01
38436 + help
38437 + Say Y to enable support for the battery on the Neo GTA01
38438 +
38439 endif # POWER_SUPPLY
38440 +
38441 Index: linux-2.6.24.7/drivers/power/Makefile
38442 ===================================================================
38443 --- linux-2.6.24.7.orig/drivers/power/Makefile 2008-12-11 22:46:07.000000000 +0100
38444 +++ linux-2.6.24.7/drivers/power/Makefile 2008-12-11 22:46:49.000000000 +0100
38445 @@ -20,3 +20,7 @@ obj-$(CONFIG_APM_POWER) += apm_power.o
38446 obj-$(CONFIG_BATTERY_DS2760) += ds2760_battery.o
38447 obj-$(CONFIG_BATTERY_PMU) += pmu_battery.o
38448 obj-$(CONFIG_BATTERY_OLPC) += olpc_battery.o
38449 +obj-$(CONFIG_BATTERY_BQ27000_HDQ) += bq27000_battery.o
38450 +obj-$(CONFIG_BATTERY_GTA01) += gta01_battery.o
38451 +
38452 +obj-$(CONFIG_GTA02_HDQ) += gta02_hdq.o
38453 Index: linux-2.6.24.7/drivers/sdio/function/Kconfig
38454 ===================================================================
38455 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
38456 +++ linux-2.6.24.7/drivers/sdio/function/Kconfig 2008-12-11 22:46:49.000000000 +0100
38457 @@ -0,0 +1,11 @@
38458 +#menu "SDIO function drivers"
38459 +
38460 +config SDIO_AR6000_WLAN
38461 + tristate "ar6000 wireless networking over sdio"
38462 + depends on SDIO
38463 + select WIRELESS_EXT
38464 + default m
38465 + help
38466 + good luck.
38467 +
38468 +#endmenu
38469 \ No newline at end of file
38470 Index: linux-2.6.24.7/drivers/sdio/function/Makefile
38471 ===================================================================
38472 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
38473 +++ linux-2.6.24.7/drivers/sdio/function/Makefile 2008-12-11 22:46:49.000000000 +0100
38474 @@ -0,0 +1 @@
38475 +obj-$(CONFIG_SDIO_AR6000_WLAN) += wlan/
38476 \ No newline at end of file
38477 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ar6000_drv.c
38478 ===================================================================
38479 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
38480 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ar6000_drv.c 2008-12-11 22:46:49.000000000 +0100
38481 @@ -0,0 +1,3078 @@
38482 +/*
38483 + *
38484 + * Copyright (c) 2004-2007 Atheros Communications Inc.
38485 + * All rights reserved.
38486 + *
38487 + *
38488 + * This program is free software; you can redistribute it and/or modify
38489 + * it under the terms of the GNU General Public License version 2 as
38490 + * published by the Free Software Foundation;
38491 + *
38492 + * Software distributed under the License is distributed on an "AS
38493 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
38494 + * implied. See the License for the specific language governing
38495 + * rights and limitations under the License.
38496 + *
38497 + *
38498 + *
38499 + */
38500 +
38501 +/*
38502 + * This driver is a pseudo ethernet driver to access the Atheros AR6000
38503 + * WLAN Device
38504 + */
38505 +static const char athId[] __attribute__ ((unused)) = "$Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/ar6000_drv.c#2 $";
38506 +
38507 +#include "ar6000_drv.h"
38508 +#include "htc.h"
38509 +
38510 +MODULE_LICENSE("GPL and additional rights");
38511 +
38512 +#ifndef REORG_APTC_HEURISTICS
38513 +#undef ADAPTIVE_POWER_THROUGHPUT_CONTROL
38514 +#endif /* REORG_APTC_HEURISTICS */
38515 +
38516 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
38517 +#define APTC_TRAFFIC_SAMPLING_INTERVAL 100 /* msec */
38518 +#define APTC_UPPER_THROUGHPUT_THRESHOLD 3000 /* Kbps */
38519 +#define APTC_LOWER_THROUGHPUT_THRESHOLD 2000 /* Kbps */
38520 +
38521 +typedef struct aptc_traffic_record {
38522 + A_BOOL timerScheduled;
38523 + struct timeval samplingTS;
38524 + unsigned long bytesReceived;
38525 + unsigned long bytesTransmitted;
38526 +} APTC_TRAFFIC_RECORD;
38527 +
38528 +A_TIMER aptcTimer;
38529 +APTC_TRAFFIC_RECORD aptcTR;
38530 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
38531 +
38532 +int bmienable = 0;
38533 +unsigned int bypasswmi = 0;
38534 +unsigned int debuglevel = 0;
38535 +int tspecCompliance = 1;
38536 +unsigned int busspeedlow = 0;
38537 +unsigned int onebitmode = 0;
38538 +unsigned int skipflash = 0;
38539 +unsigned int wmitimeout = 2;
38540 +unsigned int wlanNodeCaching = 1;
38541 +unsigned int enableuartprint = 0;
38542 +unsigned int logWmiRawMsgs = 0;
38543 +unsigned int enabletimerwar = 0;
38544 +unsigned int mbox_yield_limit = 99;
38545 +int reduce_credit_dribble = 1 + HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF;
38546 +int allow_trace_signal = 0;
38547 +#ifdef CONFIG_HOST_TCMD_SUPPORT
38548 +unsigned int testmode =0;
38549 +#endif
38550 +
38551 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
38552 +module_param(bmienable, int, 0644);
38553 +module_param(bypasswmi, int, 0644);
38554 +module_param(debuglevel, int, 0644);
38555 +module_param(tspecCompliance, int, 0644);
38556 +module_param(onebitmode, int, 0644);
38557 +module_param(busspeedlow, int, 0644);
38558 +module_param(skipflash, int, 0644);
38559 +module_param(wmitimeout, int, 0644);
38560 +module_param(wlanNodeCaching, int, 0644);
38561 +module_param(logWmiRawMsgs, int, 0644);
38562 +module_param(enableuartprint, int, 0644);
38563 +module_param(enabletimerwar, int, 0644);
38564 +module_param(mbox_yield_limit, int, 0644);
38565 +module_param(reduce_credit_dribble, int, 0644);
38566 +module_param(allow_trace_signal, int, 0644);
38567 +#ifdef CONFIG_HOST_TCMD_SUPPORT
38568 +module_param(testmode, int, 0644);
38569 +#endif
38570 +#else
38571 +
38572 +#define __user
38573 +/* for linux 2.4 and lower */
38574 +MODULE_PARM(bmienable,"i");
38575 +MODULE_PARM(bypasswmi,"i");
38576 +MODULE_PARM(debuglevel, "i");
38577 +MODULE_PARM(onebitmode,"i");
38578 +MODULE_PARM(busspeedlow, "i");
38579 +MODULE_PARM(skipflash, "i");
38580 +MODULE_PARM(wmitimeout, "i");
38581 +MODULE_PARM(wlanNodeCaching, "i");
38582 +MODULE_PARM(enableuartprint,"i");
38583 +MODULE_PARM(logWmiRawMsgs, "i");
38584 +MODULE_PARM(enabletimerwar,"i");
38585 +MODULE_PARM(mbox_yield_limit,"i");
38586 +MODULE_PARM(reduce_credit_dribble,"i");
38587 +MODULE_PARM(allow_trace_signal,"i");
38588 +#ifdef CONFIG_HOST_TCMD_SUPPORT
38589 +MODULE_PARM(testmode, "i");
38590 +#endif
38591 +#endif
38592 +
38593 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
38594 +/* in 2.6.10 and later this is now a pointer to a uint */
38595 +unsigned int _mboxnum = HTC_MAILBOX_NUM_MAX;
38596 +#define mboxnum &_mboxnum
38597 +#else
38598 +unsigned int mboxnum = HTC_MAILBOX_NUM_MAX;
38599 +#endif
38600 +
38601 +#ifdef DEBUG
38602 +A_UINT32 g_dbg_flags = DBG_DEFAULTS;
38603 +unsigned int debugflags = 0;
38604 +int debugdriver = 1;
38605 +unsigned int debughtc = 128;
38606 +unsigned int debugbmi = 1;
38607 +unsigned int debughif = 2;
38608 +unsigned int resetok = 1;
38609 +unsigned int txcreditsavailable[HTC_MAILBOX_NUM_MAX] = {0};
38610 +unsigned int txcreditsconsumed[HTC_MAILBOX_NUM_MAX] = {0};
38611 +unsigned int txcreditintrenable[HTC_MAILBOX_NUM_MAX] = {0};
38612 +unsigned int txcreditintrenableaggregate[HTC_MAILBOX_NUM_MAX] = {0};
38613 +
38614 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
38615 +module_param(debugflags, int, 0644);
38616 +module_param(debugdriver, int, 0644);
38617 +module_param(debughtc, int, 0644);
38618 +module_param(debugbmi, int, 0644);
38619 +module_param(debughif, int, 0644);
38620 +module_param(resetok, int, 0644);
38621 +module_param_array(txcreditsavailable, int, mboxnum, 0644);
38622 +module_param_array(txcreditsconsumed, int, mboxnum, 0644);
38623 +module_param_array(txcreditintrenable, int, mboxnum, 0644);
38624 +module_param_array(txcreditintrenableaggregate, int, mboxnum, 0644);
38625 +#else
38626 +/* linux 2.4 and lower */
38627 +MODULE_PARM(debugflags,"i");
38628 +MODULE_PARM(debugdriver, "i");
38629 +MODULE_PARM(debughtc, "i");
38630 +MODULE_PARM(debugbmi, "i");
38631 +MODULE_PARM(debughif, "i");
38632 +MODULE_PARM(resetok, "i");
38633 +MODULE_PARM(txcreditsavailable, "0-3i");
38634 +MODULE_PARM(txcreditsconsumed, "0-3i");
38635 +MODULE_PARM(txcreditintrenable, "0-3i");
38636 +MODULE_PARM(txcreditintrenableaggregate, "0-3i");
38637 +#endif
38638 +
38639 +#else
38640 +unsigned int resetok = 1;
38641 +
38642 +#endif /* DEBUG */
38643 +
38644 +unsigned int tx_attempt[HTC_MAILBOX_NUM_MAX] = {0};
38645 +unsigned int tx_post[HTC_MAILBOX_NUM_MAX] = {0};
38646 +unsigned int tx_complete[HTC_MAILBOX_NUM_MAX] = {0};
38647 +unsigned int hifBusRequestNumMax = 40;
38648 +unsigned int war23838_disabled = 0;
38649 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
38650 +unsigned int enableAPTCHeuristics = 1;
38651 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
38652 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
38653 +module_param_array(tx_attempt, int, mboxnum, 0644);
38654 +module_param_array(tx_post, int, mboxnum, 0644);
38655 +module_param_array(tx_complete, int, mboxnum, 0644);
38656 +module_param(hifBusRequestNumMax, int, 0644);
38657 +module_param(war23838_disabled, int, 0644);
38658 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
38659 +module_param(enableAPTCHeuristics, int, 0644);
38660 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
38661 +#else
38662 +MODULE_PARM(tx_attempt, "0-3i");
38663 +MODULE_PARM(tx_post, "0-3i");
38664 +MODULE_PARM(tx_complete, "0-3i");
38665 +MODULE_PARM(hifBusRequestNumMax, "i");
38666 +MODULE_PARM(war23838_disabled, "i");
38667 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
38668 +MODULE_PARM(enableAPTCHeuristics, "i");
38669 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
38670 +#endif
38671 +
38672 +#ifdef BLOCK_TX_PATH_FLAG
38673 +int blocktx = 0;
38674 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
38675 +module_param(blocktx, int, 0644);
38676 +#else
38677 +MODULE_PARM(blocktx, "i");
38678 +#endif
38679 +#endif /* BLOCK_TX_PATH_FLAG */
38680 +
38681 +// TODO move to arsoft_c
38682 +USER_RSSI_THOLD rssi_map[12];
38683 +
38684 +int reconnect_flag = 0;
38685 +
38686 +DECLARE_WAIT_QUEUE_HEAD(ar6000_scan_queue);
38687 +
38688 +/* Function declarations */
38689 +static int ar6000_init_module(void);
38690 +static void ar6000_cleanup_module(void);
38691 +
38692 +int ar6000_init(struct net_device *dev);
38693 +static int ar6000_open(struct net_device *dev);
38694 +static int ar6000_close(struct net_device *dev);
38695 +static void ar6000_init_control_info(AR_SOFTC_T *ar);
38696 +static int ar6000_data_tx(struct sk_buff *skb, struct net_device *dev);
38697 +
38698 +static void ar6000_destroy(struct net_device *dev, unsigned int unregister);
38699 +static void ar6000_detect_error(unsigned long ptr);
38700 +static struct net_device_stats *ar6000_get_stats(struct net_device *dev);
38701 +static struct iw_statistics *ar6000_get_iwstats(struct net_device * dev);
38702 +
38703 +/*
38704 + * HTC service connection handlers
38705 + */
38706 +static void ar6000_avail_ev(HTC_HANDLE HTCHandle);
38707 +
38708 +static void ar6000_unavail_ev(void *Instance);
38709 +
38710 +static void ar6000_target_failure(void *Instance, A_STATUS Status);
38711 +
38712 +static void ar6000_rx(void *Context, HTC_PACKET *pPacket);
38713 +
38714 +static void ar6000_rx_refill(void *Context,HTC_ENDPOINT_ID Endpoint);
38715 +
38716 +static void ar6000_tx_complete(void *Context, HTC_PACKET *pPacket);
38717 +
38718 +static void ar6000_tx_queue_full(void *Context, HTC_ENDPOINT_ID Endpoint);
38719 +
38720 +/*
38721 + * Static variables
38722 + */
38723 +
38724 +static struct net_device *ar6000_devices[MAX_AR6000];
38725 +extern struct iw_handler_def ath_iw_handler_def;
38726 +DECLARE_WAIT_QUEUE_HEAD(arEvent);
38727 +static void ar6000_cookie_init(AR_SOFTC_T *ar);
38728 +static void ar6000_cookie_cleanup(AR_SOFTC_T *ar);
38729 +static void ar6000_free_cookie(AR_SOFTC_T *ar, struct ar_cookie * cookie);
38730 +static struct ar_cookie *ar6000_alloc_cookie(AR_SOFTC_T *ar);
38731 +static void ar6000_TxDataCleanup(AR_SOFTC_T *ar);
38732 +
38733 +#ifdef USER_KEYS
38734 +static A_STATUS ar6000_reinstall_keys(AR_SOFTC_T *ar,A_UINT8 key_op_ctrl);
38735 +#endif
38736 +
38737 +
38738 +static struct ar_cookie s_ar_cookie_mem[MAX_COOKIE_NUM];
38739 +
38740 +#define HOST_INTEREST_ITEM_ADDRESS(ar, item) \
38741 +((ar->arTargetType == TARGET_TYPE_AR6001) ? \
38742 + AR6001_HOST_INTEREST_ITEM_ADDRESS(item) : \
38743 + AR6002_HOST_INTEREST_ITEM_ADDRESS(item))
38744 +
38745 +
38746 +/* Debug log support */
38747 +
38748 +/*
38749 + * Flag to govern whether the debug logs should be parsed in the kernel
38750 + * or reported to the application.
38751 + */
38752 +#ifdef DEBUG
38753 +#define REPORT_DEBUG_LOGS_TO_APP
38754 +#endif
38755 +
38756 +A_STATUS
38757 +ar6000_set_host_app_area(AR_SOFTC_T *ar)
38758 +{
38759 + A_UINT32 address, data;
38760 + struct host_app_area_s host_app_area;
38761 +
38762 + /* Fetch the address of the host_app_area_s instance in the host interest area */
38763 + address = HOST_INTEREST_ITEM_ADDRESS(ar, hi_app_host_interest);
38764 + if (ar6000_ReadRegDiag(ar->arHifDevice, &address, &data) != A_OK) {
38765 + return A_ERROR;
38766 + }
38767 + address = data;
38768 + host_app_area.wmi_protocol_ver = WMI_PROTOCOL_VERSION;
38769 + if (ar6000_WriteDataDiag(ar->arHifDevice, address,
38770 + (A_UCHAR *)&host_app_area,
38771 + sizeof(struct host_app_area_s)) != A_OK)
38772 + {
38773 + return A_ERROR;
38774 + }
38775 +
38776 + return A_OK;
38777 +}
38778 +
38779 +A_UINT32
38780 +dbglog_get_debug_hdr_ptr(AR_SOFTC_T *ar)
38781 +{
38782 + A_UINT32 param;
38783 + A_UINT32 address;
38784 + A_STATUS status;
38785 +
38786 + address = HOST_INTEREST_ITEM_ADDRESS(ar, hi_dbglog_hdr);
38787 + if ((status = ar6000_ReadDataDiag(ar->arHifDevice, address,
38788 + (A_UCHAR *)&param, 4)) != A_OK)
38789 + {
38790 + param = 0;
38791 + }
38792 +
38793 + return param;
38794 +}
38795 +
38796 +/*
38797 + * The dbglog module has been initialized. Its ok to access the relevant
38798 + * data stuctures over the diagnostic window.
38799 + */
38800 +void
38801 +ar6000_dbglog_init_done(AR_SOFTC_T *ar)
38802 +{
38803 + ar->dbglog_init_done = TRUE;
38804 +}
38805 +
38806 +A_UINT32
38807 +dbglog_get_debug_fragment(A_INT8 *datap, A_UINT32 len, A_UINT32 limit)
38808 +{
38809 + A_INT32 *buffer;
38810 + A_UINT32 count;
38811 + A_UINT32 numargs;
38812 + A_UINT32 length;
38813 + A_UINT32 fraglen;
38814 +
38815 + count = fraglen = 0;
38816 + buffer = (A_INT32 *)datap;
38817 + length = (limit >> 2);
38818 +
38819 + if (len <= limit) {
38820 + fraglen = len;
38821 + } else {
38822 + while (count < length) {
38823 + numargs = DBGLOG_GET_NUMARGS(buffer[count]);
38824 + fraglen = (count << 2);
38825 + count += numargs + 1;
38826 + }
38827 + }
38828 +
38829 + return fraglen;
38830 +}
38831 +
38832 +void
38833 +dbglog_parse_debug_logs(A_INT8 *datap, A_UINT32 len)
38834 +{
38835 + A_INT32 *buffer;
38836 + A_UINT32 count;
38837 + A_UINT32 timestamp;
38838 + A_UINT32 debugid;
38839 + A_UINT32 moduleid;
38840 + A_UINT32 numargs;
38841 + A_UINT32 length;
38842 +
38843 + count = 0;
38844 + buffer = (A_INT32 *)datap;
38845 + length = (len >> 2);
38846 + while (count < length) {
38847 + debugid = DBGLOG_GET_DBGID(buffer[count]);
38848 + moduleid = DBGLOG_GET_MODULEID(buffer[count]);
38849 + numargs = DBGLOG_GET_NUMARGS(buffer[count]);
38850 + timestamp = DBGLOG_GET_TIMESTAMP(buffer[count]);
38851 + switch (numargs) {
38852 + case 0:
38853 + AR_DEBUG_PRINTF("%d %d (%d)\n", moduleid, debugid, timestamp);
38854 + break;
38855 +
38856 + case 1:
38857 + AR_DEBUG_PRINTF("%d %d (%d): 0x%x\n", moduleid, debugid,
38858 + timestamp, buffer[count+1]);
38859 + break;
38860 +
38861 + case 2:
38862 + AR_DEBUG_PRINTF("%d %d (%d): 0x%x, 0x%x\n", moduleid, debugid,
38863 + timestamp, buffer[count+1], buffer[count+2]);
38864 + break;
38865 +
38866 + default:
38867 + AR_DEBUG_PRINTF("Invalid args: %d\n", numargs);
38868 + }
38869 + count += numargs + 1;
38870 + }
38871 +}
38872 +
38873 +int
38874 +ar6000_dbglog_get_debug_logs(AR_SOFTC_T *ar)
38875 +{
38876 + struct dbglog_hdr_s debug_hdr;
38877 + struct dbglog_buf_s debug_buf;
38878 + A_UINT32 address;
38879 + A_UINT32 length;
38880 + A_UINT32 dropped;
38881 + A_UINT32 firstbuf;
38882 + A_UINT32 debug_hdr_ptr;
38883 +
38884 + if (!ar->dbglog_init_done) return A_ERROR;
38885 +
38886 +
38887 + AR6000_SPIN_LOCK(&ar->arLock, 0);
38888 +
38889 + if (ar->dbgLogFetchInProgress) {
38890 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
38891 + return A_EBUSY;
38892 + }
38893 +
38894 + /* block out others */
38895 + ar->dbgLogFetchInProgress = TRUE;
38896 +
38897 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
38898 +
38899 + debug_hdr_ptr = dbglog_get_debug_hdr_ptr(ar);
38900 + printk("debug_hdr_ptr: 0x%x\n", debug_hdr_ptr);
38901 +
38902 + /* Get the contents of the ring buffer */
38903 + if (debug_hdr_ptr) {
38904 + address = debug_hdr_ptr;
38905 + length = sizeof(struct dbglog_hdr_s);
38906 + ar6000_ReadDataDiag(ar->arHifDevice, address,
38907 + (A_UCHAR *)&debug_hdr, length);
38908 + address = (A_UINT32)debug_hdr.dbuf;
38909 + firstbuf = address;
38910 + dropped = debug_hdr.dropped;
38911 + length = sizeof(struct dbglog_buf_s);
38912 + ar6000_ReadDataDiag(ar->arHifDevice, address,
38913 + (A_UCHAR *)&debug_buf, length);
38914 +
38915 + do {
38916 + address = (A_UINT32)debug_buf.buffer;
38917 + length = debug_buf.length;
38918 + if ((length) && (debug_buf.length <= debug_buf.bufsize)) {
38919 + /* Rewind the index if it is about to overrun the buffer */
38920 + if (ar->log_cnt > (DBGLOG_HOST_LOG_BUFFER_SIZE - length)) {
38921 + ar->log_cnt = 0;
38922 + }
38923 + if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address,
38924 + (A_UCHAR *)&ar->log_buffer[ar->log_cnt], length))
38925 + {
38926 + break;
38927 + }
38928 + ar6000_dbglog_event(ar, dropped, &ar->log_buffer[ar->log_cnt], length);
38929 + ar->log_cnt += length;
38930 + } else {
38931 + AR_DEBUG_PRINTF("Length: %d (Total size: %d)\n",
38932 + debug_buf.length, debug_buf.bufsize);
38933 + }
38934 +
38935 + address = (A_UINT32)debug_buf.next;
38936 + length = sizeof(struct dbglog_buf_s);
38937 + if(A_OK != ar6000_ReadDataDiag(ar->arHifDevice, address,
38938 + (A_UCHAR *)&debug_buf, length))
38939 + {
38940 + break;
38941 + }
38942 +
38943 + } while (address != firstbuf);
38944 + }
38945 +
38946 + ar->dbgLogFetchInProgress = FALSE;
38947 +
38948 + return A_OK;
38949 +}
38950 +
38951 +void
38952 +ar6000_dbglog_event(AR_SOFTC_T *ar, A_UINT32 dropped,
38953 + A_INT8 *buffer, A_UINT32 length)
38954 +{
38955 +#ifdef REPORT_DEBUG_LOGS_TO_APP
38956 + #define MAX_WIRELESS_EVENT_SIZE 252
38957 + /*
38958 + * Break it up into chunks of MAX_WIRELESS_EVENT_SIZE bytes of messages.
38959 + * There seems to be a limitation on the length of message that could be
38960 + * transmitted to the user app via this mechanism.
38961 + */
38962 + A_UINT32 send, sent;
38963 +
38964 + sent = 0;
38965 + send = dbglog_get_debug_fragment(&buffer[sent], length - sent,
38966 + MAX_WIRELESS_EVENT_SIZE);
38967 + while (send) {
38968 + ar6000_send_event_to_app(ar, WMIX_DBGLOG_EVENTID, &buffer[sent], send);
38969 + sent += send;
38970 + send = dbglog_get_debug_fragment(&buffer[sent], length - sent,
38971 + MAX_WIRELESS_EVENT_SIZE);
38972 + }
38973 +#else
38974 + AR_DEBUG_PRINTF("Dropped logs: 0x%x\nDebug info length: %d\n",
38975 + dropped, length);
38976 +
38977 + /* Interpret the debug logs */
38978 + dbglog_parse_debug_logs(buffer, length);
38979 +#endif /* REPORT_DEBUG_LOGS_TO_APP */
38980 +}
38981 +
38982 +
38983 +
38984 +static int __init
38985 +ar6000_init_module(void)
38986 +{
38987 + static int probed = 0;
38988 + A_STATUS status;
38989 + HTC_INIT_INFO initInfo;
38990 +
38991 + A_MEMZERO(&initInfo,sizeof(initInfo));
38992 + initInfo.AddInstance = ar6000_avail_ev;
38993 + initInfo.DeleteInstance = ar6000_unavail_ev;
38994 + initInfo.TargetFailure = ar6000_target_failure;
38995 +
38996 +
38997 +#ifdef DEBUG
38998 + /* Set the debug flags if specified at load time */
38999 + if(debugflags != 0)
39000 + {
39001 + g_dbg_flags = debugflags;
39002 + }
39003 +#endif
39004 +
39005 + if (probed) {
39006 + return -ENODEV;
39007 + }
39008 + probed++;
39009 +
39010 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
39011 + memset(&aptcTR, 0, sizeof(APTC_TRAFFIC_RECORD));
39012 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
39013 +
39014 +#ifdef CONFIG_HOST_GPIO_SUPPORT
39015 + ar6000_gpio_init();
39016 +#endif /* CONFIG_HOST_GPIO_SUPPORT */
39017 +
39018 + status = HTCInit(&initInfo);
39019 + if(status != A_OK)
39020 + return -ENODEV;
39021 +
39022 + return 0;
39023 +}
39024 +
39025 +static void __exit
39026 +ar6000_cleanup_module(void)
39027 +{
39028 + int i = 0;
39029 + struct net_device *ar6000_netdev;
39030 +
39031 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
39032 + /* Delete the Adaptive Power Control timer */
39033 + if (timer_pending(&aptcTimer)) {
39034 + del_timer_sync(&aptcTimer);
39035 + }
39036 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
39037 +
39038 + for (i=0; i < MAX_AR6000; i++) {
39039 + if (ar6000_devices[i] != NULL) {
39040 + ar6000_netdev = ar6000_devices[i];
39041 + ar6000_devices[i] = NULL;
39042 + ar6000_destroy(ar6000_netdev, 1);
39043 + }
39044 + }
39045 +
39046 + /* shutting down HTC will cause the HIF layer to detach from the
39047 + * underlying bus driver which will cause the subsequent deletion of
39048 + * all HIF and HTC instances */
39049 + HTCShutDown();
39050 +
39051 + AR_DEBUG_PRINTF("ar6000_cleanup: success\n");
39052 +}
39053 +
39054 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
39055 +void
39056 +aptcTimerHandler(unsigned long arg)
39057 +{
39058 + A_UINT32 numbytes;
39059 + A_UINT32 throughput;
39060 + AR_SOFTC_T *ar;
39061 + A_STATUS status;
39062 +
39063 + ar = (AR_SOFTC_T *)arg;
39064 + A_ASSERT(ar != NULL);
39065 + A_ASSERT(!timer_pending(&aptcTimer));
39066 +
39067 + AR6000_SPIN_LOCK(&ar->arLock, 0);
39068 +
39069 + /* Get the number of bytes transferred */
39070 + numbytes = aptcTR.bytesTransmitted + aptcTR.bytesReceived;
39071 + aptcTR.bytesTransmitted = aptcTR.bytesReceived = 0;
39072 +
39073 + /* Calculate and decide based on throughput thresholds */
39074 + throughput = ((numbytes * 8)/APTC_TRAFFIC_SAMPLING_INTERVAL); /* Kbps */
39075 + if (throughput < APTC_LOWER_THROUGHPUT_THRESHOLD) {
39076 + /* Enable Sleep and delete the timer */
39077 + A_ASSERT(ar->arWmiReady == TRUE);
39078 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
39079 + status = wmi_powermode_cmd(ar->arWmi, REC_POWER);
39080 + AR6000_SPIN_LOCK(&ar->arLock, 0);
39081 + A_ASSERT(status == A_OK);
39082 + aptcTR.timerScheduled = FALSE;
39083 + } else {
39084 + A_TIMEOUT_MS(&aptcTimer, APTC_TRAFFIC_SAMPLING_INTERVAL, 0);
39085 + }
39086 +
39087 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
39088 +}
39089 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
39090 +
39091 +
39092 +
39093 +/* set HTC block size, assume BMI is already initialized */
39094 +A_STATUS ar6000_SetHTCBlockSize(AR_SOFTC_T *ar)
39095 +{
39096 + A_STATUS status;
39097 + A_UINT32 blocksizes[HTC_MAILBOX_NUM_MAX];
39098 +
39099 + do {
39100 + /* get the block sizes */
39101 + status = HIFConfigureDevice(ar->arHifDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
39102 + blocksizes, sizeof(blocksizes));
39103 +
39104 + if (A_FAILED(status)) {
39105 + AR_DEBUG_PRINTF("Failed to get block size info from HIF layer...\n");
39106 + break;
39107 + }
39108 + /* note: we actually get the block size for mailbox 1, for SDIO the block
39109 + * size on mailbox 0 is artificially set to 1 */
39110 + /* must be a power of 2 */
39111 + A_ASSERT((blocksizes[1] & (blocksizes[1] - 1)) == 0);
39112 +
39113 + /* set the host interest area for the block size */
39114 + status = BMIWriteMemory(ar->arHifDevice,
39115 + HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_io_block_sz),
39116 + (A_UCHAR *)&blocksizes[1],
39117 + 4);
39118 +
39119 + if (A_FAILED(status)) {
39120 + AR_DEBUG_PRINTF("BMIWriteMemory for IO block size failed \n");
39121 + break;
39122 + }
39123 +
39124 + AR_DEBUG_PRINTF("Block Size Set: %d (target address:0x%X)\n",
39125 + blocksizes[1], HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_io_block_sz));
39126 +
39127 + /* set the host interest area for the mbox ISR yield limit */
39128 + status = BMIWriteMemory(ar->arHifDevice,
39129 + HOST_INTEREST_ITEM_ADDRESS(ar, hi_mbox_isr_yield_limit),
39130 + (A_UCHAR *)&mbox_yield_limit,
39131 + 4);
39132 +
39133 + if (A_FAILED(status)) {
39134 + AR_DEBUG_PRINTF("BMIWriteMemory for yield limit failed \n");
39135 + break;
39136 + }
39137 +
39138 + } while (FALSE);
39139 +
39140 + return status;
39141 +}
39142 +
39143 +/*
39144 + * HTC Event handlers
39145 + */
39146 +static void
39147 +ar6000_avail_ev(HTC_HANDLE HTCHandle)
39148 +{
39149 + int i;
39150 + struct net_device *dev;
39151 + AR_SOFTC_T *ar;
39152 + int device_index = 0;
39153 +
39154 + AR_DEBUG_PRINTF("ar6000_available\n");
39155 +
39156 + for (i=0; i < MAX_AR6000; i++) {
39157 + if (ar6000_devices[i] == NULL) {
39158 + break;
39159 + }
39160 + }
39161 +
39162 + if (i == MAX_AR6000) {
39163 + AR_DEBUG_PRINTF("ar6000_available: max devices reached\n");
39164 + return;
39165 + }
39166 +
39167 + /* Save this. It gives a bit better readability especially since */
39168 + /* we use another local "i" variable below. */
39169 + device_index = i;
39170 +
39171 + A_ASSERT(HTCHandle != NULL);
39172 +
39173 + dev = alloc_etherdev(sizeof(AR_SOFTC_T));
39174 + if (dev == NULL) {
39175 + AR_DEBUG_PRINTF("ar6000_available: can't alloc etherdev\n");
39176 + return;
39177 + }
39178 +
39179 + ether_setup(dev);
39180 +
39181 + if (dev->priv == NULL) {
39182 + printk(KERN_CRIT "ar6000_available: Could not allocate memory\n");
39183 + return;
39184 + }
39185 +
39186 + A_MEMZERO(dev->priv, sizeof(AR_SOFTC_T));
39187 +
39188 + ar = (AR_SOFTC_T *)dev->priv;
39189 + ar->arNetDev = dev;
39190 + ar->arHtcTarget = HTCHandle;
39191 + ar->arHifDevice = HTCGetHifDevice(HTCHandle);
39192 + ar->arWlanState = WLAN_ENABLED;
39193 + ar->arRadioSwitch = WLAN_ENABLED;
39194 + ar->arDeviceIndex = device_index;
39195 +
39196 + A_INIT_TIMER(&ar->arHBChallengeResp.timer, ar6000_detect_error, dev);
39197 + ar->arHBChallengeResp.seqNum = 0;
39198 + ar->arHBChallengeResp.outstanding = FALSE;
39199 + ar->arHBChallengeResp.missCnt = 0;
39200 + ar->arHBChallengeResp.frequency = AR6000_HB_CHALLENGE_RESP_FREQ_DEFAULT;
39201 + ar->arHBChallengeResp.missThres = AR6000_HB_CHALLENGE_RESP_MISS_THRES_DEFAULT;
39202 +
39203 + ar6000_init_control_info(ar);
39204 + init_waitqueue_head(&arEvent);
39205 + sema_init(&ar->arSem, 1);
39206 +
39207 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
39208 + A_INIT_TIMER(&aptcTimer, aptcTimerHandler, ar);
39209 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
39210 +
39211 + /*
39212 + * If requested, perform some magic which requires no cooperation from
39213 + * the Target. It causes the Target to ignore flash and execute to the
39214 + * OS from ROM.
39215 + *
39216 + * This is intended to support recovery from a corrupted flash on Targets
39217 + * that support flash.
39218 + */
39219 + if (skipflash)
39220 + {
39221 + ar6000_reset_device_skipflash(ar->arHifDevice);
39222 + }
39223 +
39224 + BMIInit();
39225 + {
39226 + struct bmi_target_info targ_info;
39227 +
39228 + if (BMIGetTargetInfo(ar->arHifDevice, &targ_info) != A_OK) {
39229 + return;
39230 + }
39231 +
39232 + ar->arVersion.target_ver = targ_info.target_ver;
39233 + ar->arTargetType = targ_info.target_type;
39234 + }
39235 +
39236 + if (enableuartprint) {
39237 + A_UINT32 param;
39238 + param = 1;
39239 + if (BMIWriteMemory(ar->arHifDevice,
39240 + HOST_INTEREST_ITEM_ADDRESS(ar, hi_serial_enable),
39241 + (A_UCHAR *)&param,
39242 + 4)!= A_OK)
39243 + {
39244 + AR_DEBUG_PRINTF("BMIWriteMemory for enableuartprint failed \n");
39245 + return ;
39246 + }
39247 + AR_DEBUG_PRINTF("Serial console prints enabled\n");
39248 + }
39249 +#ifdef CONFIG_HOST_TCMD_SUPPORT
39250 + if(testmode) {
39251 + ar->arTargetMode = AR6000_TCMD_MODE;
39252 + }else {
39253 + ar->arTargetMode = AR6000_WLAN_MODE;
39254 + }
39255 +#endif
39256 + if (enabletimerwar) {
39257 + A_UINT32 param;
39258 +
39259 + if (BMIReadMemory(ar->arHifDevice,
39260 + HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag),
39261 + (A_UCHAR *)&param,
39262 + 4)!= A_OK)
39263 + {
39264 + AR_DEBUG_PRINTF("BMIReadMemory for enabletimerwar failed \n");
39265 + return;
39266 + }
39267 +
39268 + param |= HI_OPTION_TIMER_WAR;
39269 +
39270 + if (BMIWriteMemory(ar->arHifDevice,
39271 + HOST_INTEREST_ITEM_ADDRESS(ar, hi_option_flag),
39272 + (A_UCHAR *)&param,
39273 + 4) != A_OK)
39274 + {
39275 + AR_DEBUG_PRINTF("BMIWriteMemory for enabletimerwar failed \n");
39276 + return;
39277 + }
39278 + AR_DEBUG_PRINTF("Timer WAR enabled\n");
39279 + }
39280 +
39281 +
39282 + /* since BMIInit is called in the driver layer, we have to set the block
39283 + * size here for the target */
39284 +
39285 + if (A_FAILED(ar6000_SetHTCBlockSize(ar))) {
39286 + return;
39287 + }
39288 +
39289 + spin_lock_init(&ar->arLock);
39290 +
39291 + /* Don't install the init function if BMI is requested */
39292 + if(!bmienable)
39293 + {
39294 + dev->init = ar6000_init;
39295 + } else {
39296 + AR_DEBUG_PRINTF(" BMI enabled \n");
39297 + }
39298 +
39299 + dev->open = &ar6000_open;
39300 + dev->stop = &ar6000_close;
39301 + dev->hard_start_xmit = &ar6000_data_tx;
39302 + dev->get_stats = &ar6000_get_stats;
39303 +
39304 + /* dev->tx_timeout = ar6000_tx_timeout; */
39305 + dev->do_ioctl = &ar6000_ioctl;
39306 + dev->watchdog_timeo = AR6000_TX_TIMEOUT;
39307 + ar6000_ioctl_iwsetup(&ath_iw_handler_def);
39308 + dev->wireless_handlers = &ath_iw_handler_def;
39309 + ath_iw_handler_def.get_wireless_stats = ar6000_get_iwstats; /*Displayed via proc fs */
39310 +
39311 + /*
39312 + * We need the OS to provide us with more headroom in order to
39313 + * perform dix to 802.3, WMI header encap, and the HTC header
39314 + */
39315 + dev->hard_header_len = ETH_HLEN + sizeof(ATH_LLC_SNAP_HDR) +
39316 + sizeof(WMI_DATA_HDR) + HTC_HEADER_LEN;
39317 +
39318 + /* This runs the init function */
39319 + SET_NETDEV_DEV(dev, HIFGetOSDevice(ar->arHifDevice));
39320 + if (register_netdev(dev)) {
39321 + AR_DEBUG_PRINTF("ar6000_avail: register_netdev failed\n");
39322 + ar6000_destroy(dev, 0);
39323 + return;
39324 + }
39325 +
39326 + HTCSetInstance(ar->arHtcTarget, ar);
39327 +
39328 + /* We only register the device in the global list if we succeed. */
39329 + /* If the device is in the global list, it will be destroyed */
39330 + /* when the module is unloaded. */
39331 + ar6000_devices[device_index] = dev;
39332 +
39333 + AR_DEBUG_PRINTF("ar6000_avail: name=%s htcTarget=0x%x, dev=0x%x (%d), ar=0x%x\n",
39334 + dev->name, (A_UINT32)HTCHandle, (A_UINT32)dev, device_index,
39335 + (A_UINT32)ar);
39336 +}
39337 +
39338 +static void ar6000_target_failure(void *Instance, A_STATUS Status)
39339 +{
39340 + AR_SOFTC_T *ar = (AR_SOFTC_T *)Instance;
39341 + WMI_TARGET_ERROR_REPORT_EVENT errEvent;
39342 + static A_BOOL sip = FALSE;
39343 +
39344 + if (Status != A_OK) {
39345 + if (timer_pending(&ar->arHBChallengeResp.timer)) {
39346 + A_UNTIMEOUT(&ar->arHBChallengeResp.timer);
39347 + }
39348 +
39349 + /* try dumping target assertion information (if any) */
39350 + ar6000_dump_target_assert_info(ar->arHifDevice,ar->arTargetType);
39351 +
39352 + /*
39353 + * Fetch the logs from the target via the diagnostic
39354 + * window.
39355 + */
39356 + ar6000_dbglog_get_debug_logs(ar);
39357 +
39358 + /* Report the error only once */
39359 + if (!sip) {
39360 + sip = TRUE;
39361 + errEvent.errorVal = WMI_TARGET_COM_ERR |
39362 + WMI_TARGET_FATAL_ERR;
39363 +#ifdef SEND_EVENT_TO_APP
39364 + ar6000_send_event_to_app(ar, WMI_ERROR_REPORT_EVENTID,
39365 + (A_UINT8 *)&errEvent,
39366 + sizeof(WMI_TARGET_ERROR_REPORT_EVENT));
39367 +#endif
39368 + }
39369 + }
39370 +}
39371 +
39372 +static void
39373 +ar6000_unavail_ev(void *Instance)
39374 +{
39375 + AR_SOFTC_T *ar = (AR_SOFTC_T *)Instance;
39376 + /* NULL out it's entry in the global list */
39377 + ar6000_devices[ar->arDeviceIndex] = NULL;
39378 + ar6000_destroy(ar->arNetDev, 1);
39379 +}
39380 +
39381 +/*
39382 + * We need to differentiate between the surprise and planned removal of the
39383 + * device because of the following consideration:
39384 + * - In case of surprise removal, the hcd already frees up the pending
39385 + * for the device and hence there is no need to unregister the function
39386 + * driver inorder to get these requests. For planned removal, the function
39387 + * driver has to explictly unregister itself to have the hcd return all the
39388 + * pending requests before the data structures for the devices are freed up.
39389 + * Note that as per the current implementation, the function driver will
39390 + * end up releasing all the devices since there is no API to selectively
39391 + * release a particular device.
39392 + * - Certain commands issued to the target can be skipped for surprise
39393 + * removal since they will anyway not go through.
39394 + */
39395 +static void
39396 +ar6000_destroy(struct net_device *dev, unsigned int unregister)
39397 +{
39398 + AR_SOFTC_T *ar;
39399 +
39400 + AR_DEBUG_PRINTF("+ar6000_destroy \n");
39401 +
39402 + if((dev == NULL) || ((ar = netdev_priv(dev)) == NULL))
39403 + {
39404 + AR_DEBUG_PRINTF("%s(): Failed to get device structure.\n", __func__);
39405 + return;
39406 + }
39407 +
39408 + /* Stop the transmit queues */
39409 + netif_stop_queue(dev);
39410 +
39411 + /* Disable the target and the interrupts associated with it */
39412 + if (ar->arWmiReady == TRUE)
39413 + {
39414 + if (!bypasswmi)
39415 + {
39416 + if (ar->arConnected == TRUE || ar->arConnectPending == TRUE)
39417 + {
39418 + AR_DEBUG_PRINTF("%s(): Disconnect\n", __func__);
39419 + AR6000_SPIN_LOCK(&ar->arLock, 0);
39420 + ar6000_init_profile_info(ar);
39421 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
39422 + wmi_disconnect_cmd(ar->arWmi);
39423 + }
39424 +
39425 + ar6000_dbglog_get_debug_logs(ar);
39426 + ar->arWmiReady = FALSE;
39427 + ar->arConnected = FALSE;
39428 + ar->arConnectPending = FALSE;
39429 + wmi_shutdown(ar->arWmi);
39430 + ar->arWmiEnabled = FALSE;
39431 + ar->arWmi = NULL;
39432 + ar->arWlanState = WLAN_ENABLED;
39433 +#ifdef USER_KEYS
39434 + ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
39435 + ar->user_key_ctrl = 0;
39436 +#endif
39437 + }
39438 +
39439 + AR_DEBUG_PRINTF("%s(): WMI stopped\n", __func__);
39440 + }
39441 + else
39442 + {
39443 + AR_DEBUG_PRINTF("%s(): WMI not ready 0x%08x 0x%08x\n",
39444 + __func__, (unsigned int) ar, (unsigned int) ar->arWmi);
39445 +
39446 + /* Shut down WMI if we have started it */
39447 + if(ar->arWmiEnabled == TRUE)
39448 + {
39449 + AR_DEBUG_PRINTF("%s(): Shut down WMI\n", __func__);
39450 + wmi_shutdown(ar->arWmi);
39451 + ar->arWmiEnabled = FALSE;
39452 + ar->arWmi = NULL;
39453 + }
39454 + }
39455 +
39456 + /* stop HTC */
39457 + HTCStop(ar->arHtcTarget);
39458 +
39459 + /* set the instance to NULL so we do not get called back on remove incase we
39460 + * we're explicity destroyed by module unload */
39461 + HTCSetInstance(ar->arHtcTarget, NULL);
39462 +
39463 + if (resetok) {
39464 + /* try to reset the device if we can
39465 + * The driver may have been configure NOT to reset the target during
39466 + * a debug session */
39467 + AR_DEBUG_PRINTF(" Attempting to reset target on instance destroy.... \n");
39468 + ar6000_reset_device(ar->arHifDevice, ar->arTargetType);
39469 + } else {
39470 + AR_DEBUG_PRINTF(" Host does not want target reset. \n");
39471 + }
39472 +
39473 + /* Done with cookies */
39474 + ar6000_cookie_cleanup(ar);
39475 +
39476 + /* Cleanup BMI */
39477 + BMIInit();
39478 +
39479 + /* Clear the tx counters */
39480 + memset(tx_attempt, 0, sizeof(tx_attempt));
39481 + memset(tx_post, 0, sizeof(tx_post));
39482 + memset(tx_complete, 0, sizeof(tx_complete));
39483 +
39484 +
39485 + /* Free up the device data structure */
39486 + if (unregister)
39487 + unregister_netdev(dev);
39488 +#ifndef free_netdev
39489 + kfree(dev);
39490 +#else
39491 + free_netdev(dev);
39492 +#endif
39493 +
39494 + AR_DEBUG_PRINTF("-ar6000_destroy \n");
39495 +}
39496 +
39497 +static void ar6000_detect_error(unsigned long ptr)
39498 +{
39499 + struct net_device *dev = (struct net_device *)ptr;
39500 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
39501 + WMI_TARGET_ERROR_REPORT_EVENT errEvent;
39502 +
39503 + AR6000_SPIN_LOCK(&ar->arLock, 0);
39504 +
39505 + if (ar->arHBChallengeResp.outstanding) {
39506 + ar->arHBChallengeResp.missCnt++;
39507 + } else {
39508 + ar->arHBChallengeResp.missCnt = 0;
39509 + }
39510 +
39511 + if (ar->arHBChallengeResp.missCnt > ar->arHBChallengeResp.missThres) {
39512 + /* Send Error Detect event to the application layer and do not reschedule the error detection module timer */
39513 + ar->arHBChallengeResp.missCnt = 0;
39514 + ar->arHBChallengeResp.seqNum = 0;
39515 + errEvent.errorVal = WMI_TARGET_COM_ERR | WMI_TARGET_FATAL_ERR;
39516 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
39517 +#ifdef SEND_EVENT_TO_APP
39518 + ar6000_send_event_to_app(ar, WMI_ERROR_REPORT_EVENTID,
39519 + (A_UINT8 *)&errEvent,
39520 + sizeof(WMI_TARGET_ERROR_REPORT_EVENT));
39521 +#endif
39522 + return;
39523 + }
39524 +
39525 + /* Generate the sequence number for the next challenge */
39526 + ar->arHBChallengeResp.seqNum++;
39527 + ar->arHBChallengeResp.outstanding = TRUE;
39528 +
39529 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
39530 +
39531 + /* Send the challenge on the control channel */
39532 + if (wmi_get_challenge_resp_cmd(ar->arWmi, ar->arHBChallengeResp.seqNum, DRV_HB_CHALLENGE) != A_OK) {
39533 + AR_DEBUG_PRINTF("Unable to send heart beat challenge\n");
39534 + }
39535 +
39536 +
39537 + /* Reschedule the timer for the next challenge */
39538 + A_TIMEOUT_MS(&ar->arHBChallengeResp.timer, ar->arHBChallengeResp.frequency * 1000, 0);
39539 +}
39540 +
39541 +void ar6000_init_profile_info(AR_SOFTC_T *ar)
39542 +{
39543 + ar->arSsidLen = 0;
39544 + A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
39545 + ar->arNetworkType = INFRA_NETWORK;
39546 + ar->arDot11AuthMode = OPEN_AUTH;
39547 + ar->arAuthMode = NONE_AUTH;
39548 + ar->arPairwiseCrypto = NONE_CRYPT;
39549 + ar->arPairwiseCryptoLen = 0;
39550 + ar->arGroupCrypto = NONE_CRYPT;
39551 + ar->arGroupCryptoLen = 0;
39552 + A_MEMZERO(ar->arWepKeyList, sizeof(ar->arWepKeyList));
39553 + A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
39554 + A_MEMZERO(ar->arBssid, sizeof(ar->arBssid));
39555 + ar->arBssChannel = 0;
39556 +}
39557 +
39558 +static void
39559 +ar6000_init_control_info(AR_SOFTC_T *ar)
39560 +{
39561 + ar->arWmiEnabled = FALSE;
39562 + ar6000_init_profile_info(ar);
39563 + ar->arDefTxKeyIndex = 0;
39564 + A_MEMZERO(ar->arWepKeyList, sizeof(ar->arWepKeyList));
39565 + ar->arChannelHint = 0;
39566 + ar->arListenInterval = MAX_LISTEN_INTERVAL;
39567 + ar->arVersion.host_ver = AR6K_SW_VERSION;
39568 + ar->arRssi = 0;
39569 + ar->arTxPwr = 0;
39570 + ar->arTxPwrSet = FALSE;
39571 + ar->arSkipScan = 0;
39572 + ar->arBeaconInterval = 0;
39573 + ar->arBitRate = 0;
39574 + ar->arMaxRetries = 0;
39575 + ar->arWmmEnabled = TRUE;
39576 +}
39577 +
39578 +static int
39579 +ar6000_open(struct net_device *dev)
39580 +{
39581 + /* Wake up the queues */
39582 + netif_wake_queue(dev);
39583 +
39584 + return 0;
39585 +}
39586 +
39587 +static int
39588 +ar6000_close(struct net_device *dev)
39589 +{
39590 + netif_stop_queue(dev);
39591 +
39592 + return 0;
39593 +}
39594 +
39595 +/* connect to a service */
39596 +static A_STATUS ar6000_connectservice(AR_SOFTC_T *ar,
39597 + HTC_SERVICE_CONNECT_REQ *pConnect,
39598 + WMI_PRI_STREAM_ID WmiStreamID,
39599 + char *pDesc)
39600 +{
39601 + A_STATUS status;
39602 + HTC_SERVICE_CONNECT_RESP response;
39603 +
39604 + do {
39605 +
39606 + A_MEMZERO(&response,sizeof(response));
39607 +
39608 + status = HTCConnectService(ar->arHtcTarget,
39609 + pConnect,
39610 + &response);
39611 +
39612 + if (A_FAILED(status)) {
39613 + AR_DEBUG_PRINTF(" Failed to connect to %s service status:%d \n", pDesc, status);
39614 + break;
39615 + }
39616 +
39617 + if (WmiStreamID == WMI_NOT_MAPPED) {
39618 + /* done */
39619 + break;
39620 + }
39621 +
39622 + /* set endpoint mapping for the WMI stream in the driver layer */
39623 + arSetWMIStream2EndpointIDMap(ar,WmiStreamID,response.Endpoint);
39624 +
39625 + } while (FALSE);
39626 +
39627 + return status;
39628 +}
39629 +
39630 +static void ar6000_TxDataCleanup(AR_SOFTC_T *ar)
39631 +{
39632 + /* flush all the data (non-control) streams
39633 + * we only flush packets that are tagged as data, we leave any control packets that
39634 + * were in the TX queues alone */
39635 + HTCFlushEndpoint(ar->arHtcTarget,
39636 + arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI),
39637 + AR6K_DATA_PKT_TAG);
39638 + HTCFlushEndpoint(ar->arHtcTarget,
39639 + arWMIStream2EndpointID(ar,WMI_LOW_PRI),
39640 + AR6K_DATA_PKT_TAG);
39641 + HTCFlushEndpoint(ar->arHtcTarget,
39642 + arWMIStream2EndpointID(ar,WMI_HIGH_PRI),
39643 + AR6K_DATA_PKT_TAG);
39644 + HTCFlushEndpoint(ar->arHtcTarget,
39645 + arWMIStream2EndpointID(ar,WMI_HIGHEST_PRI),
39646 + AR6K_DATA_PKT_TAG);
39647 +}
39648 +
39649 +/* This function does one time initialization for the lifetime of the device */
39650 +int ar6000_init(struct net_device *dev)
39651 +{
39652 + AR_SOFTC_T *ar;
39653 + A_STATUS status;
39654 + A_INT32 timeleft;
39655 +
39656 + if((ar = netdev_priv(dev)) == NULL)
39657 + {
39658 + return(-EIO);
39659 + }
39660 +
39661 + /* Do we need to finish the BMI phase */
39662 + if(BMIDone(ar->arHifDevice) != A_OK)
39663 + {
39664 + return -EIO;
39665 + }
39666 +
39667 + if (!bypasswmi)
39668 + {
39669 +#if 0 /* TBDXXX */
39670 + if (ar->arVersion.host_ver != ar->arVersion.target_ver) {
39671 + A_PRINTF("WARNING: Host version 0x%x does not match Target "
39672 + " version 0x%x!\n",
39673 + ar->arVersion.host_ver, ar->arVersion.target_ver);
39674 + }
39675 +#endif
39676 +
39677 + /* Indicate that WMI is enabled (although not ready yet) */
39678 + ar->arWmiEnabled = TRUE;
39679 + if ((ar->arWmi = wmi_init((void *) ar)) == NULL)
39680 + {
39681 + AR_DEBUG_PRINTF("%s() Failed to initialize WMI.\n", __func__);
39682 + return(-EIO);
39683 + }
39684 +
39685 + AR_DEBUG_PRINTF("%s() Got WMI @ 0x%08x.\n", __func__,
39686 + (unsigned int) ar->arWmi);
39687 + }
39688 +
39689 + do {
39690 + HTC_SERVICE_CONNECT_REQ connect;
39691 +
39692 + /* the reason we have to wait for the target here is that the driver layer
39693 + * has to init BMI in order to set the host block size,
39694 + */
39695 + status = HTCWaitTarget(ar->arHtcTarget);
39696 +
39697 + if (A_FAILED(status)) {
39698 + break;
39699 + }
39700 +
39701 + A_MEMZERO(&connect,sizeof(connect));
39702 + /* meta data is unused for now */
39703 + connect.pMetaData = NULL;
39704 + connect.MetaDataLength = 0;
39705 + /* these fields are the same for all service endpoints */
39706 + connect.EpCallbacks.pContext = ar;
39707 + connect.EpCallbacks.EpTxComplete = ar6000_tx_complete;
39708 + connect.EpCallbacks.EpRecv = ar6000_rx;
39709 + connect.EpCallbacks.EpRecvRefill = ar6000_rx_refill;
39710 + connect.EpCallbacks.EpSendFull = ar6000_tx_queue_full;
39711 + /* set the max queue depth so that our ar6000_tx_queue_full handler gets called.
39712 + * Linux has the peculiarity of not providing flow control between the
39713 + * NIC and the network stack. There is no API to indicate that a TX packet
39714 + * was sent which could provide some back pressure to the network stack.
39715 + * Under linux you would have to wait till the network stack consumed all sk_buffs
39716 + * before any back-flow kicked in. Which isn't very friendly.
39717 + * So we have to manage this ourselves */
39718 + connect.MaxSendQueueDepth = 32;
39719 +
39720 + /* connect to control service */
39721 + connect.ServiceID = WMI_CONTROL_SVC;
39722 + status = ar6000_connectservice(ar,
39723 + &connect,
39724 + WMI_CONTROL_PRI,
39725 + "WMI CONTROL");
39726 + if (A_FAILED(status)) {
39727 + break;
39728 + }
39729 +
39730 + /* for the remaining data services set the connection flag to reduce dribbling,
39731 + * if configured to do so */
39732 + if (reduce_credit_dribble) {
39733 + connect.ConnectionFlags |= HTC_CONNECT_FLAGS_REDUCE_CREDIT_DRIBBLE;
39734 + /* the credit dribble trigger threshold is (reduce_credit_dribble - 1) for a value
39735 + * of 0-3 */
39736 + connect.ConnectionFlags &= ~HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK;
39737 + connect.ConnectionFlags |=
39738 + ((A_UINT16)reduce_credit_dribble - 1) & HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK;
39739 + }
39740 + /* connect to best-effort service */
39741 + connect.ServiceID = WMI_DATA_BE_SVC;
39742 +
39743 + status = ar6000_connectservice(ar,
39744 + &connect,
39745 + WMI_BEST_EFFORT_PRI,
39746 + "WMI DATA BE");
39747 + if (A_FAILED(status)) {
39748 + break;
39749 + }
39750 +
39751 + /* connect to back-ground
39752 + * map this to WMI LOW_PRI */
39753 + connect.ServiceID = WMI_DATA_BK_SVC;
39754 + status = ar6000_connectservice(ar,
39755 + &connect,
39756 + WMI_LOW_PRI,
39757 + "WMI DATA BK");
39758 + if (A_FAILED(status)) {
39759 + break;
39760 + }
39761 +
39762 + /* connect to Video service, map this to
39763 + * to HI PRI */
39764 + connect.ServiceID = WMI_DATA_VI_SVC;
39765 + status = ar6000_connectservice(ar,
39766 + &connect,
39767 + WMI_HIGH_PRI,
39768 + "WMI DATA VI");
39769 + if (A_FAILED(status)) {
39770 + break;
39771 + }
39772 +
39773 + /* connect to VO service, this is currently not
39774 + * mapped to a WMI priority stream due to historical reasons.
39775 + * WMI originally defined 3 priorities over 3 mailboxes
39776 + * We can change this when WMI is reworked so that priorities are not
39777 + * dependent on mailboxes */
39778 + connect.ServiceID = WMI_DATA_VO_SVC;
39779 + status = ar6000_connectservice(ar,
39780 + &connect,
39781 + WMI_HIGHEST_PRI,
39782 + "WMI DATA VO");
39783 + if (A_FAILED(status)) {
39784 + break;
39785 + }
39786 +
39787 + A_ASSERT(arWMIStream2EndpointID(ar,WMI_CONTROL_PRI) != 0);
39788 + A_ASSERT(arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI) != 0);
39789 + A_ASSERT(arWMIStream2EndpointID(ar,WMI_LOW_PRI) != 0);
39790 + A_ASSERT(arWMIStream2EndpointID(ar,WMI_HIGH_PRI) != 0);
39791 + A_ASSERT(arWMIStream2EndpointID(ar,WMI_HIGHEST_PRI) != 0);
39792 + } while (FALSE);
39793 +
39794 + if (A_FAILED(status)) {
39795 + return (-EIO);
39796 + }
39797 +
39798 + /*
39799 + * give our connected endpoints some buffers
39800 + */
39801 + ar6000_rx_refill(ar, arWMIStream2EndpointID(ar,WMI_CONTROL_PRI));
39802 +
39803 + ar6000_rx_refill(ar, arWMIStream2EndpointID(ar,WMI_BEST_EFFORT_PRI));
39804 +
39805 + /*
39806 + * We will post the receive buffers only for SPE testing and so we are
39807 + * making it conditional on the 'bypasswmi' flag.
39808 + */
39809 + if (bypasswmi) {
39810 + ar6000_rx_refill(ar,arWMIStream2EndpointID(ar,WMI_LOW_PRI));
39811 + ar6000_rx_refill(ar,arWMIStream2EndpointID(ar,WMI_HIGH_PRI));
39812 + }
39813 +
39814 + /* setup credit distribution */
39815 + ar6000_setup_credit_dist(ar->arHtcTarget, &ar->arCreditStateInfo);
39816 +
39817 + /* Since cookies are used for HTC transports, they should be */
39818 + /* initialized prior to enabling HTC. */
39819 + ar6000_cookie_init(ar);
39820 +
39821 + /* start HTC */
39822 + status = HTCStart(ar->arHtcTarget);
39823 +
39824 + if (status != A_OK) {
39825 + if (ar->arWmiEnabled == TRUE) {
39826 + wmi_shutdown(ar->arWmi);
39827 + ar->arWmiEnabled = FALSE;
39828 + ar->arWmi = NULL;
39829 + }
39830 + ar6000_cookie_cleanup(ar);
39831 + return -EIO;
39832 + }
39833 +
39834 + if (!bypasswmi) {
39835 + /* Wait for Wmi event to be ready */
39836 + timeleft = wait_event_interruptible_timeout(arEvent,
39837 + (ar->arWmiReady == TRUE), wmitimeout * HZ);
39838 +
39839 + if(!timeleft || signal_pending(current))
39840 + {
39841 + AR_DEBUG_PRINTF("WMI is not ready or wait was interrupted\n");
39842 +#if defined(DWSIM) /* TBDXXX */
39843 + AR_DEBUG_PRINTF(".....but proceed anyway.\n");
39844 +#else
39845 + return -EIO;
39846 +#endif
39847 + }
39848 +
39849 + AR_DEBUG_PRINTF("%s() WMI is ready\n", __func__);
39850 +
39851 + /* Communicate the wmi protocol verision to the target */
39852 + if ((ar6000_set_host_app_area(ar)) != A_OK) {
39853 + AR_DEBUG_PRINTF("Unable to set the host app area\n");
39854 + }
39855 + }
39856 +
39857 + ar->arNumDataEndPts = 1;
39858 +
39859 + return(0);
39860 +}
39861 +
39862 +
39863 +void
39864 +ar6000_bitrate_rx(void *devt, A_INT32 rateKbps)
39865 +{
39866 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
39867 +
39868 + ar->arBitRate = rateKbps;
39869 + wake_up(&arEvent);
39870 +}
39871 +
39872 +void
39873 +ar6000_ratemask_rx(void *devt, A_UINT16 ratemask)
39874 +{
39875 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
39876 +
39877 + ar->arRateMask = ratemask;
39878 + wake_up(&arEvent);
39879 +}
39880 +
39881 +void
39882 +ar6000_txPwr_rx(void *devt, A_UINT8 txPwr)
39883 +{
39884 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
39885 +
39886 + ar->arTxPwr = txPwr;
39887 + wake_up(&arEvent);
39888 +}
39889 +
39890 +
39891 +void
39892 +ar6000_channelList_rx(void *devt, A_INT8 numChan, A_UINT16 *chanList)
39893 +{
39894 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
39895 +
39896 + A_MEMCPY(ar->arChannelList, chanList, numChan * sizeof (A_UINT16));
39897 + ar->arNumChannels = numChan;
39898 +
39899 + wake_up(&arEvent);
39900 +}
39901 +
39902 +A_UINT8
39903 +ar6000_ibss_map_epid(struct sk_buff *skb, struct net_device *dev, A_UINT32 * mapNo)
39904 +{
39905 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
39906 + A_UINT8 *datap;
39907 + ATH_MAC_HDR *macHdr;
39908 + A_UINT32 i, eptMap;
39909 +
39910 + (*mapNo) = 0;
39911 + datap = A_NETBUF_DATA(skb);
39912 + macHdr = (ATH_MAC_HDR *)(datap + sizeof(WMI_DATA_HDR));
39913 + if (IEEE80211_IS_MULTICAST(macHdr->dstMac)) {
39914 + return ENDPOINT_2;
39915 + }
39916 +
39917 + eptMap = -1;
39918 + for (i = 0; i < ar->arNodeNum; i ++) {
39919 + if (IEEE80211_ADDR_EQ(macHdr->dstMac, ar->arNodeMap[i].macAddress)) {
39920 + (*mapNo) = i + 1;
39921 + ar->arNodeMap[i].txPending ++;
39922 + return ar->arNodeMap[i].epId;
39923 + }
39924 +
39925 + if ((eptMap == -1) && !ar->arNodeMap[i].txPending) {
39926 + eptMap = i;
39927 + }
39928 + }
39929 +
39930 + if (eptMap == -1) {
39931 + eptMap = ar->arNodeNum;
39932 + ar->arNodeNum ++;
39933 + A_ASSERT(ar->arNodeNum <= MAX_NODE_NUM);
39934 + }
39935 +
39936 + A_MEMCPY(ar->arNodeMap[eptMap].macAddress, macHdr->dstMac, IEEE80211_ADDR_LEN);
39937 +
39938 + for (i = ENDPOINT_2; i <= ENDPOINT_5; i ++) {
39939 + if (!ar->arTxPending[i]) {
39940 + ar->arNodeMap[eptMap].epId = i;
39941 + break;
39942 + }
39943 + // No free endpoint is available, start redistribution on the inuse endpoints.
39944 + if (i == ENDPOINT_5) {
39945 + ar->arNodeMap[eptMap].epId = ar->arNexEpId;
39946 + ar->arNexEpId ++;
39947 + if (ar->arNexEpId > ENDPOINT_5) {
39948 + ar->arNexEpId = ENDPOINT_2;
39949 + }
39950 + }
39951 + }
39952 +
39953 + (*mapNo) = eptMap + 1;
39954 + ar->arNodeMap[eptMap].txPending ++;
39955 +
39956 + return ar->arNodeMap[eptMap].epId;
39957 +}
39958 +
39959 +#ifdef DEBUG
39960 +static void ar6000_dump_skb(struct sk_buff *skb)
39961 +{
39962 + u_char *ch;
39963 + for (ch = A_NETBUF_DATA(skb);
39964 + (A_UINT32)ch < ((A_UINT32)A_NETBUF_DATA(skb) +
39965 + A_NETBUF_LEN(skb)); ch++)
39966 + {
39967 + AR_DEBUG_PRINTF("%2.2x ", *ch);
39968 + }
39969 + AR_DEBUG_PRINTF("\n");
39970 +}
39971 +#endif
39972 +
39973 +static int
39974 +ar6000_data_tx(struct sk_buff *skb, struct net_device *dev)
39975 +{
39976 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
39977 + WMI_PRI_STREAM_ID streamID = WMI_NOT_MAPPED;
39978 + A_UINT32 mapNo = 0;
39979 + int len;
39980 + struct ar_cookie *cookie;
39981 + A_BOOL checkAdHocPsMapping = FALSE;
39982 +
39983 +#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13)
39984 + skb->list = NULL;
39985 +#endif
39986 +
39987 + AR_DEBUG2_PRINTF("ar6000_data_tx start - skb=0x%x, data=0x%x, len=0x%x\n",
39988 + (A_UINT32)skb, (A_UINT32)A_NETBUF_DATA(skb),
39989 + A_NETBUF_LEN(skb));
39990 +#ifdef CONFIG_HOST_TCMD_SUPPORT
39991 + /* TCMD doesnt support any data, free the buf and return */
39992 + if(ar->arTargetMode == AR6000_TCMD_MODE) {
39993 + A_NETBUF_FREE(skb);
39994 + return 0;
39995 + }
39996 +#endif
39997 + do {
39998 +
39999 + if (ar->arWmiReady == FALSE && bypasswmi == 0) {
40000 + break;
40001 + }
40002 +
40003 +#ifdef BLOCK_TX_PATH_FLAG
40004 + if (blocktx) {
40005 + break;
40006 + }
40007 +#endif /* BLOCK_TX_PATH_FLAG */
40008 +
40009 + if (ar->arWmiEnabled) {
40010 + if (A_NETBUF_HEADROOM(skb) < dev->hard_header_len) {
40011 + struct sk_buff *newbuf;
40012 + /*
40013 + * We really should have gotten enough headroom but sometimes
40014 + * we still get packets with not enough headroom. Copy the packet.
40015 + */
40016 + len = A_NETBUF_LEN(skb);
40017 + newbuf = A_NETBUF_ALLOC(len);
40018 + if (newbuf == NULL) {
40019 + break;
40020 + }
40021 + A_NETBUF_PUT(newbuf, len);
40022 + A_MEMCPY(A_NETBUF_DATA(newbuf), A_NETBUF_DATA(skb), len);
40023 + A_NETBUF_FREE(skb);
40024 + skb = newbuf;
40025 + /* fall through and assemble header */
40026 + }
40027 +
40028 + if (wmi_dix_2_dot3(ar->arWmi, skb) != A_OK) {
40029 + AR_DEBUG_PRINTF("ar6000_data_tx - wmi_dix_2_dot3 failed\n");
40030 + break;
40031 + }
40032 +
40033 + if (wmi_data_hdr_add(ar->arWmi, skb, DATA_MSGTYPE) != A_OK) {
40034 + AR_DEBUG_PRINTF("ar6000_data_tx - wmi_data_hdr_add failed\n");
40035 + break;
40036 + }
40037 +
40038 + if ((ar->arNetworkType == ADHOC_NETWORK) &&
40039 + ar->arIbssPsEnable && ar->arConnected) {
40040 + /* flag to check adhoc mapping once we take the lock below: */
40041 + checkAdHocPsMapping = TRUE;
40042 +
40043 + } else {
40044 + /* get the stream mapping */
40045 + if (ar->arWmmEnabled) {
40046 + streamID = wmi_get_stream_id(ar->arWmi,
40047 + wmi_implicit_create_pstream(ar->arWmi, skb, UPLINK_TRAFFIC, UNDEFINED_PRI));
40048 + } else {
40049 + streamID = WMI_BEST_EFFORT_PRI;
40050 + }
40051 + }
40052 +
40053 + } else {
40054 + struct iphdr *ipHdr;
40055 + /*
40056 + * the endpoint is directly based on the TOS field in the IP
40057 + * header **** only for testing ******
40058 + */
40059 + ipHdr = A_NETBUF_DATA(skb) + sizeof(ATH_MAC_HDR);
40060 + /* here we map the TOS field to an endpoint number, this is for
40061 + * the endpointping test application */
40062 + streamID = IP_TOS_TO_WMI_PRI(ipHdr->tos);
40063 + }
40064 +
40065 + } while (FALSE);
40066 +
40067 + /* did we succeed ? */
40068 + if ((streamID == WMI_NOT_MAPPED) && !checkAdHocPsMapping) {
40069 + /* cleanup and exit */
40070 + A_NETBUF_FREE(skb);
40071 + AR6000_STAT_INC(ar, tx_dropped);
40072 + AR6000_STAT_INC(ar, tx_aborted_errors);
40073 + return 0;
40074 + }
40075 +
40076 + cookie = NULL;
40077 +
40078 + /* take the lock to protect driver data */
40079 + AR6000_SPIN_LOCK(&ar->arLock, 0);
40080 +
40081 + do {
40082 +
40083 + if (checkAdHocPsMapping) {
40084 + streamID = ar6000_ibss_map_epid(skb, dev, &mapNo);
40085 + }
40086 +
40087 + A_ASSERT(streamID != WMI_NOT_MAPPED);
40088 +
40089 + /* validate that the endpoint is connected */
40090 + if (arWMIStream2EndpointID(ar,streamID) == 0) {
40091 + AR_DEBUG_PRINTF("Stream %d is NOT mapped!\n",streamID);
40092 + break;
40093 + }
40094 + /* allocate resource for this packet */
40095 + cookie = ar6000_alloc_cookie(ar);
40096 +
40097 + if (cookie != NULL) {
40098 + /* update counts while the lock is held */
40099 + ar->arTxPending[streamID]++;
40100 + ar->arTotalTxDataPending++;
40101 + }
40102 +
40103 + } while (FALSE);
40104 +
40105 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
40106 +
40107 + if (cookie != NULL) {
40108 + cookie->arc_bp[0] = (A_UINT32)skb;
40109 + cookie->arc_bp[1] = mapNo;
40110 + SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt,
40111 + cookie,
40112 + A_NETBUF_DATA(skb),
40113 + A_NETBUF_LEN(skb),
40114 + arWMIStream2EndpointID(ar,streamID),
40115 + AR6K_DATA_PKT_TAG);
40116 +
40117 +#ifdef DEBUG
40118 + if (debugdriver >= 3) {
40119 + ar6000_dump_skb(skb);
40120 + }
40121 +#endif
40122 + /* HTC interface is asynchronous, if this fails, cleanup will happen in
40123 + * the ar6000_tx_complete callback */
40124 + HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt);
40125 + } else {
40126 + /* no packet to send, cleanup */
40127 + A_NETBUF_FREE(skb);
40128 + AR6000_STAT_INC(ar, tx_dropped);
40129 + AR6000_STAT_INC(ar, tx_aborted_errors);
40130 + }
40131 +
40132 + return 0;
40133 +}
40134 +
40135 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
40136 +static void
40137 +tvsub(register struct timeval *out, register struct timeval *in)
40138 +{
40139 + if((out->tv_usec -= in->tv_usec) < 0) {
40140 + out->tv_sec--;
40141 + out->tv_usec += 1000000;
40142 + }
40143 + out->tv_sec -= in->tv_sec;
40144 +}
40145 +
40146 +void
40147 +applyAPTCHeuristics(AR_SOFTC_T *ar)
40148 +{
40149 + A_UINT32 duration;
40150 + A_UINT32 numbytes;
40151 + A_UINT32 throughput;
40152 + struct timeval ts;
40153 + A_STATUS status;
40154 +
40155 + AR6000_SPIN_LOCK(&ar->arLock, 0);
40156 +
40157 + if ((enableAPTCHeuristics) && (!aptcTR.timerScheduled)) {
40158 + do_gettimeofday(&ts);
40159 + tvsub(&ts, &aptcTR.samplingTS);
40160 + duration = ts.tv_sec * 1000 + ts.tv_usec / 1000; /* ms */
40161 + numbytes = aptcTR.bytesTransmitted + aptcTR.bytesReceived;
40162 +
40163 + if (duration > APTC_TRAFFIC_SAMPLING_INTERVAL) {
40164 + /* Initialize the time stamp and byte count */
40165 + aptcTR.bytesTransmitted = aptcTR.bytesReceived = 0;
40166 + do_gettimeofday(&aptcTR.samplingTS);
40167 +
40168 + /* Calculate and decide based on throughput thresholds */
40169 + throughput = ((numbytes * 8) / duration);
40170 + if (throughput > APTC_UPPER_THROUGHPUT_THRESHOLD) {
40171 + /* Disable Sleep and schedule a timer */
40172 + A_ASSERT(ar->arWmiReady == TRUE);
40173 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
40174 + status = wmi_powermode_cmd(ar->arWmi, MAX_PERF_POWER);
40175 + AR6000_SPIN_LOCK(&ar->arLock, 0);
40176 + A_TIMEOUT_MS(&aptcTimer, APTC_TRAFFIC_SAMPLING_INTERVAL, 0);
40177 + aptcTR.timerScheduled = TRUE;
40178 + }
40179 + }
40180 + }
40181 +
40182 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
40183 +}
40184 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
40185 +
40186 +static void ar6000_tx_queue_full(void *Context, HTC_ENDPOINT_ID Endpoint)
40187 +{
40188 + AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
40189 +
40190 +
40191 + if (Endpoint == arWMIStream2EndpointID(ar,WMI_CONTROL_PRI)) {
40192 + if (!bypasswmi) {
40193 + /* under normal WMI if this is getting full, then something is running rampant
40194 + * the host should not be exhausting the WMI queue with too many commands
40195 + * the only exception to this is during testing using endpointping */
40196 +
40197 + AR6000_SPIN_LOCK(&ar->arLock, 0);
40198 + /* set flag to handle subsequent messages */
40199 + ar->arWMIControlEpFull = TRUE;
40200 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
40201 + AR_DEBUG_PRINTF("WMI Control Endpoint is FULL!!! \n");
40202 + }
40203 + } else {
40204 +
40205 + AR6000_SPIN_LOCK(&ar->arLock, 0);
40206 + ar->arNetQueueStopped = TRUE;
40207 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
40208 + /* one of the data endpoints queues is getting full..need to stop network stack
40209 + * the queue will resume in ar6000_tx_complete() */
40210 + netif_stop_queue(ar->arNetDev);
40211 + }
40212 +
40213 +
40214 +}
40215 +
40216 +
40217 +static void
40218 +ar6000_tx_complete(void *Context, HTC_PACKET *pPacket)
40219 +{
40220 + AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
40221 + void *cookie = (void *)pPacket->pPktContext;
40222 + struct sk_buff *skb = NULL;
40223 + A_UINT32 mapNo = 0;
40224 + A_STATUS status;
40225 + struct ar_cookie * ar_cookie;
40226 + WMI_PRI_STREAM_ID streamID;
40227 + A_BOOL wakeEvent = FALSE;
40228 +
40229 + status = pPacket->Status;
40230 + ar_cookie = (struct ar_cookie *)cookie;
40231 + skb = (struct sk_buff *)ar_cookie->arc_bp[0];
40232 + streamID = arEndpoint2WMIStreamID(ar,pPacket->Endpoint);
40233 + mapNo = ar_cookie->arc_bp[1];
40234 +
40235 + A_ASSERT(skb);
40236 + A_ASSERT(pPacket->pBuffer == A_NETBUF_DATA(skb));
40237 +
40238 + if (A_SUCCESS(status)) {
40239 + A_ASSERT(pPacket->ActualLength == A_NETBUF_LEN(skb));
40240 + }
40241 +
40242 + AR_DEBUG2_PRINTF("ar6000_tx_complete skb=0x%x data=0x%x len=0x%x sid=%d ",
40243 + (A_UINT32)skb, (A_UINT32)pPacket->pBuffer,
40244 + pPacket->ActualLength,
40245 + streamID);
40246 +
40247 + /* lock the driver as we update internal state */
40248 + AR6000_SPIN_LOCK(&ar->arLock, 0);
40249 +
40250 + ar->arTxPending[streamID]--;
40251 +
40252 + if ((streamID != WMI_CONTROL_PRI) || bypasswmi) {
40253 + ar->arTotalTxDataPending--;
40254 + }
40255 +
40256 + if (streamID == WMI_CONTROL_PRI)
40257 + {
40258 + if (ar->arWMIControlEpFull) {
40259 + /* since this packet completed, the WMI EP is no longer full */
40260 + ar->arWMIControlEpFull = FALSE;
40261 + }
40262 +
40263 + if (ar->arTxPending[streamID] == 0) {
40264 + wakeEvent = TRUE;
40265 + }
40266 + }
40267 +
40268 + if (A_FAILED(status)) {
40269 + AR_DEBUG_PRINTF("%s() -TX ERROR, status: 0x%x\n", __func__,
40270 + status);
40271 + AR6000_STAT_INC(ar, tx_errors);
40272 + } else {
40273 + AR_DEBUG2_PRINTF("OK\n");
40274 + AR6000_STAT_INC(ar, tx_packets);
40275 + ar->arNetStats.tx_bytes += A_NETBUF_LEN(skb);
40276 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
40277 + aptcTR.bytesTransmitted += a_netbuf_to_len(skb);
40278 + applyAPTCHeuristics(ar);
40279 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
40280 + }
40281 +
40282 + // TODO this needs to be looked at
40283 + if ((ar->arNetworkType == ADHOC_NETWORK) && ar->arIbssPsEnable
40284 + && (streamID != WMI_CONTROL_PRI) && mapNo)
40285 + {
40286 + mapNo --;
40287 + ar->arNodeMap[mapNo].txPending --;
40288 +
40289 + if (!ar->arNodeMap[mapNo].txPending && (mapNo == (ar->arNodeNum - 1))) {
40290 + A_UINT32 i;
40291 + for (i = ar->arNodeNum; i > 0; i --) {
40292 + if (!ar->arNodeMap[i - 1].txPending) {
40293 + A_MEMZERO(&ar->arNodeMap[i - 1], sizeof(struct ar_node_mapping));
40294 + ar->arNodeNum --;
40295 + } else {
40296 + break;
40297 + }
40298 + }
40299 + }
40300 + }
40301 +
40302 + /* Freeing a cookie should not be contingent on either of */
40303 + /* these flags, just if we have a cookie or not. */
40304 + /* Can we even get here without a cookie? Fix later. */
40305 + if (ar->arWmiReady == TRUE || (bypasswmi))
40306 + {
40307 + ar6000_free_cookie(ar, cookie);
40308 + }
40309 +
40310 + if (ar->arNetQueueStopped) {
40311 + ar->arNetQueueStopped = FALSE;
40312 + }
40313 +
40314 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
40315 +
40316 + /* lock is released, we can freely call other kernel APIs */
40317 +
40318 + /* this indirectly frees the HTC_PACKET */
40319 + A_NETBUF_FREE(skb);
40320 +
40321 + if ((ar->arConnected == TRUE) || (bypasswmi)) {
40322 + if (status != A_ECANCELED) {
40323 + /* don't wake the queue if we are flushing, other wise it will just
40324 + * keep queueing packets, which will keep failing */
40325 + netif_wake_queue(ar->arNetDev);
40326 + }
40327 + }
40328 +
40329 + if (wakeEvent) {
40330 + wake_up(&arEvent);
40331 + }
40332 +
40333 +}
40334 +
40335 +/*
40336 + * Receive event handler. This is called by HTC when a packet is received
40337 + */
40338 +int pktcount;
40339 +static void
40340 +ar6000_rx(void *Context, HTC_PACKET *pPacket)
40341 +{
40342 + AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
40343 + struct sk_buff *skb = (struct sk_buff *)pPacket->pPktContext;
40344 + int minHdrLen;
40345 + A_STATUS status = pPacket->Status;
40346 + WMI_PRI_STREAM_ID streamID = arEndpoint2WMIStreamID(ar,pPacket->Endpoint);
40347 + HTC_ENDPOINT_ID ept = pPacket->Endpoint;
40348 +
40349 + A_ASSERT((status != A_OK) || (pPacket->pBuffer == (A_NETBUF_DATA(skb) + HTC_HEADER_LEN)));
40350 +
40351 + AR_DEBUG2_PRINTF("ar6000_rx ar=0x%x sid=%d, skb=0x%x, data=0x%x, len=0x%x ",
40352 + (A_UINT32)ar, streamID, (A_UINT32)skb, (A_UINT32)pPacket->pBuffer,
40353 + pPacket->ActualLength);
40354 + if (status != A_OK) {
40355 + AR_DEBUG2_PRINTF("ERR\n");
40356 + } else {
40357 + AR_DEBUG2_PRINTF("OK\n");
40358 + }
40359 +
40360 + /* take lock to protect buffer counts
40361 + * and adaptive power throughput state */
40362 + AR6000_SPIN_LOCK(&ar->arLock, 0);
40363 +
40364 + ar->arRxBuffers[streamID]--;
40365 +
40366 + if (A_SUCCESS(status)) {
40367 + AR6000_STAT_INC(ar, rx_packets);
40368 + ar->arNetStats.rx_bytes += pPacket->ActualLength;
40369 +#ifdef ADAPTIVE_POWER_THROUGHPUT_CONTROL
40370 + aptcTR.bytesReceived += a_netbuf_to_len(skb);
40371 + applyAPTCHeuristics(ar);
40372 +#endif /* ADAPTIVE_POWER_THROUGHPUT_CONTROL */
40373 +
40374 + A_NETBUF_PUT(skb, pPacket->ActualLength + HTC_HEADER_LEN);
40375 + A_NETBUF_PULL(skb, HTC_HEADER_LEN);
40376 +
40377 +#ifdef DEBUG
40378 + if (debugdriver >= 2) {
40379 + ar6000_dump_skb(skb);
40380 + }
40381 +#endif /* DEBUG */
40382 + }
40383 +
40384 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
40385 +
40386 + if (status != A_OK) {
40387 + AR6000_STAT_INC(ar, rx_errors);
40388 + A_NETBUF_FREE(skb);
40389 + } else if (ar->arWmiEnabled == TRUE) {
40390 + if (streamID == WMI_CONTROL_PRI) {
40391 + /*
40392 + * this is a wmi control msg
40393 + */
40394 + wmi_control_rx(ar->arWmi, skb);
40395 + } else {
40396 + WMI_DATA_HDR *dhdr = (WMI_DATA_HDR *)A_NETBUF_DATA(skb);
40397 + if (WMI_DATA_HDR_IS_MSG_TYPE(dhdr, CNTL_MSGTYPE)) {
40398 + /*
40399 + * this is a wmi control msg
40400 + */
40401 + /* strip off WMI hdr */
40402 + wmi_data_hdr_remove(ar->arWmi, skb);
40403 + wmi_control_rx(ar->arWmi, skb);
40404 + } else {
40405 + /*
40406 + * this is a wmi data packet
40407 + */
40408 + minHdrLen = sizeof (WMI_DATA_HDR) + sizeof(ATH_MAC_HDR) +
40409 + sizeof(ATH_LLC_SNAP_HDR);
40410 +
40411 + if ((pPacket->ActualLength < minHdrLen) ||
40412 + (pPacket->ActualLength > AR6000_BUFFER_SIZE))
40413 + {
40414 + /*
40415 + * packet is too short or too long
40416 + */
40417 + AR_DEBUG_PRINTF("TOO SHORT or TOO LONG\n");
40418 + AR6000_STAT_INC(ar, rx_errors);
40419 + AR6000_STAT_INC(ar, rx_length_errors);
40420 + A_NETBUF_FREE(skb);
40421 + } else {
40422 + if (ar->arWmmEnabled) {
40423 + wmi_implicit_create_pstream(ar->arWmi, skb,
40424 + DNLINK_TRAFFIC, UNDEFINED_PRI);
40425 + }
40426 +#if 0
40427 + /* Access RSSI values here */
40428 + AR_DEBUG_PRINTF("RSSI %d\n",
40429 + ((WMI_DATA_HDR *) A_NETBUF_DATA(skb))->rssi);
40430 +#endif
40431 + wmi_data_hdr_remove(ar->arWmi, skb);
40432 + wmi_dot3_2_dix(ar->arWmi, skb);
40433 +
40434 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
40435 + /*
40436 + * extra push and memcpy, for eth_type_trans() of 2.4 kernel
40437 + * will pull out hard_header_len bytes of the skb.
40438 + */
40439 + A_NETBUF_PUSH(skb, sizeof(WMI_DATA_HDR) + sizeof(ATH_LLC_SNAP_HDR) + HTC_HEADER_LEN);
40440 + A_MEMCPY(A_NETBUF_DATA(skb), A_NETBUF_DATA(skb) + sizeof(WMI_DATA_HDR) +
40441 + sizeof(ATH_LLC_SNAP_HDR) + HTC_HEADER_LEN, sizeof(ATH_MAC_HDR));
40442 +#endif
40443 + if ((ar->arNetDev->flags & IFF_UP) == IFF_UP)
40444 + {
40445 + skb->dev = ar->arNetDev;
40446 + skb->protocol = eth_type_trans(skb, ar->arNetDev);
40447 + netif_rx(skb);
40448 + }
40449 + else
40450 + {
40451 + A_NETBUF_FREE(skb);
40452 + }
40453 + }
40454 + }
40455 + }
40456 + } else {
40457 + if ((ar->arNetDev->flags & IFF_UP) == IFF_UP)
40458 + {
40459 + skb->dev = ar->arNetDev;
40460 + skb->protocol = eth_type_trans(skb, ar->arNetDev);
40461 + netif_rx(skb);
40462 + }
40463 + else
40464 + {
40465 + A_NETBUF_FREE(skb);
40466 + }
40467 + }
40468 +
40469 + if (status != A_ECANCELED) {
40470 + /*
40471 + * HTC provides A_ECANCELED status when it doesn't want to be refilled
40472 + * (probably due to a shutdown)
40473 + */
40474 + ar6000_rx_refill(Context, ept);
40475 + }
40476 +
40477 +
40478 +}
40479 +
40480 +static void
40481 +ar6000_rx_refill(void *Context, HTC_ENDPOINT_ID Endpoint)
40482 +{
40483 + AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
40484 + void *osBuf;
40485 + int RxBuffers;
40486 + int buffersToRefill;
40487 + HTC_PACKET *pPacket;
40488 + WMI_PRI_STREAM_ID streamId = arEndpoint2WMIStreamID(ar,Endpoint);
40489 +
40490 + buffersToRefill = (int)AR6000_MAX_RX_BUFFERS -
40491 + (int)ar->arRxBuffers[streamId];
40492 +
40493 + if (buffersToRefill <= 0) {
40494 + /* fast return, nothing to fill */
40495 + return;
40496 + }
40497 +
40498 + AR_DEBUG2_PRINTF("ar6000_rx_refill: providing htc with %d buffers at eid=%d\n",
40499 + buffersToRefill, Endpoint);
40500 +
40501 + for (RxBuffers = 0; RxBuffers < buffersToRefill; RxBuffers++) {
40502 + osBuf = A_NETBUF_ALLOC(AR6000_BUFFER_SIZE);
40503 + if (NULL == osBuf) {
40504 + break;
40505 + }
40506 + /* the HTC packet wrapper is at the head of the reserved area
40507 + * in the skb */
40508 + pPacket = (HTC_PACKET *)(A_NETBUF_HEAD(osBuf));
40509 + /* set re-fill info */
40510 + SET_HTC_PACKET_INFO_RX_REFILL(pPacket,osBuf,A_NETBUF_DATA(osBuf),AR6000_BUFFER_SIZE,Endpoint);
40511 + /* add this packet */
40512 + HTCAddReceivePkt(ar->arHtcTarget, pPacket);
40513 + }
40514 +
40515 + /* update count */
40516 + AR6000_SPIN_LOCK(&ar->arLock, 0);
40517 + ar->arRxBuffers[streamId] += RxBuffers;
40518 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
40519 +}
40520 +
40521 +static struct net_device_stats *
40522 +ar6000_get_stats(struct net_device *dev)
40523 +{
40524 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
40525 + return &ar->arNetStats;
40526 +}
40527 +
40528 +static struct iw_statistics *
40529 +ar6000_get_iwstats(struct net_device * dev)
40530 +{
40531 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
40532 + TARGET_STATS *pStats = &ar->arTargetStats;
40533 + struct iw_statistics * pIwStats = &ar->arIwStats;
40534 +
40535 + if ((ar->arWmiReady == FALSE)
40536 + /*
40537 + * The in_atomic function is used to determine if the scheduling is
40538 + * allowed in the current context or not. This was introduced in 2.6
40539 + * From what I have read on the differences between 2.4 and 2.6, the
40540 + * 2.4 kernel did not support preemption and so this check might not
40541 + * be required for 2.4 kernels.
40542 + */
40543 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
40544 + || (in_atomic())
40545 +#endif
40546 + )
40547 + {
40548 + pIwStats->status = 0;
40549 + pIwStats->qual.qual = 0;
40550 + pIwStats->qual.level =0;
40551 + pIwStats->qual.noise = 0;
40552 + pIwStats->discard.code =0;
40553 + pIwStats->discard.retries=0;
40554 + pIwStats->miss.beacon =0;
40555 + return pIwStats;
40556 + }
40557 + if (down_interruptible(&ar->arSem)) {
40558 + pIwStats->status = 0;
40559 + return pIwStats;
40560 + }
40561 +
40562 +
40563 + ar->statsUpdatePending = TRUE;
40564 +
40565 + if(wmi_get_stats_cmd(ar->arWmi) != A_OK) {
40566 + up(&ar->arSem);
40567 + pIwStats->status = 0;
40568 + return pIwStats;
40569 + }
40570 +
40571 + wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
40572 +
40573 + if (signal_pending(current)) {
40574 + AR_DEBUG_PRINTF("ar6000 : WMI get stats timeout \n");
40575 + up(&ar->arSem);
40576 + pIwStats->status = 0;
40577 + return pIwStats;
40578 + }
40579 + pIwStats->status = 1 ;
40580 + pIwStats->qual.qual = pStats->cs_aveBeacon_rssi;
40581 + pIwStats->qual.level =pStats->cs_aveBeacon_rssi + 161; /* noise is -95 dBm */
40582 + pIwStats->qual.noise = pStats->noise_floor_calibation;
40583 + pIwStats->discard.code = pStats->rx_decrypt_err;
40584 + pIwStats->discard.retries = pStats->tx_retry_cnt;
40585 + pIwStats->miss.beacon = pStats->cs_bmiss_cnt;
40586 + up(&ar->arSem);
40587 + return pIwStats;
40588 +}
40589 +
40590 +void
40591 +ar6000_ready_event(void *devt, A_UINT8 *datap, A_UINT8 phyCap)
40592 +{
40593 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
40594 + struct net_device *dev = ar->arNetDev;
40595 +
40596 + ar->arWmiReady = TRUE;
40597 + wake_up(&arEvent);
40598 + A_MEMCPY(dev->dev_addr, datap, AR6000_ETH_ADDR_LEN);
40599 + AR_DEBUG_PRINTF("mac address = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
40600 + dev->dev_addr[0], dev->dev_addr[1],
40601 + dev->dev_addr[2], dev->dev_addr[3],
40602 + dev->dev_addr[4], dev->dev_addr[5]);
40603 +
40604 + ar->arPhyCapability = phyCap;
40605 +}
40606 +
40607 +A_UINT8
40608 +ar6000_iptos_to_userPriority(A_UINT8 *pkt)
40609 +{
40610 + struct iphdr *ipHdr = (struct iphdr *)pkt;
40611 + A_UINT8 userPriority;
40612 +
40613 + /*
40614 + * IP Tos format :
40615 + * (Refer Pg 57 WMM-test-plan-v1.2)
40616 + * IP-TOS - 8bits
40617 + * : DSCP(6-bits) ECN(2-bits)
40618 + * : DSCP - P2 P1 P0 X X X
40619 + * where (P2 P1 P0) form 802.1D
40620 + */
40621 + userPriority = ipHdr->tos >> 5;
40622 + return (userPriority & 0x7);
40623 +}
40624 +
40625 +void
40626 +ar6000_connect_event(AR_SOFTC_T *ar, A_UINT16 channel, A_UINT8 *bssid,
40627 + A_UINT16 listenInterval, A_UINT16 beaconInterval,
40628 + NETWORK_TYPE networkType, A_UINT8 beaconIeLen,
40629 + A_UINT8 assocReqLen, A_UINT8 assocRespLen,
40630 + A_UINT8 *assocInfo)
40631 +{
40632 + union iwreq_data wrqu;
40633 + int i, beacon_ie_pos, assoc_resp_ie_pos, assoc_req_ie_pos;
40634 + static const char *tag1 = "ASSOCINFO(ReqIEs=";
40635 + static const char *tag2 = "ASSOCRESPIE=";
40636 + static const char *beaconIetag = "BEACONIE=";
40637 + char buf[WMI_CONTROL_MSG_MAX_LEN * 2 + sizeof(tag1)];
40638 + char *pos;
40639 + A_UINT8 key_op_ctrl;
40640 +
40641 + A_MEMCPY(ar->arBssid, bssid, sizeof(ar->arBssid));
40642 + ar->arBssChannel = channel;
40643 +
40644 + A_PRINTF("AR6000 connected event on freq %d ", channel);
40645 + A_PRINTF("with bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x "
40646 + " listenInterval=%d, beaconInterval = %d, beaconIeLen = %d assocReqLen=%d"
40647 + " assocRespLen =%d\n",
40648 + bssid[0], bssid[1], bssid[2],
40649 + bssid[3], bssid[4], bssid[5],
40650 + listenInterval, beaconInterval,
40651 + beaconIeLen, assocReqLen, assocRespLen);
40652 + if (networkType & ADHOC_NETWORK) {
40653 + if (networkType & ADHOC_CREATOR) {
40654 + A_PRINTF("Network: Adhoc (Creator)\n");
40655 + } else {
40656 + A_PRINTF("Network: Adhoc (Joiner)\n");
40657 + }
40658 + } else {
40659 + A_PRINTF("Network: Infrastructure\n");
40660 + }
40661 +
40662 + if (beaconIeLen && (sizeof(buf) > (9 + beaconIeLen * 2))) {
40663 + AR_DEBUG_PRINTF("\nBeaconIEs= ");
40664 +
40665 + beacon_ie_pos = 0;
40666 + A_MEMZERO(buf, sizeof(buf));
40667 + sprintf(buf, "%s", beaconIetag);
40668 + pos = buf + 9;
40669 + for (i = beacon_ie_pos; i < beacon_ie_pos + beaconIeLen; i++) {
40670 + AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
40671 + sprintf(pos, "%2.2x", assocInfo[i]);
40672 + pos += 2;
40673 + }
40674 + AR_DEBUG_PRINTF("\n");
40675 +
40676 + A_MEMZERO(&wrqu, sizeof(wrqu));
40677 + wrqu.data.length = strlen(buf);
40678 + wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
40679 + }
40680 +
40681 + if (assocRespLen && (sizeof(buf) > (12 + (assocRespLen * 2))))
40682 + {
40683 + assoc_resp_ie_pos = beaconIeLen + assocReqLen +
40684 + sizeof(A_UINT16) + /* capinfo*/
40685 + sizeof(A_UINT16) + /* status Code */
40686 + sizeof(A_UINT16) ; /* associd */
40687 + A_MEMZERO(buf, sizeof(buf));
40688 + sprintf(buf, "%s", tag2);
40689 + pos = buf + 12;
40690 + AR_DEBUG_PRINTF("\nAssocRespIEs= ");
40691 + /*
40692 + * The Association Response Frame w.o. the WLAN header is delivered to
40693 + * the host, so skip over to the IEs
40694 + */
40695 + for (i = assoc_resp_ie_pos; i < assoc_resp_ie_pos + assocRespLen - 6; i++)
40696 + {
40697 + AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
40698 + sprintf(pos, "%2.2x", assocInfo[i]);
40699 + pos += 2;
40700 + }
40701 + AR_DEBUG_PRINTF("\n");
40702 +
40703 + A_MEMZERO(&wrqu, sizeof(wrqu));
40704 + wrqu.data.length = strlen(buf);
40705 + wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
40706 + }
40707 +
40708 + if (assocReqLen && (sizeof(buf) > (17 + (assocReqLen * 2)))) {
40709 + /*
40710 + * assoc Request includes capability and listen interval. Skip these.
40711 + */
40712 + assoc_req_ie_pos = beaconIeLen +
40713 + sizeof(A_UINT16) + /* capinfo*/
40714 + sizeof(A_UINT16); /* listen interval */
40715 +
40716 + A_MEMZERO(buf, sizeof(buf));
40717 + sprintf(buf, "%s", tag1);
40718 + pos = buf + 17;
40719 + AR_DEBUG_PRINTF("AssocReqIEs= ");
40720 + for (i = assoc_req_ie_pos; i < assoc_req_ie_pos + assocReqLen - 4; i++) {
40721 + AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
40722 + sprintf(pos, "%2.2x", assocInfo[i]);
40723 + pos += 2;;
40724 + }
40725 + AR_DEBUG_PRINTF("\n");
40726 +
40727 + A_MEMZERO(&wrqu, sizeof(wrqu));
40728 + wrqu.data.length = strlen(buf);
40729 + wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
40730 + }
40731 +
40732 +#ifdef USER_KEYS
40733 + if (ar->user_savedkeys_stat == USER_SAVEDKEYS_STAT_RUN &&
40734 + ar->user_saved_keys.keyOk == TRUE)
40735 + {
40736 +
40737 + key_op_ctrl = KEY_OP_VALID_MASK & ~KEY_OP_INIT_TSC;
40738 + if (ar->user_key_ctrl & AR6000_USER_SETKEYS_RSC_UNCHANGED) {
40739 + key_op_ctrl &= ~KEY_OP_INIT_RSC;
40740 + } else {
40741 + key_op_ctrl |= KEY_OP_INIT_RSC;
40742 + }
40743 + ar6000_reinstall_keys(ar, key_op_ctrl);
40744 + }
40745 +#endif /* USER_KEYS */
40746 +
40747 + /* flush data queues */
40748 + ar6000_TxDataCleanup(ar);
40749 +
40750 + netif_wake_queue(ar->arNetDev);
40751 +
40752 + if ((OPEN_AUTH == ar->arDot11AuthMode) &&
40753 + (NONE_AUTH == ar->arAuthMode) &&
40754 + (WEP_CRYPT == ar->arPairwiseCrypto))
40755 + {
40756 + if (!ar->arConnected) {
40757 + ar6000_install_static_wep_keys(ar);
40758 + }
40759 + }
40760 +
40761 + ar->arConnected = TRUE;
40762 + ar->arConnectPending = FALSE;
40763 +
40764 + reconnect_flag = 0;
40765 +
40766 + A_MEMZERO(&wrqu, sizeof(wrqu));
40767 + A_MEMCPY(wrqu.addr.sa_data, bssid, IEEE80211_ADDR_LEN);
40768 + wrqu.addr.sa_family = ARPHRD_ETHER;
40769 + wireless_send_event(ar->arNetDev, SIOCGIWAP, &wrqu, NULL);
40770 + if ((ar->arNetworkType == ADHOC_NETWORK) && ar->arIbssPsEnable) {
40771 + A_MEMZERO(ar->arNodeMap, sizeof(ar->arNodeMap));
40772 + ar->arNodeNum = 0;
40773 + ar->arNexEpId = ENDPOINT_2;
40774 + }
40775 +
40776 +}
40777 +
40778 +void ar6000_set_numdataendpts(AR_SOFTC_T *ar, A_UINT32 num)
40779 +{
40780 + A_ASSERT(num <= (HTC_MAILBOX_NUM_MAX - 1));
40781 + ar->arNumDataEndPts = num;
40782 +}
40783 +
40784 +void
40785 +ar6000_disconnect_event(AR_SOFTC_T *ar, A_UINT8 reason, A_UINT8 *bssid,
40786 + A_UINT8 assocRespLen, A_UINT8 *assocInfo, A_UINT16 protocolReasonStatus)
40787 +{
40788 + A_UINT8 i;
40789 +
40790 + A_PRINTF("AR6000 disconnected");
40791 + if (bssid[0] || bssid[1] || bssid[2] || bssid[3] || bssid[4] || bssid[5]) {
40792 + A_PRINTF(" from %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",
40793 + bssid[0], bssid[1], bssid[2], bssid[3], bssid[4], bssid[5]);
40794 + }
40795 + A_PRINTF("\n");
40796 +
40797 + AR_DEBUG_PRINTF("\nDisconnect Reason is %d", reason);
40798 + AR_DEBUG_PRINTF("\nProtocol Reason/Status Code is %d", protocolReasonStatus);
40799 + AR_DEBUG_PRINTF("\nAssocResp Frame = %s",
40800 + assocRespLen ? " " : "NULL");
40801 + for (i = 0; i < assocRespLen; i++) {
40802 + if (!(i % 0x10)) {
40803 + AR_DEBUG_PRINTF("\n");
40804 + }
40805 + AR_DEBUG_PRINTF("%2.2x ", assocInfo[i]);
40806 + }
40807 + AR_DEBUG_PRINTF("\n");
40808 + /*
40809 + * If the event is due to disconnect cmd from the host, only they the target
40810 + * would stop trying to connect. Under any other condition, target would
40811 + * keep trying to connect.
40812 + *
40813 + */
40814 + if( reason == DISCONNECT_CMD)
40815 + {
40816 + ar->arConnectPending = FALSE;
40817 + } else {
40818 + ar->arConnectPending = TRUE;
40819 + if (((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x11)) ||
40820 + ((reason == ASSOC_FAILED) && (protocolReasonStatus == 0x0) && (reconnect_flag == 1))) {
40821 + ar->arConnected = TRUE;
40822 + return;
40823 + }
40824 + }
40825 + ar->arConnected = FALSE;
40826 +
40827 + if( (reason != CSERV_DISCONNECT) || (reconnect_flag != 1) ) {
40828 + reconnect_flag = 0;
40829 + }
40830 +
40831 +#ifdef USER_KEYS
40832 + if (reason != CSERV_DISCONNECT)
40833 + {
40834 + ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
40835 + ar->user_key_ctrl = 0;
40836 + }
40837 +#endif /* USER_KEYS */
40838 +
40839 + netif_stop_queue(ar->arNetDev);
40840 + A_MEMZERO(ar->arBssid, sizeof(ar->arBssid));
40841 + ar->arBssChannel = 0;
40842 + ar->arBeaconInterval = 0;
40843 +
40844 + ar6000_TxDataCleanup(ar);
40845 +}
40846 +
40847 +void
40848 +ar6000_regDomain_event(AR_SOFTC_T *ar, A_UINT32 regCode)
40849 +{
40850 + A_PRINTF("AR6000 Reg Code = 0x%x\n", regCode);
40851 + ar->arRegCode = regCode;
40852 +}
40853 +
40854 +void
40855 +ar6000_neighborReport_event(AR_SOFTC_T *ar, int numAps, WMI_NEIGHBOR_INFO *info)
40856 +{
40857 + static const char *tag = "PRE-AUTH";
40858 + char buf[128];
40859 + union iwreq_data wrqu;
40860 + int i;
40861 +
40862 + AR_DEBUG_PRINTF("AR6000 Neighbor Report Event\n");
40863 + for (i=0; i < numAps; info++, i++) {
40864 + AR_DEBUG_PRINTF("bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",
40865 + info->bssid[0], info->bssid[1], info->bssid[2],
40866 + info->bssid[3], info->bssid[4], info->bssid[5]);
40867 + if (info->bssFlags & WMI_PREAUTH_CAPABLE_BSS) {
40868 + AR_DEBUG_PRINTF("preauth-cap");
40869 + }
40870 + if (info->bssFlags & WMI_PMKID_VALID_BSS) {
40871 + AR_DEBUG_PRINTF(" pmkid-valid\n");
40872 + continue; /* we skip bss if the pmkid is already valid */
40873 + }
40874 + AR_DEBUG_PRINTF("\n");
40875 + snprintf(buf, sizeof(buf), "%s%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
40876 + tag,
40877 + info->bssid[0], info->bssid[1], info->bssid[2],
40878 + info->bssid[3], info->bssid[4], info->bssid[5],
40879 + i, info->bssFlags);
40880 + A_MEMZERO(&wrqu, sizeof(wrqu));
40881 + wrqu.data.length = strlen(buf);
40882 + wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
40883 + }
40884 +}
40885 +
40886 +void
40887 +ar6000_tkip_micerr_event(AR_SOFTC_T *ar, A_UINT8 keyid, A_BOOL ismcast)
40888 +{
40889 + static const char *tag = "MLME-MICHAELMICFAILURE.indication";
40890 + char buf[128];
40891 + union iwreq_data wrqu;
40892 +
40893 + A_PRINTF("AR6000 TKIP MIC error received for keyid %d %scast\n",
40894 + keyid, ismcast ? "multi": "uni");
40895 + snprintf(buf, sizeof(buf), "%s(keyid=%d %scat)", tag, keyid,
40896 + ismcast ? "multi" : "uni");
40897 + memset(&wrqu, 0, sizeof(wrqu));
40898 + wrqu.data.length = strlen(buf);
40899 + wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
40900 +}
40901 +
40902 +void
40903 +ar6000_scanComplete_event(AR_SOFTC_T *ar, A_STATUS status)
40904 +{
40905 + AR_DEBUG_PRINTF("AR6000 scan complete: %d\n", status);
40906 +
40907 + ar->scan_complete = 1;
40908 + wake_up_interruptible(&ar6000_scan_queue);
40909 +}
40910 +
40911 +void
40912 +ar6000_targetStats_event(AR_SOFTC_T *ar, WMI_TARGET_STATS *pTarget)
40913 +{
40914 + TARGET_STATS *pStats = &ar->arTargetStats;
40915 + A_UINT8 ac;
40916 +
40917 + /*A_PRINTF("AR6000 updating target stats\n");*/
40918 + pStats->tx_packets += pTarget->txrxStats.tx_stats.tx_packets;
40919 + pStats->tx_bytes += pTarget->txrxStats.tx_stats.tx_bytes;
40920 + pStats->tx_unicast_pkts += pTarget->txrxStats.tx_stats.tx_unicast_pkts;
40921 + pStats->tx_unicast_bytes += pTarget->txrxStats.tx_stats.tx_unicast_bytes;
40922 + pStats->tx_multicast_pkts += pTarget->txrxStats.tx_stats.tx_multicast_pkts;
40923 + pStats->tx_multicast_bytes += pTarget->txrxStats.tx_stats.tx_multicast_bytes;
40924 + pStats->tx_broadcast_pkts += pTarget->txrxStats.tx_stats.tx_broadcast_pkts;
40925 + pStats->tx_broadcast_bytes += pTarget->txrxStats.tx_stats.tx_broadcast_bytes;
40926 + pStats->tx_rts_success_cnt += pTarget->txrxStats.tx_stats.tx_rts_success_cnt;
40927 + for(ac = 0; ac < WMM_NUM_AC; ac++)
40928 + pStats->tx_packet_per_ac[ac] += pTarget->txrxStats.tx_stats.tx_packet_per_ac[ac];
40929 + pStats->tx_errors += pTarget->txrxStats.tx_stats.tx_errors;
40930 + pStats->tx_failed_cnt += pTarget->txrxStats.tx_stats.tx_failed_cnt;
40931 + pStats->tx_retry_cnt += pTarget->txrxStats.tx_stats.tx_retry_cnt;
40932 + pStats->tx_rts_fail_cnt += pTarget->txrxStats.tx_stats.tx_rts_fail_cnt;
40933 + pStats->tx_unicast_rate = wmi_get_rate(pTarget->txrxStats.tx_stats.tx_unicast_rate);
40934 +
40935 + pStats->rx_packets += pTarget->txrxStats.rx_stats.rx_packets;
40936 + pStats->rx_bytes += pTarget->txrxStats.rx_stats.rx_bytes;
40937 + pStats->rx_unicast_pkts += pTarget->txrxStats.rx_stats.rx_unicast_pkts;
40938 + pStats->rx_unicast_bytes += pTarget->txrxStats.rx_stats.rx_unicast_bytes;
40939 + pStats->rx_multicast_pkts += pTarget->txrxStats.rx_stats.rx_multicast_pkts;
40940 + pStats->rx_multicast_bytes += pTarget->txrxStats.rx_stats.rx_multicast_bytes;
40941 + pStats->rx_broadcast_pkts += pTarget->txrxStats.rx_stats.rx_broadcast_pkts;
40942 + pStats->rx_broadcast_bytes += pTarget->txrxStats.rx_stats.rx_broadcast_bytes;
40943 + pStats->rx_fragment_pkt += pTarget->txrxStats.rx_stats.rx_fragment_pkt;
40944 + pStats->rx_errors += pTarget->txrxStats.rx_stats.rx_errors;
40945 + pStats->rx_crcerr += pTarget->txrxStats.rx_stats.rx_crcerr;
40946 + pStats->rx_key_cache_miss += pTarget->txrxStats.rx_stats.rx_key_cache_miss;
40947 + pStats->rx_decrypt_err += pTarget->txrxStats.rx_stats.rx_decrypt_err;
40948 + pStats->rx_duplicate_frames += pTarget->txrxStats.rx_stats.rx_duplicate_frames;
40949 + pStats->rx_unicast_rate = wmi_get_rate(pTarget->txrxStats.rx_stats.rx_unicast_rate);
40950 +
40951 +
40952 + pStats->tkip_local_mic_failure
40953 + += pTarget->txrxStats.tkipCcmpStats.tkip_local_mic_failure;
40954 + pStats->tkip_counter_measures_invoked
40955 + += pTarget->txrxStats.tkipCcmpStats.tkip_counter_measures_invoked;
40956 + pStats->tkip_replays += pTarget->txrxStats.tkipCcmpStats.tkip_replays;
40957 + pStats->tkip_format_errors += pTarget->txrxStats.tkipCcmpStats.tkip_format_errors;
40958 + pStats->ccmp_format_errors += pTarget->txrxStats.tkipCcmpStats.ccmp_format_errors;
40959 + pStats->ccmp_replays += pTarget->txrxStats.tkipCcmpStats.ccmp_replays;
40960 +
40961 +
40962 + pStats->power_save_failure_cnt += pTarget->pmStats.power_save_failure_cnt;
40963 + pStats->noise_floor_calibation = pTarget->noise_floor_calibation;
40964 +
40965 + pStats->cs_bmiss_cnt += pTarget->cservStats.cs_bmiss_cnt;
40966 + pStats->cs_lowRssi_cnt += pTarget->cservStats.cs_lowRssi_cnt;
40967 + pStats->cs_connect_cnt += pTarget->cservStats.cs_connect_cnt;
40968 + pStats->cs_disconnect_cnt += pTarget->cservStats.cs_disconnect_cnt;
40969 + pStats->cs_aveBeacon_snr = pTarget->cservStats.cs_aveBeacon_snr;
40970 + pStats->cs_aveBeacon_rssi = pTarget->cservStats.cs_aveBeacon_rssi;
40971 + pStats->cs_lastRoam_msec = pTarget->cservStats.cs_lastRoam_msec;
40972 + pStats->cs_snr = pTarget->cservStats.cs_snr;
40973 + pStats->cs_rssi = pTarget->cservStats.cs_rssi;
40974 +
40975 + pStats->lq_val = pTarget->lqVal;
40976 +
40977 + pStats->wow_num_pkts_dropped += pTarget->wowStats.wow_num_pkts_dropped;
40978 + pStats->wow_num_host_pkt_wakeups += pTarget->wowStats.wow_num_host_pkt_wakeups;
40979 + pStats->wow_num_host_event_wakeups += pTarget->wowStats.wow_num_host_event_wakeups;
40980 + pStats->wow_num_events_discarded += pTarget->wowStats.wow_num_events_discarded;
40981 +
40982 + ar->statsUpdatePending = FALSE;
40983 + wake_up(&arEvent);
40984 +}
40985 +
40986 +void
40987 +ar6000_rssiThreshold_event(AR_SOFTC_T *ar, WMI_RSSI_THRESHOLD_VAL newThreshold, A_INT16 rssi)
40988 +{
40989 + USER_RSSI_THOLD userRssiThold;
40990 +
40991 + userRssiThold.tag = rssi_map[newThreshold].tag;
40992 + userRssiThold.rssi = rssi;
40993 + AR_DEBUG2_PRINTF("rssi Threshold range = %d tag = %d rssi = %d\n", newThreshold, userRssiThold.tag, rssi);
40994 +#ifdef SEND_EVENT_TO_APP
40995 + ar6000_send_event_to_app(ar, WMI_RSSI_THRESHOLD_EVENTID,(A_UINT8 *)&userRssiThold, sizeof(USER_RSSI_THOLD));
40996 +#endif
40997 +}
40998 +
40999 +
41000 +void
41001 +ar6000_hbChallengeResp_event(AR_SOFTC_T *ar, A_UINT32 cookie, A_UINT32 source)
41002 +{
41003 + if (source == APP_HB_CHALLENGE) {
41004 + /* Report it to the app in case it wants a positive acknowledgement */
41005 +#ifdef SEND_EVENT_TO_APP
41006 + ar6000_send_event_to_app(ar, WMIX_HB_CHALLENGE_RESP_EVENTID,
41007 + (A_UINT8 *)&cookie, sizeof(cookie));
41008 +#endif
41009 + } else {
41010 + /* This would ignore the replys that come in after their due time */
41011 + if (cookie == ar->arHBChallengeResp.seqNum) {
41012 + ar->arHBChallengeResp.outstanding = FALSE;
41013 + }
41014 + }
41015 +}
41016 +
41017 +
41018 +void
41019 +ar6000_reportError_event(AR_SOFTC_T *ar, WMI_TARGET_ERROR_VAL errorVal)
41020 +{
41021 + char *errString[] = {
41022 + [WMI_TARGET_PM_ERR_FAIL] "WMI_TARGET_PM_ERR_FAIL",
41023 + [WMI_TARGET_KEY_NOT_FOUND] "WMI_TARGET_KEY_NOT_FOUND",
41024 + [WMI_TARGET_DECRYPTION_ERR] "WMI_TARGET_DECRYPTION_ERR",
41025 + [WMI_TARGET_BMISS] "WMI_TARGET_BMISS",
41026 + [WMI_PSDISABLE_NODE_JOIN] "WMI_PSDISABLE_NODE_JOIN"
41027 + };
41028 +
41029 + A_PRINTF("AR6000 Error on Target. Error = 0x%x\n", errorVal);
41030 +
41031 + /* One error is reported at a time, and errorval is a bitmask */
41032 + if(errorVal & (errorVal - 1))
41033 + return;
41034 +
41035 + A_PRINTF("AR6000 Error type = ");
41036 + switch(errorVal)
41037 + {
41038 + case WMI_TARGET_PM_ERR_FAIL:
41039 + case WMI_TARGET_KEY_NOT_FOUND:
41040 + case WMI_TARGET_DECRYPTION_ERR:
41041 + case WMI_TARGET_BMISS:
41042 + case WMI_PSDISABLE_NODE_JOIN:
41043 + A_PRINTF("%s\n", errString[errorVal]);
41044 + break;
41045 + default:
41046 + A_PRINTF("INVALID\n");
41047 + break;
41048 + }
41049 +
41050 +}
41051 +
41052 +
41053 +void
41054 +ar6000_cac_event(AR_SOFTC_T *ar, A_UINT8 ac, A_UINT8 cacIndication,
41055 + A_UINT8 statusCode, A_UINT8 *tspecSuggestion)
41056 +{
41057 + WMM_TSPEC_IE *tspecIe;
41058 +
41059 + /*
41060 + * This is the TSPEC IE suggestion from AP.
41061 + * Suggestion provided by AP under some error
41062 + * cases, could be helpful for the host app.
41063 + * Check documentation.
41064 + */
41065 + tspecIe = (WMM_TSPEC_IE *)tspecSuggestion;
41066 +
41067 + /*
41068 + * What do we do, if we get TSPEC rejection? One thought
41069 + * that comes to mind is implictly delete the pstream...
41070 + */
41071 + A_PRINTF("AR6000 CAC notification. "
41072 + "AC = %d, cacIndication = 0x%x, statusCode = 0x%x\n",
41073 + ac, cacIndication, statusCode);
41074 +}
41075 +
41076 +#define AR6000_PRINT_BSSID(_pBss) do { \
41077 + A_PRINTF("%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ",\
41078 + (_pBss)[0],(_pBss)[1],(_pBss)[2],(_pBss)[3],\
41079 + (_pBss)[4],(_pBss)[5]); \
41080 +} while(0)
41081 +
41082 +void
41083 +ar6000_roam_tbl_event(AR_SOFTC_T *ar, WMI_TARGET_ROAM_TBL *pTbl)
41084 +{
41085 + A_UINT8 i;
41086 +
41087 + A_PRINTF("ROAM TABLE NO OF ENTRIES is %d ROAM MODE is %d\n",
41088 + pTbl->numEntries, pTbl->roamMode);
41089 + for (i= 0; i < pTbl->numEntries; i++) {
41090 + A_PRINTF("[%d]bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x ", i,
41091 + pTbl->bssRoamInfo[i].bssid[0], pTbl->bssRoamInfo[i].bssid[1],
41092 + pTbl->bssRoamInfo[i].bssid[2],
41093 + pTbl->bssRoamInfo[i].bssid[3],
41094 + pTbl->bssRoamInfo[i].bssid[4],
41095 + pTbl->bssRoamInfo[i].bssid[5]);
41096 + A_PRINTF("RSSI %d RSSIDT %d LAST RSSI %d UTIL %d ROAM_UTIL %d"
41097 + " BIAS %d\n",
41098 + pTbl->bssRoamInfo[i].rssi,
41099 + pTbl->bssRoamInfo[i].rssidt,
41100 + pTbl->bssRoamInfo[i].last_rssi,
41101 + pTbl->bssRoamInfo[i].util,
41102 + pTbl->bssRoamInfo[i].roam_util,
41103 + pTbl->bssRoamInfo[i].bias);
41104 + }
41105 +}
41106 +
41107 +void
41108 +ar6000_wow_list_event(struct ar6_softc *ar, A_UINT8 num_filters, WMI_GET_WOW_LIST_REPLY *wow_reply)
41109 +{
41110 + A_UINT8 i,j;
41111 +
41112 + /*Each event now contains exactly one filter, see bug 26613*/
41113 + A_PRINTF("WOW pattern %d of %d patterns\n", wow_reply->this_filter_num, wow_reply->num_filters);
41114 + A_PRINTF("wow mode = %s host mode = %s\n",
41115 + (wow_reply->wow_mode == 0? "disabled":"enabled"),
41116 + (wow_reply->host_mode == 1 ? "awake":"asleep"));
41117 +
41118 +
41119 + /*If there are no patterns, the reply will only contain generic
41120 + WoW information. Pattern information will exist only if there are
41121 + patterns present. Bug 26716*/
41122 +
41123 + /* If this event contains pattern information, display it*/
41124 + if (wow_reply->this_filter_num) {
41125 + i=0;
41126 + A_PRINTF("id=%d size=%d offset=%d\n",
41127 + wow_reply->wow_filters[i].wow_filter_id,
41128 + wow_reply->wow_filters[i].wow_filter_size,
41129 + wow_reply->wow_filters[i].wow_filter_offset);
41130 + A_PRINTF("wow pattern = ");
41131 + for (j=0; j< wow_reply->wow_filters[i].wow_filter_size; j++) {
41132 + A_PRINTF("%2.2x",wow_reply->wow_filters[i].wow_filter_pattern[j]);
41133 + }
41134 +
41135 + A_PRINTF("\nwow mask = ");
41136 + for (j=0; j< wow_reply->wow_filters[i].wow_filter_size; j++) {
41137 + A_PRINTF("%2.2x",wow_reply->wow_filters[i].wow_filter_mask[j]);
41138 + }
41139 + A_PRINTF("\n");
41140 + }
41141 +}
41142 +
41143 +/*
41144 + * Report the Roaming related data collected on the target
41145 + */
41146 +void
41147 +ar6000_display_roam_time(WMI_TARGET_ROAM_TIME *p)
41148 +{
41149 + A_PRINTF("Disconnect Data : BSSID: ");
41150 + AR6000_PRINT_BSSID(p->disassoc_bssid);
41151 + A_PRINTF(" RSSI %d DISASSOC Time %d NO_TXRX_TIME %d\n",
41152 + p->disassoc_bss_rssi,p->disassoc_time,
41153 + p->no_txrx_time);
41154 + A_PRINTF("Connect Data: BSSID: ");
41155 + AR6000_PRINT_BSSID(p->assoc_bssid);
41156 + A_PRINTF(" RSSI %d ASSOC Time %d TXRX_TIME %d\n",
41157 + p->assoc_bss_rssi,p->assoc_time,
41158 + p->allow_txrx_time);
41159 + A_PRINTF("Last Data Tx Time (b4 Disassoc) %d "\
41160 + "First Data Tx Time (after Assoc) %d\n",
41161 + p->last_data_txrx_time, p->first_data_txrx_time);
41162 +}
41163 +
41164 +void
41165 +ar6000_roam_data_event(AR_SOFTC_T *ar, WMI_TARGET_ROAM_DATA *p)
41166 +{
41167 + switch (p->roamDataType) {
41168 + case ROAM_DATA_TIME:
41169 + ar6000_display_roam_time(&p->u.roamTime);
41170 + break;
41171 + default:
41172 + break;
41173 + }
41174 +}
41175 +
41176 +void
41177 +ar6000_bssInfo_event_rx(AR_SOFTC_T *ar, A_UINT8 *datap, int len)
41178 +{
41179 + struct sk_buff *skb;
41180 + WMI_BSS_INFO_HDR *bih = (WMI_BSS_INFO_HDR *)datap;
41181 +
41182 +
41183 + if (!ar->arMgmtFilter) {
41184 + return;
41185 + }
41186 + if (((ar->arMgmtFilter & IEEE80211_FILTER_TYPE_BEACON) &&
41187 + (bih->frameType != BEACON_FTYPE)) ||
41188 + ((ar->arMgmtFilter & IEEE80211_FILTER_TYPE_PROBE_RESP) &&
41189 + (bih->frameType != PROBERESP_FTYPE)))
41190 + {
41191 + return;
41192 + }
41193 +
41194 + if ((skb = A_NETBUF_ALLOC_RAW(len)) != NULL) {
41195 +
41196 + A_NETBUF_PUT(skb, len);
41197 + A_MEMCPY(A_NETBUF_DATA(skb), datap, len);
41198 + skb->dev = ar->arNetDev;
41199 + printk("MAC RAW...\n");
41200 +// skb->mac.raw = A_NETBUF_DATA(skb);
41201 + skb->ip_summed = CHECKSUM_NONE;
41202 + skb->pkt_type = PACKET_OTHERHOST;
41203 + skb->protocol = __constant_htons(0x0019);
41204 + netif_rx(skb);
41205 + }
41206 +}
41207 +
41208 +A_UINT32 wmiSendCmdNum;
41209 +
41210 +A_STATUS
41211 +ar6000_control_tx(void *devt, void *osbuf, WMI_PRI_STREAM_ID streamID)
41212 +{
41213 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
41214 + A_STATUS status = A_OK;
41215 + struct ar_cookie *cookie = NULL;
41216 + int i;
41217 +
41218 + /* take lock to protect ar6000_alloc_cookie() */
41219 + AR6000_SPIN_LOCK(&ar->arLock, 0);
41220 +
41221 + do {
41222 +
41223 + AR_DEBUG2_PRINTF("ar_contrstatus = ol_tx: skb=0x%x, len=0x%x, sid=%d\n",
41224 + (A_UINT32)osbuf, A_NETBUF_LEN(osbuf), streamID);
41225 +
41226 + if ((streamID == WMI_CONTROL_PRI) && (ar->arWMIControlEpFull)) {
41227 + /* control endpoint is full, don't allocate resources, we
41228 + * are just going to drop this packet */
41229 + cookie = NULL;
41230 + AR_DEBUG_PRINTF(" WMI Control EP full, dropping packet : 0x%X, len:%d \n",
41231 + (A_UINT32)osbuf, A_NETBUF_LEN(osbuf));
41232 + } else {
41233 + cookie = ar6000_alloc_cookie(ar);
41234 + }
41235 +
41236 + if (cookie == NULL) {
41237 + status = A_NO_MEMORY;
41238 + break;
41239 + }
41240 +
41241 + if(logWmiRawMsgs) {
41242 + A_PRINTF("WMI cmd send, msgNo %d :", wmiSendCmdNum);
41243 + for(i = 0; i < a_netbuf_to_len(osbuf); i++)
41244 + A_PRINTF("%x ", ((A_UINT8 *)a_netbuf_to_data(osbuf))[i]);
41245 + A_PRINTF("\n");
41246 + }
41247 +
41248 + wmiSendCmdNum++;
41249 +
41250 + } while (FALSE);
41251 +
41252 + if (cookie != NULL) {
41253 + /* got a structure to send it out on */
41254 + ar->arTxPending[streamID]++;
41255 +
41256 + if (streamID != WMI_CONTROL_PRI) {
41257 + ar->arTotalTxDataPending++;
41258 + }
41259 + }
41260 +
41261 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
41262 +
41263 + if (cookie != NULL) {
41264 + cookie->arc_bp[0] = (A_UINT32)osbuf;
41265 + cookie->arc_bp[1] = 0;
41266 + SET_HTC_PACKET_INFO_TX(&cookie->HtcPkt,
41267 + cookie,
41268 + A_NETBUF_DATA(osbuf),
41269 + A_NETBUF_LEN(osbuf),
41270 + arWMIStream2EndpointID(ar,streamID),
41271 + AR6K_CONTROL_PKT_TAG);
41272 + /* this interface is asynchronous, if there is an error, cleanup will happen in the
41273 + * TX completion callback */
41274 + HTCSendPkt(ar->arHtcTarget, &cookie->HtcPkt);
41275 + status = A_OK;
41276 + }
41277 +
41278 + return status;
41279 +}
41280 +
41281 +/* indicate tx activity or inactivity on a WMI stream */
41282 +void ar6000_indicate_tx_activity(void *devt, A_UINT8 TrafficClass, A_BOOL Active)
41283 +{
41284 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
41285 + WMI_PRI_STREAM_ID streamid;
41286 +
41287 + if (ar->arWmiEnabled) {
41288 + streamid = wmi_get_stream_id(ar->arWmi, TrafficClass);
41289 + } else {
41290 + /* for mbox ping testing, the traffic class is mapped directly as a stream ID,
41291 + * see handling of AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE in ioctl.c */
41292 + streamid = (WMI_PRI_STREAM_ID)TrafficClass;
41293 + }
41294 +
41295 + /* notify HTC, this may cause credit distribution changes */
41296 +
41297 + HTCIndicateActivityChange(ar->arHtcTarget,
41298 + arWMIStream2EndpointID(ar,streamid),
41299 + Active);
41300 +
41301 +}
41302 +
41303 +module_init(ar6000_init_module);
41304 +module_exit(ar6000_cleanup_module);
41305 +
41306 +/* Init cookie queue */
41307 +static void
41308 +ar6000_cookie_init(AR_SOFTC_T *ar)
41309 +{
41310 + A_UINT32 i;
41311 +
41312 + ar->arCookieList = NULL;
41313 + A_MEMZERO(s_ar_cookie_mem, sizeof(s_ar_cookie_mem));
41314 +
41315 + for (i = 0; i < MAX_COOKIE_NUM; i++) {
41316 + ar6000_free_cookie(ar, &s_ar_cookie_mem[i]);
41317 + }
41318 +}
41319 +
41320 +/* cleanup cookie queue */
41321 +static void
41322 +ar6000_cookie_cleanup(AR_SOFTC_T *ar)
41323 +{
41324 + /* It is gone .... */
41325 + ar->arCookieList = NULL;
41326 +}
41327 +
41328 +/* Init cookie queue */
41329 +static void
41330 +ar6000_free_cookie(AR_SOFTC_T *ar, struct ar_cookie * cookie)
41331 +{
41332 + /* Insert first */
41333 + A_ASSERT(ar != NULL);
41334 + A_ASSERT(cookie != NULL);
41335 + cookie->arc_list_next = ar->arCookieList;
41336 + ar->arCookieList = cookie;
41337 +}
41338 +
41339 +/* cleanup cookie queue */
41340 +static struct ar_cookie *
41341 +ar6000_alloc_cookie(AR_SOFTC_T *ar)
41342 +{
41343 + struct ar_cookie *cookie;
41344 +
41345 + cookie = ar->arCookieList;
41346 + if(cookie != NULL)
41347 + {
41348 + ar->arCookieList = cookie->arc_list_next;
41349 + }
41350 +
41351 + return cookie;
41352 +}
41353 +
41354 +#ifdef SEND_EVENT_TO_APP
41355 +/*
41356 + * This function is used to send event which come from taget to
41357 + * the application. The buf which send to application is include
41358 + * the event ID and event content.
41359 + */
41360 +#define EVENT_ID_LEN 2
41361 +void ar6000_send_event_to_app(AR_SOFTC_T *ar, A_UINT16 eventId,
41362 + A_UINT8 *datap, int len)
41363 +{
41364 +
41365 +#if (WIRELESS_EXT >= 15)
41366 +
41367 +/* note: IWEVCUSTOM only exists in wireless extensions after version 15 */
41368 +
41369 + char *buf;
41370 + A_UINT16 size;
41371 + union iwreq_data wrqu;
41372 +
41373 + size = len + EVENT_ID_LEN;
41374 +
41375 + if (size > IW_CUSTOM_MAX) {
41376 + AR_DEBUG_PRINTF("WMI event ID : 0x%4.4X, len = %d too big for IWEVCUSTOM (max=%d) \n",
41377 + eventId, size, IW_CUSTOM_MAX);
41378 + return;
41379 + }
41380 +
41381 + buf = A_MALLOC_NOWAIT(size);
41382 + A_MEMZERO(buf, size);
41383 + A_MEMCPY(buf, &eventId, EVENT_ID_LEN);
41384 + A_MEMCPY(buf+EVENT_ID_LEN, datap, len);
41385 +
41386 + //AR_DEBUG_PRINTF("event ID = %d,len = %d\n",*(A_UINT16*)buf, size);
41387 + A_MEMZERO(&wrqu, sizeof(wrqu));
41388 + wrqu.data.length = size;
41389 + wireless_send_event(ar->arNetDev, IWEVCUSTOM, &wrqu, buf);
41390 +
41391 + A_FREE(buf);
41392 +#endif
41393 +
41394 +
41395 +}
41396 +#endif
41397 +
41398 +
41399 +void
41400 +ar6000_tx_retry_err_event(void *devt)
41401 +{
41402 + AR_DEBUG2_PRINTF("Tx retries reach maximum!\n");
41403 +}
41404 +
41405 +void
41406 +ar6000_snrThresholdEvent_rx(void *devt, WMI_SNR_THRESHOLD_VAL newThreshold, A_UINT8 snr)
41407 +{
41408 + AR_DEBUG2_PRINTF("snr threshold range %d, snr %d\n", newThreshold, snr);
41409 +}
41410 +
41411 +void
41412 +ar6000_lqThresholdEvent_rx(void *devt, WMI_LQ_THRESHOLD_VAL newThreshold, A_UINT8 lq)
41413 +{
41414 + AR_DEBUG2_PRINTF("lq threshold range %d, lq %d\n", newThreshold, lq);
41415 +}
41416 +
41417 +
41418 +
41419 +A_UINT32
41420 +a_copy_to_user(void *to, const void *from, A_UINT32 n)
41421 +{
41422 + return(copy_to_user(to, from, n));
41423 +}
41424 +
41425 +A_UINT32
41426 +a_copy_from_user(void *to, const void *from, A_UINT32 n)
41427 +{
41428 + return(copy_from_user(to, from, n));
41429 +}
41430 +
41431 +
41432 +A_STATUS
41433 +ar6000_get_driver_cfg(struct net_device *dev,
41434 + A_UINT16 cfgParam,
41435 + void *result)
41436 +{
41437 +
41438 + A_STATUS ret = 0;
41439 +
41440 + switch(cfgParam)
41441 + {
41442 + case AR6000_DRIVER_CFG_GET_WLANNODECACHING:
41443 + *((A_UINT32 *)result) = wlanNodeCaching;
41444 + break;
41445 + case AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS:
41446 + *((A_UINT32 *)result) = logWmiRawMsgs;
41447 + break;
41448 + default:
41449 + ret = EINVAL;
41450 + break;
41451 + }
41452 +
41453 + return ret;
41454 +}
41455 +
41456 +void
41457 +ar6000_keepalive_rx(void *devt, A_UINT8 configured)
41458 +{
41459 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
41460 +
41461 + ar->arKeepaliveConfigured = configured;
41462 + wake_up(&arEvent);
41463 +}
41464 +
41465 +void
41466 +ar6000_pmkid_list_event(void *devt, A_UINT8 numPMKID, WMI_PMKID *pmkidList)
41467 +{
41468 + A_UINT8 i, j;
41469 +
41470 + A_PRINTF("Number of Cached PMKIDs is %d\n", numPMKID);
41471 +
41472 + for (i = 0; i < numPMKID; i++) {
41473 + A_PRINTF("\nPMKID %d ", i);
41474 + for (j = 0; j < WMI_PMKID_LEN; j++) {
41475 + A_PRINTF("%2.2x", pmkidList->pmkid[j]);
41476 + }
41477 + pmkidList++;
41478 + }
41479 +}
41480 +
41481 +#ifdef USER_KEYS
41482 +static A_STATUS
41483 +
41484 +ar6000_reinstall_keys(AR_SOFTC_T *ar, A_UINT8 key_op_ctrl)
41485 +{
41486 + A_STATUS status = A_OK;
41487 + struct ieee80211req_key *uik = &ar->user_saved_keys.ucast_ik;
41488 + struct ieee80211req_key *bik = &ar->user_saved_keys.bcast_ik;
41489 + CRYPTO_TYPE keyType = ar->user_saved_keys.keyType;
41490 +
41491 + if (IEEE80211_CIPHER_CCKM_KRK != uik->ik_type) {
41492 + if (NONE_CRYPT == keyType) {
41493 + goto _reinstall_keys_out;
41494 + }
41495 +
41496 + if (uik->ik_keylen) {
41497 + status = wmi_addKey_cmd(ar->arWmi, uik->ik_keyix,
41498 + ar->user_saved_keys.keyType, PAIRWISE_USAGE,
41499 + uik->ik_keylen, (A_UINT8 *)&uik->ik_keyrsc,
41500 + uik->ik_keydata, key_op_ctrl, SYNC_BEFORE_WMIFLAG);
41501 + }
41502 +
41503 + } else {
41504 + status = wmi_add_krk_cmd(ar->arWmi, uik->ik_keydata);
41505 + }
41506 +
41507 + if (IEEE80211_CIPHER_CCKM_KRK != bik->ik_type) {
41508 + if (NONE_CRYPT == keyType) {
41509 + goto _reinstall_keys_out;
41510 + }
41511 +
41512 + if (bik->ik_keylen) {
41513 + status = wmi_addKey_cmd(ar->arWmi, bik->ik_keyix,
41514 + ar->user_saved_keys.keyType, GROUP_USAGE,
41515 + bik->ik_keylen, (A_UINT8 *)&bik->ik_keyrsc,
41516 + bik->ik_keydata, key_op_ctrl, NO_SYNC_WMIFLAG);
41517 + }
41518 + } else {
41519 + status = wmi_add_krk_cmd(ar->arWmi, bik->ik_keydata);
41520 + }
41521 +
41522 +_reinstall_keys_out:
41523 + ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_INIT;
41524 + ar->user_key_ctrl = 0;
41525 +
41526 + return status;
41527 +}
41528 +#endif /* USER_KEYS */
41529 +
41530 +
41531 +void
41532 +ar6000_dset_open_req(
41533 + void *context,
41534 + A_UINT32 id,
41535 + A_UINT32 targHandle,
41536 + A_UINT32 targReplyFn,
41537 + A_UINT32 targReplyArg)
41538 +{
41539 +}
41540 +
41541 +void
41542 +ar6000_dset_close(
41543 + void *context,
41544 + A_UINT32 access_cookie)
41545 +{
41546 + return;
41547 +}
41548 +
41549 +void
41550 +ar6000_dset_data_req(
41551 + void *context,
41552 + A_UINT32 accessCookie,
41553 + A_UINT32 offset,
41554 + A_UINT32 length,
41555 + A_UINT32 targBuf,
41556 + A_UINT32 targReplyFn,
41557 + A_UINT32 targReplyArg)
41558 +{
41559 +}
41560 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ar6000_drv.h
41561 ===================================================================
41562 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
41563 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ar6000_drv.h 2008-12-11 22:46:49.000000000 +0100
41564 @@ -0,0 +1,361 @@
41565 +/*
41566 + *
41567 + * Copyright (c) 2004-2007 Atheros Communications Inc.
41568 + * All rights reserved.
41569 + *
41570 + *
41571 + * This program is free software; you can redistribute it and/or modify
41572 + * it under the terms of the GNU General Public License version 2 as
41573 + * published by the Free Software Foundation;
41574 + *
41575 + * Software distributed under the License is distributed on an "AS
41576 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
41577 + * implied. See the License for the specific language governing
41578 + * rights and limitations under the License.
41579 + *
41580 + *
41581 + *
41582 + */
41583 +
41584 +#ifndef _AR6000_H_
41585 +#define _AR6000_H_
41586 +
41587 +#include <linux/version.h>
41588 +
41589 +
41590 +#include <linux/autoconf.h>
41591 +#include <linux/init.h>
41592 +#include <linux/kernel.h>
41593 +#include <linux/spinlock.h>
41594 +#include <linux/skbuff.h>
41595 +#include <linux/if_ether.h>
41596 +#include <linux/netdevice.h>
41597 +#include <linux/etherdevice.h>
41598 +#include <net/iw_handler.h>
41599 +#include <linux/if_arp.h>
41600 +#include <linux/ip.h>
41601 +#include <asm/semaphore.h>
41602 +#include <linux/wireless.h>
41603 +#include <linux/module.h>
41604 +#include <asm/io.h>
41605 +
41606 +#include <a_config.h>
41607 +#include <athdefs.h>
41608 +#include "a_types.h"
41609 +#include "a_osapi.h"
41610 +#include "htc_api.h"
41611 +#include "wmi.h"
41612 +#include "a_drv.h"
41613 +#include "bmi.h"
41614 +#include <ieee80211.h>
41615 +#include <ieee80211_ioctl.h>
41616 +#include <wlan_api.h>
41617 +#include <wmi_api.h>
41618 +#include "gpio_api.h"
41619 +#include "gpio.h"
41620 +#include <host_version.h>
41621 +#include <linux/rtnetlink.h>
41622 +#include <linux/init.h>
41623 +#include <linux/moduleparam.h>
41624 +#include "AR6Khwreg.h"
41625 +#include "ar6000_api.h"
41626 +#ifdef CONFIG_HOST_TCMD_SUPPORT
41627 +#include <testcmd.h>
41628 +#endif
41629 +
41630 +#include "targaddrs.h"
41631 +#include "dbglog_api.h"
41632 +#include "ar6000_diag.h"
41633 +#include "common_drv.h"
41634 +
41635 +#ifndef __dev_put
41636 +#define __dev_put(dev) dev_put(dev)
41637 +#endif
41638 +
41639 +#ifdef USER_KEYS
41640 +
41641 +#define USER_SAVEDKEYS_STAT_INIT 0
41642 +#define USER_SAVEDKEYS_STAT_RUN 1
41643 +
41644 +// TODO this needs to move into the AR_SOFTC struct
41645 +struct USER_SAVEDKEYS {
41646 + struct ieee80211req_key ucast_ik;
41647 + struct ieee80211req_key bcast_ik;
41648 + CRYPTO_TYPE keyType;
41649 + A_BOOL keyOk;
41650 +};
41651 +#endif
41652 +
41653 +#define DBG_INFO 0x00000001
41654 +#define DBG_ERROR 0x00000002
41655 +#define DBG_WARNING 0x00000004
41656 +#define DBG_SDIO 0x00000008
41657 +#define DBG_HIF 0x00000010
41658 +#define DBG_HTC 0x00000020
41659 +#define DBG_WMI 0x00000040
41660 +#define DBG_WMI2 0x00000080
41661 +#define DBG_DRIVER 0x00000100
41662 +
41663 +#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
41664 +
41665 +
41666 +#ifdef DEBUG
41667 +#define AR_DEBUG_PRINTF(args...) if (debugdriver) A_PRINTF(args);
41668 +#define AR_DEBUG2_PRINTF(args...) if (debugdriver >= 2) A_PRINTF(args);
41669 +extern int debugdriver;
41670 +#else
41671 +#define AR_DEBUG_PRINTF(args...)
41672 +#define AR_DEBUG2_PRINTF(args...)
41673 +#endif
41674 +
41675 +A_STATUS ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
41676 +A_STATUS ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
41677 +
41678 +#ifdef __cplusplus
41679 +extern "C" {
41680 +#endif
41681 +
41682 +#define MAX_AR6000 1
41683 +#define AR6000_MAX_RX_BUFFERS 16
41684 +#define AR6000_BUFFER_SIZE 1664
41685 +#define AR6000_TX_TIMEOUT 10
41686 +#define AR6000_ETH_ADDR_LEN 6
41687 +#define AR6000_MAX_ENDPOINTS 4
41688 +#define MAX_NODE_NUM 15
41689 +#define MAX_COOKIE_NUM 150
41690 +#define AR6000_HB_CHALLENGE_RESP_FREQ_DEFAULT 1
41691 +#define AR6000_HB_CHALLENGE_RESP_MISS_THRES_DEFAULT 1
41692 +
41693 +enum {
41694 + DRV_HB_CHALLENGE = 0,
41695 + APP_HB_CHALLENGE
41696 +};
41697 +
41698 +/* HTC RAW streams */
41699 +typedef enum _HTC_RAW_STREAM_ID {
41700 + HTC_RAW_STREAM_NOT_MAPPED = -1,
41701 + HTC_RAW_STREAM_0 = 0,
41702 + HTC_RAW_STREAM_1 = 1,
41703 + HTC_RAW_STREAM_2 = 2,
41704 + HTC_RAW_STREAM_3 = 3,
41705 + HTC_RAW_STREAM_NUM_MAX
41706 +} HTC_RAW_STREAM_ID;
41707 +
41708 +#define RAW_HTC_READ_BUFFERS_NUM 4
41709 +#define RAW_HTC_WRITE_BUFFERS_NUM 4
41710 +
41711 +typedef struct {
41712 + int currPtr;
41713 + int length;
41714 + unsigned char data[AR6000_BUFFER_SIZE];
41715 + HTC_PACKET HTCPacket;
41716 +} raw_htc_buffer;
41717 +
41718 +#ifdef CONFIG_HOST_TCMD_SUPPORT
41719 +/*
41720 + * add TCMD_MODE besides wmi and bypasswmi
41721 + * in TCMD_MODE, only few TCMD releated wmi commands
41722 + * counld be hanlder
41723 + */
41724 +enum {
41725 + AR6000_WMI_MODE = 0,
41726 + AR6000_BYPASS_MODE,
41727 + AR6000_TCMD_MODE,
41728 + AR6000_WLAN_MODE
41729 +};
41730 +#endif /* CONFIG_HOST_TCMD_SUPPORT */
41731 +
41732 +struct ar_wep_key {
41733 + A_UINT8 arKeyIndex;
41734 + A_UINT8 arKeyLen;
41735 + A_UINT8 arKey[64];
41736 +} ;
41737 +
41738 +struct ar_node_mapping {
41739 + A_UINT8 macAddress[6];
41740 + A_UINT8 epId;
41741 + A_UINT8 txPending;
41742 +};
41743 +
41744 +struct ar_cookie {
41745 + A_UINT32 arc_bp[2]; /* Must be first field */
41746 + HTC_PACKET HtcPkt; /* HTC packet wrapper */
41747 + struct ar_cookie *arc_list_next;
41748 +};
41749 +
41750 +struct ar_hb_chlng_resp {
41751 + A_TIMER timer;
41752 + A_UINT32 frequency;
41753 + A_UINT32 seqNum;
41754 + A_BOOL outstanding;
41755 + A_UINT8 missCnt;
41756 + A_UINT8 missThres;
41757 +};
41758 +
41759 +typedef struct ar6_softc {
41760 + struct net_device *arNetDev; /* net_device pointer */
41761 + void *arWmi;
41762 + int arTxPending[WMI_PRI_MAX_COUNT];
41763 + int arTotalTxDataPending;
41764 + A_UINT8 arNumDataEndPts;
41765 + A_BOOL arWmiEnabled;
41766 + A_BOOL arWmiReady;
41767 + A_BOOL arConnected;
41768 + A_BOOL arRadioSwitch;
41769 + HTC_HANDLE arHtcTarget;
41770 + void *arHifDevice;
41771 + spinlock_t arLock;
41772 + struct semaphore arSem;
41773 + int arRxBuffers[WMI_PRI_MAX_COUNT];
41774 + int arSsidLen;
41775 + u_char arSsid[32];
41776 + A_UINT8 arNetworkType;
41777 + A_UINT8 arDot11AuthMode;
41778 + A_UINT8 arAuthMode;
41779 + A_UINT8 arPairwiseCrypto;
41780 + A_UINT8 arPairwiseCryptoLen;
41781 + A_UINT8 arGroupCrypto;
41782 + A_UINT8 arGroupCryptoLen;
41783 + A_UINT8 arDefTxKeyIndex;
41784 + struct ar_wep_key arWepKeyList[WMI_MAX_KEY_INDEX + 1];
41785 + A_UINT8 arBssid[6];
41786 + A_UINT8 arReqBssid[6];
41787 + A_UINT16 arChannelHint;
41788 + A_UINT16 arBssChannel;
41789 + A_UINT16 arListenInterval;
41790 + struct ar6000_version arVersion;
41791 + A_UINT32 arTargetType;
41792 + A_INT8 arRssi;
41793 + A_UINT8 arTxPwr;
41794 + A_BOOL arTxPwrSet;
41795 + A_INT32 arBitRate;
41796 + struct net_device_stats arNetStats;
41797 + struct iw_statistics arIwStats;
41798 + A_INT8 arNumChannels;
41799 + A_UINT16 arChannelList[32];
41800 + A_UINT32 arRegCode;
41801 + A_BOOL statsUpdatePending;
41802 + TARGET_STATS arTargetStats;
41803 + A_INT8 arMaxRetries;
41804 + A_UINT8 arPhyCapability;
41805 +#ifdef CONFIG_HOST_TCMD_SUPPORT
41806 + A_UINT8 tcmdRxReport;
41807 + A_UINT32 tcmdRxTotalPkt;
41808 + A_INT32 tcmdRxRssi;
41809 + A_UINT32 tcmdPm;
41810 + A_UINT32 arTargetMode;
41811 +#endif
41812 + AR6000_WLAN_STATE arWlanState;
41813 + struct ar_node_mapping arNodeMap[MAX_NODE_NUM];
41814 + A_UINT8 arIbssPsEnable;
41815 + A_UINT8 arNodeNum;
41816 + A_UINT8 arNexEpId;
41817 + struct ar_cookie *arCookieList;
41818 + A_UINT16 arRateMask;
41819 + A_UINT8 arSkipScan;
41820 + A_UINT16 arBeaconInterval;
41821 + A_BOOL arConnectPending;
41822 + A_BOOL arWmmEnabled;
41823 + struct ar_hb_chlng_resp arHBChallengeResp;
41824 + A_UINT8 arKeepaliveConfigured;
41825 + A_UINT32 arMgmtFilter;
41826 + HTC_ENDPOINT_ID arWmi2EpMapping[WMI_PRI_MAX_COUNT];
41827 + WMI_PRI_STREAM_ID arEp2WmiMapping[ENDPOINT_MAX];
41828 +#ifdef HTC_RAW_INTERFACE
41829 + HTC_ENDPOINT_ID arRaw2EpMapping[HTC_RAW_STREAM_NUM_MAX];
41830 + HTC_RAW_STREAM_ID arEp2RawMapping[ENDPOINT_MAX];
41831 + struct semaphore raw_htc_read_sem[HTC_RAW_STREAM_NUM_MAX];
41832 + struct semaphore raw_htc_write_sem[HTC_RAW_STREAM_NUM_MAX];
41833 + wait_queue_head_t raw_htc_read_queue[HTC_RAW_STREAM_NUM_MAX];
41834 + wait_queue_head_t raw_htc_write_queue[HTC_RAW_STREAM_NUM_MAX];
41835 + raw_htc_buffer raw_htc_read_buffer[HTC_RAW_STREAM_NUM_MAX][RAW_HTC_READ_BUFFERS_NUM];
41836 + raw_htc_buffer raw_htc_write_buffer[HTC_RAW_STREAM_NUM_MAX][RAW_HTC_WRITE_BUFFERS_NUM];
41837 + A_BOOL write_buffer_available[HTC_RAW_STREAM_NUM_MAX];
41838 + A_BOOL read_buffer_available[HTC_RAW_STREAM_NUM_MAX];
41839 +#endif
41840 + A_BOOL arNetQueueStopped;
41841 + A_BOOL arRawIfInit;
41842 + int arDeviceIndex;
41843 + COMMON_CREDIT_STATE_INFO arCreditStateInfo;
41844 + A_BOOL arWMIControlEpFull;
41845 + A_BOOL dbgLogFetchInProgress;
41846 + A_UCHAR log_buffer[DBGLOG_HOST_LOG_BUFFER_SIZE];
41847 + A_UINT32 log_cnt;
41848 + A_UINT32 dbglog_init_done;
41849 + A_UINT32 arConnectCtrlFlags;
41850 + A_UINT32 scan_complete;
41851 +#ifdef USER_KEYS
41852 + A_INT32 user_savedkeys_stat;
41853 + A_UINT32 user_key_ctrl;
41854 + struct USER_SAVEDKEYS user_saved_keys;
41855 +#endif
41856 +} AR_SOFTC_T;
41857 +
41858 +
41859 +#define arWMIStream2EndpointID(ar,wmi) (ar)->arWmi2EpMapping[(wmi)]
41860 +#define arSetWMIStream2EndpointIDMap(ar,wmi,ep) \
41861 +{ (ar)->arWmi2EpMapping[(wmi)] = (ep); \
41862 + (ar)->arEp2WmiMapping[(ep)] = (wmi); }
41863 +#define arEndpoint2WMIStreamID(ar,ep) (ar)->arEp2WmiMapping[(ep)]
41864 +
41865 +#define arRawIfEnabled(ar) (ar)->arRawIfInit
41866 +#define arRawStream2EndpointID(ar,raw) (ar)->arRaw2EpMapping[(raw)]
41867 +#define arSetRawStream2EndpointIDMap(ar,raw,ep) \
41868 +{ (ar)->arRaw2EpMapping[(raw)] = (ep); \
41869 + (ar)->arEp2RawMapping[(ep)] = (raw); }
41870 +#define arEndpoint2RawStreamID(ar,ep) (ar)->arEp2RawMapping[(ep)]
41871 +
41872 +struct ar_giwscan_param {
41873 + char *current_ev;
41874 + char *end_buf;
41875 + A_BOOL firstPass;
41876 +};
41877 +
41878 +#define AR6000_STAT_INC(ar, stat) (ar->arNetStats.stat++)
41879 +
41880 +#define AR6000_SPIN_LOCK(lock, param) do { \
41881 + if (irqs_disabled()) { \
41882 + AR_DEBUG_PRINTF("IRQs disabled:AR6000_LOCK\n"); \
41883 + } \
41884 + spin_lock_bh(lock); \
41885 +} while (0)
41886 +
41887 +#define AR6000_SPIN_UNLOCK(lock, param) do { \
41888 + if (irqs_disabled()) { \
41889 + AR_DEBUG_PRINTF("IRQs disabled: AR6000_UNLOCK\n"); \
41890 + } \
41891 + spin_unlock_bh(lock); \
41892 +} while (0)
41893 +
41894 +int ar6000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
41895 +int ar6000_ioctl_dispatcher(struct net_device *dev, struct ifreq *rq, int cmd);
41896 +void ar6000_ioctl_iwsetup(struct iw_handler_def *def);
41897 +void ar6000_gpio_init(void);
41898 +void ar6000_init_profile_info(AR_SOFTC_T *ar);
41899 +void ar6000_install_static_wep_keys(AR_SOFTC_T *ar);
41900 +int ar6000_init(struct net_device *dev);
41901 +int ar6000_dbglog_get_debug_logs(AR_SOFTC_T *ar);
41902 +A_STATUS ar6000_SetHTCBlockSize(AR_SOFTC_T *ar);
41903 +
41904 +#ifdef HTC_RAW_INTERFACE
41905 +
41906 +#ifndef __user
41907 +#define __user
41908 +#endif
41909 +
41910 +int ar6000_htc_raw_open(AR_SOFTC_T *ar);
41911 +int ar6000_htc_raw_close(AR_SOFTC_T *ar);
41912 +ssize_t ar6000_htc_raw_read(AR_SOFTC_T *ar,
41913 + HTC_RAW_STREAM_ID StreamID,
41914 + char __user *buffer, size_t count);
41915 +ssize_t ar6000_htc_raw_write(AR_SOFTC_T *ar,
41916 + HTC_RAW_STREAM_ID StreamID,
41917 + char __user *buffer, size_t count);
41918 +
41919 +#endif /* HTC_RAW_INTERFACE */
41920 +
41921 +#ifdef __cplusplus
41922 +}
41923 +#endif
41924 +
41925 +#endif /* _AR6000_H_ */
41926 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ar6000_raw_if.c
41927 ===================================================================
41928 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
41929 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ar6000_raw_if.c 2008-12-11 22:46:49.000000000 +0100
41930 @@ -0,0 +1,439 @@
41931 +/*
41932 + *
41933 + * Copyright (c) 2004-2007 Atheros Communications Inc.
41934 + * All rights reserved.
41935 + *
41936 + *
41937 + * This program is free software; you can redistribute it and/or modify
41938 + * it under the terms of the GNU General Public License version 2 as
41939 + * published by the Free Software Foundation;
41940 + *
41941 + * Software distributed under the License is distributed on an "AS
41942 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
41943 + * implied. See the License for the specific language governing
41944 + * rights and limitations under the License.
41945 + *
41946 + *
41947 + *
41948 + */
41949 +
41950 +#include "ar6000_drv.h"
41951 +
41952 +#ifdef HTC_RAW_INTERFACE
41953 +
41954 +static void
41955 +ar6000_htc_raw_read_cb(void *Context, HTC_PACKET *pPacket)
41956 +{
41957 + AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
41958 + raw_htc_buffer *busy;
41959 + HTC_RAW_STREAM_ID streamID;
41960 +
41961 + busy = (raw_htc_buffer *)pPacket->pPktContext;
41962 + A_ASSERT(busy != NULL);
41963 +
41964 + if (pPacket->Status == A_ECANCELED) {
41965 + /*
41966 + * HTC provides A_ECANCELED status when it doesn't want to be refilled
41967 + * (probably due to a shutdown)
41968 + */
41969 + return;
41970 + }
41971 +
41972 + streamID = arEndpoint2RawStreamID(ar,pPacket->Endpoint);
41973 + A_ASSERT(streamID != HTC_RAW_STREAM_NOT_MAPPED);
41974 +
41975 +#ifdef CF
41976 + if (down_trylock(&ar->raw_htc_read_sem[streamID])) {
41977 +#else
41978 + if (down_interruptible(&ar->raw_htc_read_sem[streamID])) {
41979 +#endif /* CF */
41980 + AR_DEBUG2_PRINTF("Unable to down the semaphore\n");
41981 + }
41982 +
41983 + A_ASSERT((pPacket->Status != A_OK) ||
41984 + (pPacket->pBuffer == (busy->data + HTC_HEADER_LEN)));
41985 +
41986 + busy->length = pPacket->ActualLength + HTC_HEADER_LEN;
41987 + busy->currPtr = HTC_HEADER_LEN;
41988 + ar->read_buffer_available[streamID] = TRUE;
41989 + //AR_DEBUG_PRINTF("raw read cb: 0x%X 0x%X \n", busy->currPtr,busy->length);
41990 + up(&ar->raw_htc_read_sem[streamID]);
41991 +
41992 + /* Signal the waiting process */
41993 + AR_DEBUG2_PRINTF("Waking up the StreamID(%d) read process\n", streamID);
41994 + wake_up_interruptible(&ar->raw_htc_read_queue[streamID]);
41995 +}
41996 +
41997 +static void
41998 +ar6000_htc_raw_write_cb(void *Context, HTC_PACKET *pPacket)
41999 +{
42000 + AR_SOFTC_T *ar = (AR_SOFTC_T *)Context;
42001 + raw_htc_buffer *free;
42002 + HTC_RAW_STREAM_ID streamID;
42003 +
42004 + free = (raw_htc_buffer *)pPacket->pPktContext;
42005 + A_ASSERT(free != NULL);
42006 +
42007 + if (pPacket->Status == A_ECANCELED) {
42008 + /*
42009 + * HTC provides A_ECANCELED status when it doesn't want to be refilled
42010 + * (probably due to a shutdown)
42011 + */
42012 + return;
42013 + }
42014 +
42015 + streamID = arEndpoint2RawStreamID(ar,pPacket->Endpoint);
42016 + A_ASSERT(streamID != HTC_RAW_STREAM_NOT_MAPPED);
42017 +
42018 +#ifdef CF
42019 + if (down_trylock(&ar->raw_htc_write_sem[streamID])) {
42020 +#else
42021 + if (down_interruptible(&ar->raw_htc_write_sem[streamID])) {
42022 +#endif
42023 + AR_DEBUG2_PRINTF("Unable to down the semaphore\n");
42024 + }
42025 +
42026 + A_ASSERT(pPacket->pBuffer == (free->data + HTC_HEADER_LEN));
42027 +
42028 + free->length = 0;
42029 + ar->write_buffer_available[streamID] = TRUE;
42030 + up(&ar->raw_htc_write_sem[streamID]);
42031 +
42032 + /* Signal the waiting process */
42033 + AR_DEBUG2_PRINTF("Waking up the StreamID(%d) write process\n", streamID);
42034 + wake_up_interruptible(&ar->raw_htc_write_queue[streamID]);
42035 +}
42036 +
42037 +/* connect to a service */
42038 +static A_STATUS ar6000_connect_raw_service(AR_SOFTC_T *ar,
42039 + HTC_RAW_STREAM_ID StreamID)
42040 +{
42041 + A_STATUS status;
42042 + HTC_SERVICE_CONNECT_RESP response;
42043 + A_UINT8 streamNo;
42044 + HTC_SERVICE_CONNECT_REQ connect;
42045 +
42046 + do {
42047 +
42048 + A_MEMZERO(&connect,sizeof(connect));
42049 + /* pass the stream ID as meta data to the RAW streams service */
42050 + streamNo = (A_UINT8)StreamID;
42051 + connect.pMetaData = &streamNo;
42052 + connect.MetaDataLength = sizeof(A_UINT8);
42053 + /* these fields are the same for all endpoints */
42054 + connect.EpCallbacks.pContext = ar;
42055 + connect.EpCallbacks.EpTxComplete = ar6000_htc_raw_write_cb;
42056 + connect.EpCallbacks.EpRecv = ar6000_htc_raw_read_cb;
42057 + /* simple interface, we don't need these optional callbacks */
42058 + connect.EpCallbacks.EpRecvRefill = NULL;
42059 + connect.EpCallbacks.EpSendFull = NULL;
42060 + connect.MaxSendQueueDepth = RAW_HTC_WRITE_BUFFERS_NUM;
42061 +
42062 + /* connect to the raw streams service, we may be able to get 1 or more
42063 + * connections, depending on WHAT is running on the target */
42064 + connect.ServiceID = HTC_RAW_STREAMS_SVC;
42065 +
42066 + A_MEMZERO(&response,sizeof(response));
42067 +
42068 + /* try to connect to the raw stream, it is okay if this fails with
42069 + * status HTC_SERVICE_NO_MORE_EP */
42070 + status = HTCConnectService(ar->arHtcTarget,
42071 + &connect,
42072 + &response);
42073 +
42074 + if (A_FAILED(status)) {
42075 + if (response.ConnectRespCode == HTC_SERVICE_NO_MORE_EP) {
42076 + AR_DEBUG_PRINTF("HTC RAW , No more streams allowed \n");
42077 + status = A_OK;
42078 + }
42079 + break;
42080 + }
42081 +
42082 + /* set endpoint mapping for the RAW HTC streams */
42083 + arSetRawStream2EndpointIDMap(ar,StreamID,response.Endpoint);
42084 +
42085 + AR_DEBUG_PRINTF("HTC RAW : stream ID: %d, endpoint: %d\n",
42086 + StreamID, arRawStream2EndpointID(ar,StreamID));
42087 +
42088 + } while (FALSE);
42089 +
42090 + return status;
42091 +}
42092 +
42093 +int ar6000_htc_raw_open(AR_SOFTC_T *ar)
42094 +{
42095 + A_STATUS status;
42096 + int streamID, endPt, count2;
42097 + raw_htc_buffer *buffer;
42098 + HTC_SERVICE_ID servicepriority;
42099 +
42100 + A_ASSERT(ar->arHtcTarget != NULL);
42101 +
42102 + /* wait for target */
42103 + status = HTCWaitTarget(ar->arHtcTarget);
42104 +
42105 + if (A_FAILED(status)) {
42106 + AR_DEBUG_PRINTF("HTCWaitTarget failed (%d)\n", status);
42107 + return -ENODEV;
42108 + }
42109 +
42110 + for (endPt = 0; endPt < ENDPOINT_MAX; endPt++) {
42111 + ar->arEp2RawMapping[endPt] = HTC_RAW_STREAM_NOT_MAPPED;
42112 + }
42113 +
42114 + for (streamID = HTC_RAW_STREAM_0; streamID < HTC_RAW_STREAM_NUM_MAX; streamID++) {
42115 + /* Initialize the data structures */
42116 + init_MUTEX(&ar->raw_htc_read_sem[streamID]);
42117 + init_MUTEX(&ar->raw_htc_write_sem[streamID]);
42118 + init_waitqueue_head(&ar->raw_htc_read_queue[streamID]);
42119 + init_waitqueue_head(&ar->raw_htc_write_queue[streamID]);
42120 +
42121 + /* try to connect to the raw service */
42122 + status = ar6000_connect_raw_service(ar,streamID);
42123 +
42124 + if (A_FAILED(status)) {
42125 + break;
42126 + }
42127 +
42128 + if (arRawStream2EndpointID(ar,streamID) == 0) {
42129 + break;
42130 + }
42131 +
42132 + for (count2 = 0; count2 < RAW_HTC_READ_BUFFERS_NUM; count2 ++) {
42133 + /* Initialize the receive buffers */
42134 + buffer = &ar->raw_htc_write_buffer[streamID][count2];
42135 + memset(buffer, 0, sizeof(raw_htc_buffer));
42136 + buffer = &ar->raw_htc_read_buffer[streamID][count2];
42137 + memset(buffer, 0, sizeof(raw_htc_buffer));
42138 +
42139 + SET_HTC_PACKET_INFO_RX_REFILL(&buffer->HTCPacket,
42140 + buffer,
42141 + buffer->data,
42142 + AR6000_BUFFER_SIZE,
42143 + arRawStream2EndpointID(ar,streamID));
42144 +
42145 + /* Queue buffers to HTC for receive */
42146 + if ((status = HTCAddReceivePkt(ar->arHtcTarget, &buffer->HTCPacket)) != A_OK)
42147 + {
42148 + BMIInit();
42149 + return -EIO;
42150 + }
42151 + }
42152 +
42153 + for (count2 = 0; count2 < RAW_HTC_WRITE_BUFFERS_NUM; count2 ++) {
42154 + /* Initialize the receive buffers */
42155 + buffer = &ar->raw_htc_write_buffer[streamID][count2];
42156 + memset(buffer, 0, sizeof(raw_htc_buffer));
42157 + }
42158 +
42159 + ar->read_buffer_available[streamID] = FALSE;
42160 + ar->write_buffer_available[streamID] = TRUE;
42161 + }
42162 +
42163 + if (A_FAILED(status)) {
42164 + return -EIO;
42165 + }
42166 +
42167 + AR_DEBUG_PRINTF("HTC RAW, number of streams the target supports: %d \n", streamID);
42168 +
42169 + servicepriority = HTC_RAW_STREAMS_SVC; /* only 1 */
42170 +
42171 + /* set callbacks and priority list */
42172 + HTCSetCreditDistribution(ar->arHtcTarget,
42173 + ar,
42174 + NULL, /* use default */
42175 + NULL, /* use default */
42176 + &servicepriority,
42177 + 1);
42178 +
42179 + /* Start the HTC component */
42180 + if ((status = HTCStart(ar->arHtcTarget)) != A_OK) {
42181 + BMIInit();
42182 + return -EIO;
42183 + }
42184 +
42185 + (ar)->arRawIfInit = TRUE;
42186 +
42187 + return 0;
42188 +}
42189 +
42190 +int ar6000_htc_raw_close(AR_SOFTC_T *ar)
42191 +{
42192 + A_PRINTF("ar6000_htc_raw_close called \n");
42193 + HTCStop(ar->arHtcTarget);
42194 +
42195 + /* reset the device */
42196 + ar6000_reset_device(ar->arHifDevice, ar->arTargetType);
42197 + /* Initialize the BMI component */
42198 + BMIInit();
42199 +
42200 + return 0;
42201 +}
42202 +
42203 +raw_htc_buffer *
42204 +get_filled_buffer(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID)
42205 +{
42206 + int count;
42207 + raw_htc_buffer *busy;
42208 +
42209 + /* Check for data */
42210 + for (count = 0; count < RAW_HTC_READ_BUFFERS_NUM; count ++) {
42211 + busy = &ar->raw_htc_read_buffer[StreamID][count];
42212 + if (busy->length) {
42213 + break;
42214 + }
42215 + }
42216 + if (busy->length) {
42217 + ar->read_buffer_available[StreamID] = TRUE;
42218 + } else {
42219 + ar->read_buffer_available[StreamID] = FALSE;
42220 + }
42221 +
42222 + return busy;
42223 +}
42224 +
42225 +ssize_t ar6000_htc_raw_read(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID,
42226 + char __user *buffer, size_t length)
42227 +{
42228 + int readPtr;
42229 + raw_htc_buffer *busy;
42230 +
42231 + if (arRawStream2EndpointID(ar,StreamID) == 0) {
42232 + AR_DEBUG_PRINTF("StreamID(%d) not connected! \n", StreamID);
42233 + return -EFAULT;
42234 + }
42235 +
42236 + if (down_interruptible(&ar->raw_htc_read_sem[StreamID])) {
42237 + return -ERESTARTSYS;
42238 + }
42239 +
42240 + busy = get_filled_buffer(ar,StreamID);
42241 + while (!ar->read_buffer_available[StreamID]) {
42242 + up(&ar->raw_htc_read_sem[StreamID]);
42243 +
42244 + /* Wait for the data */
42245 + AR_DEBUG2_PRINTF("Sleeping StreamID(%d) read process\n", StreamID);
42246 + if (wait_event_interruptible(ar->raw_htc_read_queue[StreamID],
42247 + ar->read_buffer_available[StreamID]))
42248 + {
42249 + return -EINTR;
42250 + }
42251 + if (down_interruptible(&ar->raw_htc_read_sem[StreamID])) {
42252 + return -ERESTARTSYS;
42253 + }
42254 + busy = get_filled_buffer(ar,StreamID);
42255 + }
42256 +
42257 + /* Read the data */
42258 + readPtr = busy->currPtr;
42259 + if (length > busy->length - HTC_HEADER_LEN) {
42260 + length = busy->length - HTC_HEADER_LEN;
42261 + }
42262 + if (copy_to_user(buffer, &busy->data[readPtr], length)) {
42263 + up(&ar->raw_htc_read_sem[StreamID]);
42264 + return -EFAULT;
42265 + }
42266 +
42267 + busy->currPtr += length;
42268 +
42269 + //AR_DEBUG_PRINTF("raw read ioctl: currPTR : 0x%X 0x%X \n", busy->currPtr,busy->length);
42270 +
42271 + if (busy->currPtr == busy->length)
42272 + {
42273 + busy->currPtr = 0;
42274 + busy->length = 0;
42275 + HTC_PACKET_RESET_RX(&busy->HTCPacket);
42276 + //AR_DEBUG_PRINTF("raw read ioctl: ep for packet:%d \n", busy->HTCPacket.Endpoint);
42277 + HTCAddReceivePkt(ar->arHtcTarget, &busy->HTCPacket);
42278 + }
42279 + ar->read_buffer_available[StreamID] = FALSE;
42280 + up(&ar->raw_htc_read_sem[StreamID]);
42281 +
42282 + return length;
42283 +}
42284 +
42285 +static raw_htc_buffer *
42286 +get_free_buffer(AR_SOFTC_T *ar, HTC_ENDPOINT_ID StreamID)
42287 +{
42288 + int count;
42289 + raw_htc_buffer *free;
42290 +
42291 + free = NULL;
42292 + for (count = 0; count < RAW_HTC_WRITE_BUFFERS_NUM; count ++) {
42293 + free = &ar->raw_htc_write_buffer[StreamID][count];
42294 + if (free->length == 0) {
42295 + break;
42296 + }
42297 + }
42298 + if (!free->length) {
42299 + ar->write_buffer_available[StreamID] = TRUE;
42300 + } else {
42301 + ar->write_buffer_available[StreamID] = FALSE;
42302 + }
42303 +
42304 + return free;
42305 +}
42306 +
42307 +ssize_t ar6000_htc_raw_write(AR_SOFTC_T *ar, HTC_RAW_STREAM_ID StreamID,
42308 + char __user *buffer, size_t length)
42309 +{
42310 + int writePtr;
42311 + raw_htc_buffer *free;
42312 +
42313 + if (arRawStream2EndpointID(ar,StreamID) == 0) {
42314 + AR_DEBUG_PRINTF("StreamID(%d) not connected! \n", StreamID);
42315 + return -EFAULT;
42316 + }
42317 +
42318 + if (down_interruptible(&ar->raw_htc_write_sem[StreamID])) {
42319 + return -ERESTARTSYS;
42320 + }
42321 +
42322 + /* Search for a free buffer */
42323 + free = get_free_buffer(ar,StreamID);
42324 +
42325 + /* Check if there is space to write else wait */
42326 + while (!ar->write_buffer_available[StreamID]) {
42327 + up(&ar->raw_htc_write_sem[StreamID]);
42328 +
42329 + /* Wait for buffer to become free */
42330 + AR_DEBUG2_PRINTF("Sleeping StreamID(%d) write process\n", StreamID);
42331 + if (wait_event_interruptible(ar->raw_htc_write_queue[StreamID],
42332 + ar->write_buffer_available[StreamID]))
42333 + {
42334 + return -EINTR;
42335 + }
42336 + if (down_interruptible(&ar->raw_htc_write_sem[StreamID])) {
42337 + return -ERESTARTSYS;
42338 + }
42339 + free = get_free_buffer(ar,StreamID);
42340 + }
42341 +
42342 + /* Send the data */
42343 + writePtr = HTC_HEADER_LEN;
42344 + if (length > (AR6000_BUFFER_SIZE - HTC_HEADER_LEN)) {
42345 + length = AR6000_BUFFER_SIZE - HTC_HEADER_LEN;
42346 + }
42347 +
42348 + if (copy_from_user(&free->data[writePtr], buffer, length)) {
42349 + up(&ar->raw_htc_read_sem[StreamID]);
42350 + return -EFAULT;
42351 + }
42352 +
42353 + free->length = length;
42354 +
42355 + SET_HTC_PACKET_INFO_TX(&free->HTCPacket,
42356 + free,
42357 + &free->data[writePtr],
42358 + length,
42359 + arRawStream2EndpointID(ar,StreamID),
42360 + AR6K_DATA_PKT_TAG);
42361 +
42362 + HTCSendPkt(ar->arHtcTarget,&free->HTCPacket);
42363 +
42364 + ar->write_buffer_available[StreamID] = FALSE;
42365 + up(&ar->raw_htc_write_sem[StreamID]);
42366 +
42367 + return length;
42368 +}
42369 +#endif /* HTC_RAW_INTERFACE */
42370 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ar6xapi_linux.h
42371 ===================================================================
42372 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
42373 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ar6xapi_linux.h 2008-12-11 22:46:49.000000000 +0100
42374 @@ -0,0 +1,128 @@
42375 +#ifndef _AR6XAPI_LINUX_H
42376 +#define _AR6XAPI_LINUX_H
42377 +/*
42378 + *
42379 + * Copyright (c) 2004-2007 Atheros Communications Inc.
42380 + * All rights reserved.
42381 + *
42382 + *
42383 + * This program is free software; you can redistribute it and/or modify
42384 + * it under the terms of the GNU General Public License version 2 as
42385 + * published by the Free Software Foundation;
42386 + *
42387 + * Software distributed under the License is distributed on an "AS
42388 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
42389 + * implied. See the License for the specific language governing
42390 + * rights and limitations under the License.
42391 + *
42392 + *
42393 + *
42394 + */
42395 +
42396 +#ifdef __cplusplus
42397 +extern "C" {
42398 +#endif
42399 +
42400 +struct ar6_softc;
42401 +
42402 +void ar6000_ready_event(void *devt, A_UINT8 *datap, A_UINT8 phyCap);
42403 +A_UINT8 ar6000_iptos_to_userPriority(A_UINT8 *pkt);
42404 +A_STATUS ar6000_control_tx(void *devt, void *osbuf, WMI_PRI_STREAM_ID streamID);
42405 +void ar6000_connect_event(struct ar6_softc *ar, A_UINT16 channel,
42406 + A_UINT8 *bssid, A_UINT16 listenInterval,
42407 + A_UINT16 beaconInterval, NETWORK_TYPE networkType,
42408 + A_UINT8 beaconIeLen, A_UINT8 assocReqLen,
42409 + A_UINT8 assocRespLen,A_UINT8 *assocInfo);
42410 +void ar6000_disconnect_event(struct ar6_softc *ar, A_UINT8 reason,
42411 + A_UINT8 *bssid, A_UINT8 assocRespLen,
42412 + A_UINT8 *assocInfo, A_UINT16 protocolReasonStatus);
42413 +void ar6000_tkip_micerr_event(struct ar6_softc *ar, A_UINT8 keyid,
42414 + A_BOOL ismcast);
42415 +void ar6000_bitrate_rx(void *devt, A_INT32 rateKbps);
42416 +void ar6000_channelList_rx(void *devt, A_INT8 numChan, A_UINT16 *chanList);
42417 +void ar6000_regDomain_event(struct ar6_softc *ar, A_UINT32 regCode);
42418 +void ar6000_txPwr_rx(void *devt, A_UINT8 txPwr);
42419 +void ar6000_keepalive_rx(void *devt, A_UINT8 configured);
42420 +void ar6000_neighborReport_event(struct ar6_softc *ar, int numAps,
42421 + WMI_NEIGHBOR_INFO *info);
42422 +void ar6000_set_numdataendpts(struct ar6_softc *ar, A_UINT32 num);
42423 +void ar6000_scanComplete_event(struct ar6_softc *ar, A_STATUS status);
42424 +void ar6000_targetStats_event(struct ar6_softc *ar, WMI_TARGET_STATS *pStats);
42425 +void ar6000_rssiThreshold_event(struct ar6_softc *ar,
42426 + WMI_RSSI_THRESHOLD_VAL newThreshold,
42427 + A_INT16 rssi);
42428 +void ar6000_reportError_event(struct ar6_softc *, WMI_TARGET_ERROR_VAL errorVal);
42429 +void ar6000_cac_event(struct ar6_softc *ar, A_UINT8 ac, A_UINT8 cac_indication,
42430 + A_UINT8 statusCode, A_UINT8 *tspecSuggestion);
42431 +void ar6000_hbChallengeResp_event(struct ar6_softc *, A_UINT32 cookie, A_UINT32 source);
42432 +void
42433 +ar6000_roam_tbl_event(struct ar6_softc *ar, WMI_TARGET_ROAM_TBL *pTbl);
42434 +
42435 +void
42436 +ar6000_roam_data_event(struct ar6_softc *ar, WMI_TARGET_ROAM_DATA *p);
42437 +
42438 +void
42439 +ar6000_wow_list_event(struct ar6_softc *ar, A_UINT8 num_filters,
42440 + WMI_GET_WOW_LIST_REPLY *wow_reply);
42441 +
42442 +void ar6000_pmkid_list_event(void *devt, A_UINT8 numPMKID,
42443 + WMI_PMKID *pmkidList);
42444 +
42445 +void ar6000_gpio_intr_rx(A_UINT32 intr_mask, A_UINT32 input_values);
42446 +void ar6000_gpio_data_rx(A_UINT32 reg_id, A_UINT32 value);
42447 +void ar6000_gpio_ack_rx(void);
42448 +
42449 +void ar6000_dbglog_init_done(struct ar6_softc *ar);
42450 +
42451 +#ifdef SEND_EVENT_TO_APP
42452 +void ar6000_send_event_to_app(struct ar6_softc *ar, A_UINT16 eventId, A_UINT8 *datap, int len);
42453 +#endif
42454 +
42455 +#ifdef CONFIG_HOST_TCMD_SUPPORT
42456 +void ar6000_tcmd_rx_report_event(void *devt, A_UINT8 * results, int len);
42457 +#endif
42458 +
42459 +void ar6000_tx_retry_err_event(void *devt);
42460 +
42461 +void ar6000_snrThresholdEvent_rx(void *devt,
42462 + WMI_SNR_THRESHOLD_VAL newThreshold,
42463 + A_UINT8 snr);
42464 +
42465 +void ar6000_lqThresholdEvent_rx(void *devt, WMI_LQ_THRESHOLD_VAL range, A_UINT8 lqVal);
42466 +
42467 +
42468 +void ar6000_ratemask_rx(void *devt, A_UINT16 ratemask);
42469 +
42470 +A_STATUS ar6000_get_driver_cfg(struct net_device *dev,
42471 + A_UINT16 cfgParam,
42472 + void *result);
42473 +void ar6000_bssInfo_event_rx(struct ar6_softc *ar, A_UINT8 *data, int len);
42474 +
42475 +void ar6000_dbglog_event(struct ar6_softc *ar, A_UINT32 dropped,
42476 + A_INT8 *buffer, A_UINT32 length);
42477 +
42478 +int ar6000_dbglog_get_debug_logs(struct ar6_softc *ar);
42479 +
42480 +void ar6000_indicate_tx_activity(void *devt, A_UINT8 trafficClass, A_BOOL Active);
42481 +
42482 +void ar6000_dset_open_req(void *devt,
42483 + A_UINT32 id,
42484 + A_UINT32 targ_handle,
42485 + A_UINT32 targ_reply_fn,
42486 + A_UINT32 targ_reply_arg);
42487 +void ar6000_dset_close(void *devt, A_UINT32 access_cookie);
42488 +void ar6000_dset_data_req(void *devt,
42489 + A_UINT32 access_cookie,
42490 + A_UINT32 offset,
42491 + A_UINT32 length,
42492 + A_UINT32 targ_buf,
42493 + A_UINT32 targ_reply_fn,
42494 + A_UINT32 targ_reply_arg);
42495 +
42496 +
42497 +
42498 +#ifdef __cplusplus
42499 +}
42500 +#endif
42501 +
42502 +#endif
42503 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/athdrv_linux.h
42504 ===================================================================
42505 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
42506 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/athdrv_linux.h 2008-12-11 22:46:49.000000000 +0100
42507 @@ -0,0 +1,993 @@
42508 +/*
42509 + * Copyright (c) 2004-2006 Atheros Communications Inc.
42510 + * All rights reserved.
42511 + *
42512 + *
42513 + *
42514 + * This program is free software; you can redistribute it and/or modify
42515 + * it under the terms of the GNU General Public License version 2 as
42516 + * published by the Free Software Foundation;
42517 + *
42518 + * Software distributed under the License is distributed on an "AS
42519 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
42520 + * implied. See the License for the specific language governing
42521 + * rights and limitations under the License.
42522 + *
42523 + *
42524 + *
42525 + */
42526 +
42527 +#ifndef _ATHDRV_LINUX_H
42528 +#define _ATHDRV_LINUX_H
42529 +
42530 +#ifdef __cplusplus
42531 +extern "C" {
42532 +#endif
42533 +
42534 +
42535 +/*
42536 + * There are two types of ioctl's here: Standard ioctls and
42537 + * eXtended ioctls. All extended ioctls (XIOCTL) are multiplexed
42538 + * off of the single ioctl command, AR6000_IOCTL_EXTENDED. The
42539 + * arguments for every XIOCTL starts with a 32-bit command word
42540 + * that is used to select which extended ioctl is in use. After
42541 + * the command word are command-specific arguments.
42542 + */
42543 +
42544 +/* Linux standard Wireless Extensions, private ioctl interfaces */
42545 +#define IEEE80211_IOCTL_SETPARAM (SIOCIWFIRSTPRIV+0)
42546 +#define IEEE80211_IOCTL_GETPARAM (SIOCIWFIRSTPRIV+1)
42547 +#define IEEE80211_IOCTL_SETKEY (SIOCIWFIRSTPRIV+2)
42548 +#define IEEE80211_IOCTL_SETWMMPARAMS (SIOCIWFIRSTPRIV+3)
42549 +#define IEEE80211_IOCTL_DELKEY (SIOCIWFIRSTPRIV+4)
42550 +#define IEEE80211_IOCTL_GETWMMPARAMS (SIOCIWFIRSTPRIV+5)
42551 +#define IEEE80211_IOCTL_SETOPTIE (SIOCIWFIRSTPRIV+6)
42552 +#define IEEE80211_IOCTL_SETMLME (SIOCIWFIRSTPRIV+7)
42553 +//#define IEEE80211_IOCTL_GETOPTIE (SIOCIWFIRSTPRIV+7)
42554 +#define IEEE80211_IOCTL_ADDPMKID (SIOCIWFIRSTPRIV+8)
42555 +//#define IEEE80211_IOCTL_SETAUTHALG (SIOCIWFIRSTPRIV+10)
42556 +#define IEEE80211_IOCTL_LASTONE (SIOCIWFIRSTPRIV+9)
42557 +
42558 +
42559 +
42560 +/* ====WMI Ioctls==== */
42561 +/*
42562 + *
42563 + * Many ioctls simply provide WMI services to application code:
42564 + * an application makes such an ioctl call with a set of arguments
42565 + * that are packaged into the corresponding WMI message, and sent
42566 + * to the Target.
42567 + */
42568 +
42569 +#define AR6000_IOCTL_WMI_GETREV (SIOCIWFIRSTPRIV+10)
42570 +/*
42571 + * arguments:
42572 + * ar6000_version *revision
42573 + */
42574 +
42575 +#define AR6000_IOCTL_WMI_SETPWR (SIOCIWFIRSTPRIV+11)
42576 +/*
42577 + * arguments:
42578 + * WMI_POWER_MODE_CMD pwrModeCmd (see include/wmi.h)
42579 + * uses: WMI_SET_POWER_MODE_CMDID
42580 + */
42581 +
42582 +#define AR6000_IOCTL_WMI_SETSCAN (SIOCIWFIRSTPRIV+12)
42583 +/*
42584 + * arguments:
42585 + * WMI_SCAN_PARAMS_CMD scanParams (see include/wmi.h)
42586 + * uses: WMI_SET_SCAN_PARAMS_CMDID
42587 + */
42588 +
42589 +#define AR6000_IOCTL_WMI_SETLISTENINT (SIOCIWFIRSTPRIV+13)
42590 +/*
42591 + * arguments:
42592 + * UINT32 listenInterval
42593 + * uses: WMI_SET_LISTEN_INT_CMDID
42594 + */
42595 +
42596 +#define AR6000_IOCTL_WMI_SETBSSFILTER (SIOCIWFIRSTPRIV+14)
42597 +/*
42598 + * arguments:
42599 + * WMI_BSS_FILTER filter (see include/wmi.h)
42600 + * uses: WMI_SET_BSS_FILTER_CMDID
42601 + */
42602 +
42603 +#define AR6000_IOCTL_WMI_SET_CHANNELPARAMS (SIOCIWFIRSTPRIV+16)
42604 +/*
42605 + * arguments:
42606 + * WMI_CHANNEL_PARAMS_CMD chParams
42607 + * uses: WMI_SET_CHANNEL_PARAMS_CMDID
42608 + */
42609 +
42610 +#define AR6000_IOCTL_WMI_SET_PROBEDSSID (SIOCIWFIRSTPRIV+17)
42611 +/*
42612 + * arguments:
42613 + * WMI_PROBED_SSID_CMD probedSsids (see include/wmi.h)
42614 + * uses: WMI_SETPROBED_SSID_CMDID
42615 + */
42616 +
42617 +#define AR6000_IOCTL_WMI_SET_PMPARAMS (SIOCIWFIRSTPRIV+18)
42618 +/*
42619 + * arguments:
42620 + * WMI_POWER_PARAMS_CMD powerParams (see include/wmi.h)
42621 + * uses: WMI_SET_POWER_PARAMS_CMDID
42622 + */
42623 +
42624 +#define AR6000_IOCTL_WMI_SET_BADAP (SIOCIWFIRSTPRIV+19)
42625 +/*
42626 + * arguments:
42627 + * WMI_ADD_BAD_AP_CMD badAPs (see include/wmi.h)
42628 + * uses: WMI_ADD_BAD_AP_CMDID
42629 + */
42630 +
42631 +#define AR6000_IOCTL_WMI_GET_QOS_QUEUE (SIOCIWFIRSTPRIV+20)
42632 +/*
42633 + * arguments:
42634 + * ar6000_queuereq queueRequest (see below)
42635 + */
42636 +
42637 +#define AR6000_IOCTL_WMI_CREATE_QOS (SIOCIWFIRSTPRIV+21)
42638 +/*
42639 + * arguments:
42640 + * WMI_CREATE_PSTREAM createPstreamCmd (see include/wmi.h)
42641 + * uses: WMI_CREATE_PSTREAM_CMDID
42642 + */
42643 +
42644 +#define AR6000_IOCTL_WMI_DELETE_QOS (SIOCIWFIRSTPRIV+22)
42645 +/*
42646 + * arguments:
42647 + * WMI_DELETE_PSTREAM_CMD deletePstreamCmd (see include/wmi.h)
42648 + * uses: WMI_DELETE_PSTREAM_CMDID
42649 + */
42650 +
42651 +#define AR6000_IOCTL_WMI_SET_SNRTHRESHOLD (SIOCIWFIRSTPRIV+23)
42652 +/*
42653 + * arguments:
42654 + * WMI_SNR_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
42655 + * uses: WMI_SNR_THRESHOLD_PARAMS_CMDID
42656 + */
42657 +
42658 +#define AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK (SIOCIWFIRSTPRIV+24)
42659 +/*
42660 + * arguments:
42661 + * WMI_TARGET_ERROR_REPORT_BITMASK errorReportBitMask (see include/wmi.h)
42662 + * uses: WMI_TARGET_ERROR_REPORT_BITMASK_CMDID
42663 + */
42664 +
42665 +#define AR6000_IOCTL_WMI_GET_TARGET_STATS (SIOCIWFIRSTPRIV+25)
42666 +/*
42667 + * arguments:
42668 + * TARGET_STATS *targetStats (see below)
42669 + * uses: WMI_GET_STATISTICS_CMDID
42670 + */
42671 +
42672 +#define AR6000_IOCTL_WMI_SET_ASSOC_INFO (SIOCIWFIRSTPRIV+26)
42673 +/*
42674 + * arguments:
42675 + * WMI_SET_ASSOC_INFO_CMD setAssocInfoCmd
42676 + * uses: WMI_SET_ASSOC_INFO_CMDID
42677 + */
42678 +
42679 +#define AR6000_IOCTL_WMI_SET_ACCESS_PARAMS (SIOCIWFIRSTPRIV+27)
42680 +/*
42681 + * arguments:
42682 + * WMI_SET_ACCESS_PARAMS_CMD setAccessParams (see include/wmi.h)
42683 + * uses: WMI_SET_ACCESS_PARAMS_CMDID
42684 + */
42685 +
42686 +#define AR6000_IOCTL_WMI_SET_BMISS_TIME (SIOCIWFIRSTPRIV+28)
42687 +/*
42688 + * arguments:
42689 + * UINT32 beaconMissTime
42690 + * uses: WMI_SET_BMISS_TIME_CMDID
42691 + */
42692 +
42693 +#define AR6000_IOCTL_WMI_SET_DISC_TIMEOUT (SIOCIWFIRSTPRIV+29)
42694 +/*
42695 + * arguments:
42696 + * WMI_DISC_TIMEOUT_CMD disconnectTimeoutCmd (see include/wmi.h)
42697 + * uses: WMI_SET_DISC_TIMEOUT_CMDID
42698 + */
42699 +
42700 +#define AR6000_IOCTL_WMI_SET_IBSS_PM_CAPS (SIOCIWFIRSTPRIV+30)
42701 +/*
42702 + * arguments:
42703 + * WMI_IBSS_PM_CAPS_CMD ibssPowerMgmtCapsCmd
42704 + * uses: WMI_SET_IBSS_PM_CAPS_CMDID
42705 + */
42706 +
42707 +/*
42708 + * There is a very small space available for driver-private
42709 + * wireless ioctls. In order to circumvent this limitation,
42710 + * we multiplex a bunch of ioctls (XIOCTLs) on top of a
42711 + * single AR6000_IOCTL_EXTENDED ioctl.
42712 + */
42713 +#define AR6000_IOCTL_EXTENDED (SIOCIWFIRSTPRIV+31)
42714 +
42715 +
42716 +/* ====BMI Extended Ioctls==== */
42717 +
42718 +#define AR6000_XIOCTL_BMI_DONE 1
42719 +/*
42720 + * arguments:
42721 + * UINT32 cmd (AR6000_XIOCTL_BMI_DONE)
42722 + * uses: BMI_DONE
42723 + */
42724 +
42725 +#define AR6000_XIOCTL_BMI_READ_MEMORY 2
42726 +/*
42727 + * arguments:
42728 + * union {
42729 + * struct {
42730 + * UINT32 cmd (AR6000_XIOCTL_BMI_READ_MEMORY)
42731 + * UINT32 address
42732 + * UINT32 length
42733 + * }
42734 + * char results[length]
42735 + * }
42736 + * uses: BMI_READ_MEMORY
42737 + */
42738 +
42739 +#define AR6000_XIOCTL_BMI_WRITE_MEMORY 3
42740 +/*
42741 + * arguments:
42742 + * UINT32 cmd (AR6000_XIOCTL_BMI_WRITE_MEMORY)
42743 + * UINT32 address
42744 + * UINT32 length
42745 + * char data[length]
42746 + * uses: BMI_WRITE_MEMORY
42747 + */
42748 +
42749 +#define AR6000_XIOCTL_BMI_EXECUTE 4
42750 +/*
42751 + * arguments:
42752 + * UINT32 cmd (AR6000_XIOCTL_BMI_EXECUTE)
42753 + * UINT32 TargetAddress
42754 + * UINT32 parameter
42755 + * uses: BMI_EXECUTE
42756 + */
42757 +
42758 +#define AR6000_XIOCTL_BMI_SET_APP_START 5
42759 +/*
42760 + * arguments:
42761 + * UINT32 cmd (AR6000_XIOCTL_BMI_SET_APP_START)
42762 + * UINT32 TargetAddress
42763 + * uses: BMI_SET_APP_START
42764 + */
42765 +
42766 +#define AR6000_XIOCTL_BMI_READ_SOC_REGISTER 6
42767 +/*
42768 + * arguments:
42769 + * union {
42770 + * struct {
42771 + * UINT32 cmd (AR6000_XIOCTL_BMI_READ_SOC_REGISTER)
42772 + * UINT32 TargetAddress, 32-bit aligned
42773 + * }
42774 + * UINT32 result
42775 + * }
42776 + * uses: BMI_READ_SOC_REGISTER
42777 + */
42778 +
42779 +#define AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER 7
42780 +/*
42781 + * arguments:
42782 + * struct {
42783 + * UINT32 cmd (AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER)
42784 + * UINT32 TargetAddress, 32-bit aligned
42785 + * UINT32 newValue
42786 + * }
42787 + * uses: BMI_WRITE_SOC_REGISTER
42788 + */
42789 +
42790 +#define AR6000_XIOCTL_BMI_TEST 8
42791 +/*
42792 + * arguments:
42793 + * UINT32 cmd (AR6000_XIOCTL_BMI_TEST)
42794 + * UINT32 address
42795 + * UINT32 length
42796 + * UINT32 count
42797 + */
42798 +
42799 +
42800 +
42801 +/* Historical Host-side DataSet support */
42802 +#define AR6000_XIOCTL_UNUSED9 9
42803 +#define AR6000_XIOCTL_UNUSED10 10
42804 +#define AR6000_XIOCTL_UNUSED11 11
42805 +
42806 +/* ====Misc Extended Ioctls==== */
42807 +
42808 +#define AR6000_XIOCTL_FORCE_TARGET_RESET 12
42809 +/*
42810 + * arguments:
42811 + * UINT32 cmd (AR6000_XIOCTL_FORCE_TARGET_RESET)
42812 + */
42813 +
42814 +
42815 +#ifdef HTC_RAW_INTERFACE
42816 +/* HTC Raw Interface Ioctls */
42817 +#define AR6000_XIOCTL_HTC_RAW_OPEN 13
42818 +/*
42819 + * arguments:
42820 + * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_OPEN)
42821 + */
42822 +
42823 +#define AR6000_XIOCTL_HTC_RAW_CLOSE 14
42824 +/*
42825 + * arguments:
42826 + * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_CLOSE)
42827 + */
42828 +
42829 +#define AR6000_XIOCTL_HTC_RAW_READ 15
42830 +/*
42831 + * arguments:
42832 + * union {
42833 + * struct {
42834 + * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_READ)
42835 + * UINT32 mailboxID
42836 + * UINT32 length
42837 + * }
42838 + * results[length]
42839 + * }
42840 + */
42841 +
42842 +#define AR6000_XIOCTL_HTC_RAW_WRITE 16
42843 +/*
42844 + * arguments:
42845 + * UINT32 cmd (AR6000_XIOCTL_HTC_RAW_WRITE)
42846 + * UINT32 mailboxID
42847 + * UINT32 length
42848 + * char buffer[length]
42849 + */
42850 +#endif /* HTC_RAW_INTERFACE */
42851 +
42852 +#define AR6000_XIOCTL_CHECK_TARGET_READY 17
42853 +/*
42854 + * arguments:
42855 + * UINT32 cmd (AR6000_XIOCTL_CHECK_TARGET_READY)
42856 + */
42857 +
42858 +
42859 +
42860 +/* ====GPIO (General Purpose I/O) Extended Ioctls==== */
42861 +
42862 +#define AR6000_XIOCTL_GPIO_OUTPUT_SET 18
42863 +/*
42864 + * arguments:
42865 + * UINT32 cmd (AR6000_XIOCTL_GPIO_OUTPUT_SET)
42866 + * ar6000_gpio_output_set_cmd_s (see below)
42867 + * uses: WMIX_GPIO_OUTPUT_SET_CMDID
42868 + */
42869 +
42870 +#define AR6000_XIOCTL_GPIO_INPUT_GET 19
42871 +/*
42872 + * arguments:
42873 + * UINT32 cmd (AR6000_XIOCTL_GPIO_INPUT_GET)
42874 + * uses: WMIX_GPIO_INPUT_GET_CMDID
42875 + */
42876 +
42877 +#define AR6000_XIOCTL_GPIO_REGISTER_SET 20
42878 +/*
42879 + * arguments:
42880 + * UINT32 cmd (AR6000_XIOCTL_GPIO_REGISTER_SET)
42881 + * ar6000_gpio_register_cmd_s (see below)
42882 + * uses: WMIX_GPIO_REGISTER_SET_CMDID
42883 + */
42884 +
42885 +#define AR6000_XIOCTL_GPIO_REGISTER_GET 21
42886 +/*
42887 + * arguments:
42888 + * UINT32 cmd (AR6000_XIOCTL_GPIO_REGISTER_GET)
42889 + * ar6000_gpio_register_cmd_s (see below)
42890 + * uses: WMIX_GPIO_REGISTER_GET_CMDID
42891 + */
42892 +
42893 +#define AR6000_XIOCTL_GPIO_INTR_ACK 22
42894 +/*
42895 + * arguments:
42896 + * UINT32 cmd (AR6000_XIOCTL_GPIO_INTR_ACK)
42897 + * ar6000_cpio_intr_ack_cmd_s (see below)
42898 + * uses: WMIX_GPIO_INTR_ACK_CMDID
42899 + */
42900 +
42901 +#define AR6000_XIOCTL_GPIO_INTR_WAIT 23
42902 +/*
42903 + * arguments:
42904 + * UINT32 cmd (AR6000_XIOCTL_GPIO_INTR_WAIT)
42905 + */
42906 +
42907 +
42908 +
42909 +/* ====more wireless commands==== */
42910 +
42911 +#define AR6000_XIOCTL_SET_ADHOC_BSSID 24
42912 +/*
42913 + * arguments:
42914 + * UINT32 cmd (AR6000_XIOCTL_SET_ADHOC_BSSID)
42915 + * WMI_SET_ADHOC_BSSID_CMD setAdHocBssidCmd (see include/wmi.h)
42916 + */
42917 +
42918 +#define AR6000_XIOCTL_SET_OPT_MODE 25
42919 +/*
42920 + * arguments:
42921 + * UINT32 cmd (AR6000_XIOCTL_SET_OPT_MODE)
42922 + * WMI_SET_OPT_MODE_CMD setOptModeCmd (see include/wmi.h)
42923 + * uses: WMI_SET_OPT_MODE_CMDID
42924 + */
42925 +
42926 +#define AR6000_XIOCTL_OPT_SEND_FRAME 26
42927 +/*
42928 + * arguments:
42929 + * UINT32 cmd (AR6000_XIOCTL_OPT_SEND_FRAME)
42930 + * WMI_OPT_TX_FRAME_CMD optTxFrameCmd (see include/wmi.h)
42931 + * uses: WMI_OPT_TX_FRAME_CMDID
42932 + */
42933 +
42934 +#define AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL 27
42935 +/*
42936 + * arguments:
42937 + * UINT32 cmd (AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL)
42938 + * WMI_BEACON_INT_CMD beaconIntCmd (see include/wmi.h)
42939 + * uses: WMI_SET_BEACON_INT_CMDID
42940 + */
42941 +
42942 +
42943 +#define IEEE80211_IOCTL_SETAUTHALG 28
42944 +
42945 +
42946 +#define AR6000_XIOCTL_SET_VOICE_PKT_SIZE 29
42947 +/*
42948 + * arguments:
42949 + * UINT32 cmd (AR6000_XIOCTL_SET_VOICE_PKT_SIZE)
42950 + * WMI_SET_VOICE_PKT_SIZE_CMD setVoicePktSizeCmd (see include/wmi.h)
42951 + * uses: WMI_SET_VOICE_PKT_SIZE_CMDID
42952 + */
42953 +
42954 +
42955 +#define AR6000_XIOCTL_SET_MAX_SP 30
42956 +/*
42957 + * arguments:
42958 + * UINT32 cmd (AR6000_XIOCTL_SET_MAX_SP)
42959 + * WMI_SET_MAX_SP_LEN_CMD maxSPLen(see include/wmi.h)
42960 + * uses: WMI_SET_MAX_SP_LEN_CMDID
42961 + */
42962 +
42963 +#define AR6000_XIOCTL_WMI_GET_ROAM_TBL 31
42964 +
42965 +#define AR6000_XIOCTL_WMI_SET_ROAM_CTRL 32
42966 +
42967 +#define AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS 33
42968 +
42969 +
42970 +/*
42971 + * arguments:
42972 + * UINT32 cmd (AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS)
42973 + * WMI_SET_POWERSAVE_TIMERS_CMD powerSaveTimers(see include/wmi.h)
42974 + * WMI_SET_POWERSAVE_TIMERS_CMDID
42975 + */
42976 +
42977 +#define AR6000_XIOCTRL_WMI_GET_POWER_MODE 34
42978 +/*
42979 + * arguments:
42980 + * UINT32 cmd (AR6000_XIOCTRL_WMI_GET_POWER_MODE)
42981 + */
42982 +
42983 +#define AR6000_XIOCTRL_WMI_SET_WLAN_STATE 35
42984 +typedef enum {
42985 + WLAN_DISABLED,
42986 + WLAN_ENABLED
42987 +} AR6000_WLAN_STATE;
42988 +/*
42989 + * arguments:
42990 + * enable/disable
42991 + */
42992 +
42993 +#define AR6000_XIOCTL_WMI_GET_ROAM_DATA 36
42994 +
42995 +#define AR6000_XIOCTL_WMI_SETRETRYLIMITS 37
42996 +/*
42997 + * arguments:
42998 + * WMI_SET_RETRY_LIMITS_CMD ibssSetRetryLimitsCmd
42999 + * uses: WMI_SET_RETRY_LIMITS_CMDID
43000 + */
43001 +
43002 +#ifdef CONFIG_HOST_TCMD_SUPPORT
43003 +/* ====extended commands for radio test ==== */
43004 +
43005 +#define AR6000_XIOCTL_TCMD_CONT_TX 38
43006 +/*
43007 + * arguments:
43008 + * UINT32 cmd (AR6000_XIOCTL_TCMD_CONT_TX)
43009 + * WMI_TCMD_CONT_TX_CMD contTxCmd (see include/wmi.h)
43010 + * uses: WMI_TCMD_CONT_TX_CMDID
43011 + */
43012 +
43013 +#define AR6000_XIOCTL_TCMD_CONT_RX 39
43014 +/*
43015 + * arguments:
43016 + * UINT32 cmd (AR6000_XIOCTL_TCMD_CONT_RX)
43017 + * WMI_TCMD_CONT_RX_CMD rxCmd (see include/wmi.h)
43018 + * uses: WMI_TCMD_CONT_RX_CMDID
43019 + */
43020 +
43021 +#define AR6000_XIOCTL_TCMD_PM 40
43022 +/*
43023 + * arguments:
43024 + * UINT32 cmd (AR6000_XIOCTL_TCMD_PM)
43025 + * WMI_TCMD_PM_CMD pmCmd (see include/wmi.h)
43026 + * uses: WMI_TCMD_PM_CMDID
43027 + */
43028 +
43029 +#endif /* CONFIG_HOST_TCMD_SUPPORT */
43030 +
43031 +#define AR6000_XIOCTL_WMI_STARTSCAN 41
43032 +/*
43033 + * arguments:
43034 + * UINT32 cmd (AR6000_XIOCTL_WMI_STARTSCAN)
43035 + * UINT8 scanType
43036 + * UINT8 scanConnected
43037 + * A_BOOL forceFgScan
43038 + * uses: WMI_START_SCAN_CMDID
43039 + */
43040 +
43041 +#define AR6000_XIOCTL_WMI_SETFIXRATES 42
43042 +
43043 +#define AR6000_XIOCTL_WMI_GETFIXRATES 43
43044 +
43045 +
43046 +#define AR6000_XIOCTL_WMI_SET_RSSITHRESHOLD 44
43047 +/*
43048 + * arguments:
43049 + * WMI_RSSI_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
43050 + * uses: WMI_RSSI_THRESHOLD_PARAMS_CMDID
43051 + */
43052 +
43053 +#define AR6000_XIOCTL_WMI_CLR_RSSISNR 45
43054 +/*
43055 + * arguments:
43056 + * WMI_CLR_RSSISNR_CMD thresholdParams (see include/wmi.h)
43057 + * uses: WMI_CLR_RSSISNR_CMDID
43058 + */
43059 +
43060 +#define AR6000_XIOCTL_WMI_SET_LQTHRESHOLD 46
43061 +/*
43062 + * arguments:
43063 + * WMI_LQ_THRESHOLD_PARAMS_CMD thresholdParams (see include/wmi.h)
43064 + * uses: WMI_LQ_THRESHOLD_PARAMS_CMDID
43065 + */
43066 +
43067 +#define AR6000_XIOCTL_WMI_SET_RTS 47
43068 +/*
43069 + * arguments:
43070 + * WMI_SET_RTS_MODE_CMD (see include/wmi.h)
43071 + * uses: WMI_SET_RTS_MODE_CMDID
43072 + */
43073 +
43074 +#define AR6000_XIOCTL_WMI_SET_LPREAMBLE 48
43075 +
43076 +#define AR6000_XIOCTL_WMI_SET_AUTHMODE 49
43077 +/*
43078 + * arguments:
43079 + * UINT32 cmd (AR6000_XIOCTL_WMI_SET_AUTHMODE)
43080 + * UINT8 mode
43081 + * uses: WMI_SET_RECONNECT_AUTH_MODE_CMDID
43082 + */
43083 +
43084 +#define AR6000_XIOCTL_WMI_SET_REASSOCMODE 50
43085 +
43086 +/*
43087 + * arguments:
43088 + * UINT32 cmd (AR6000_XIOCTL_WMI_SET_WMM)
43089 + * UINT8 mode
43090 + * uses: WMI_SET_WMM_CMDID
43091 + */
43092 +#define AR6000_XIOCTL_WMI_SET_WMM 51
43093 +
43094 +/*
43095 + * arguments:
43096 + * UINT32 cmd (AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS)
43097 + * UINT32 frequency
43098 + * UINT8 threshold
43099 + */
43100 +#define AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS 52
43101 +
43102 +/*
43103 + * arguments:
43104 + * UINT32 cmd (AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP)
43105 + * UINT32 cookie
43106 + */
43107 +#define AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP 53
43108 +
43109 +/*
43110 + * arguments:
43111 + * UINT32 cmd (AR6000_XIOCTL_WMI_GET_RD)
43112 + * UINT32 regDomain
43113 + */
43114 +#define AR6000_XIOCTL_WMI_GET_RD 54
43115 +
43116 +#define AR6000_XIOCTL_DIAG_READ 55
43117 +
43118 +#define AR6000_XIOCTL_DIAG_WRITE 56
43119 +
43120 +/*
43121 + * arguments cmd (AR6000_XIOCTL_SET_TXOP)
43122 + * WMI_TXOP_CFG txopEnable
43123 + */
43124 +#define AR6000_XIOCTL_WMI_SET_TXOP 57
43125 +
43126 +#ifdef USER_KEYS
43127 +/*
43128 + * arguments:
43129 + * UINT32 cmd (AR6000_XIOCTL_USER_SETKEYS)
43130 + * UINT32 keyOpCtrl
43131 + * uses AR6000_USER_SETKEYS_INFO
43132 + */
43133 +#define AR6000_XIOCTL_USER_SETKEYS 58
43134 +#endif /* USER_KEYS */
43135 +
43136 +#define AR6000_XIOCTL_WMI_SET_KEEPALIVE 59
43137 +/*
43138 + * arguments:
43139 + * UINT8 cmd (AR6000_XIOCTL_WMI_SET_KEEPALIVE)
43140 + * UINT8 keepaliveInterval
43141 + * uses: WMI_SET_KEEPALIVE_CMDID
43142 + */
43143 +
43144 +#define AR6000_XIOCTL_WMI_GET_KEEPALIVE 60
43145 +/*
43146 + * arguments:
43147 + * UINT8 cmd (AR6000_XIOCTL_WMI_GET_KEEPALIVE)
43148 + * UINT8 keepaliveInterval
43149 + * A_BOOL configured
43150 + * uses: WMI_GET_KEEPALIVE_CMDID
43151 + */
43152 +
43153 +/* ====ROM Patching Extended Ioctls==== */
43154 +
43155 +#define AR6000_XIOCTL_BMI_ROMPATCH_INSTALL 61
43156 +/*
43157 + * arguments:
43158 + * union {
43159 + * struct {
43160 + * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_INSTALL)
43161 + * UINT32 ROM Address
43162 + * UINT32 RAM Address
43163 + * UINT32 number of bytes
43164 + * UINT32 activate? (0 or 1)
43165 + * }
43166 + * A_UINT32 resulting rompatch ID
43167 + * }
43168 + * uses: BMI_ROMPATCH_INSTALL
43169 + */
43170 +
43171 +#define AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL 62
43172 +/*
43173 + * arguments:
43174 + * struct {
43175 + * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL)
43176 + * UINT32 rompatch ID
43177 + * }
43178 + * uses: BMI_ROMPATCH_UNINSTALL
43179 + */
43180 +
43181 +#define AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE 63
43182 +/*
43183 + * arguments:
43184 + * struct {
43185 + * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE)
43186 + * UINT32 rompatch count
43187 + * UINT32 rompatch IDs[rompatch count]
43188 + * }
43189 + * uses: BMI_ROMPATCH_ACTIVATE
43190 + */
43191 +
43192 +#define AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE 64
43193 +/*
43194 + * arguments:
43195 + * struct {
43196 + * UINT32 cmd (AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE)
43197 + * UINT32 rompatch count
43198 + * UINT32 rompatch IDs[rompatch count]
43199 + * }
43200 + * uses: BMI_ROMPATCH_DEACTIVATE
43201 + */
43202 +
43203 +#define AR6000_XIOCTL_WMI_SET_APPIE 65
43204 +/*
43205 + * arguments:
43206 + * struct {
43207 + * UINT32 cmd (AR6000_XIOCTL_WMI_SET_APPIE)
43208 + * UINT32 app_frmtype;
43209 + * UINT32 app_buflen;
43210 + * UINT8 app_buf[];
43211 + * }
43212 + */
43213 +#define AR6000_XIOCTL_WMI_SET_MGMT_FRM_RX_FILTER 66
43214 +/*
43215 + * arguments:
43216 + * A_UINT32 filter_type;
43217 + */
43218 +
43219 +#define AR6000_XIOCTL_DBGLOG_CFG_MODULE 67
43220 +
43221 +#define AR6000_XIOCTL_DBGLOG_GET_DEBUG_LOGS 68
43222 +
43223 +#define AR6000_XIOCTL_WMI_SET_WSC_STATUS 70
43224 +/*
43225 + * arguments:
43226 + * A_UINT32 wsc_status;
43227 + * (WSC_REG_INACTIVE or WSC_REG_ACTIVE)
43228 + */
43229 +
43230 +/*
43231 + * arguments:
43232 + * struct {
43233 + * A_UINT8 streamType;
43234 + * A_UINT8 status;
43235 + * }
43236 + * uses: WMI_SET_BT_STATUS_CMDID
43237 + */
43238 +#define AR6000_XIOCTL_WMI_SET_BT_STATUS 71
43239 +
43240 +/*
43241 + * arguments:
43242 + * struct {
43243 + * A_UINT8 paramType;
43244 + * union {
43245 + * A_UINT8 noSCOPkts;
43246 + * BT_PARAMS_A2DP a2dpParams;
43247 + * BT_COEX_REGS regs;
43248 + * };
43249 + * }
43250 + * uses: WMI_SET_BT_PARAM_CMDID
43251 + */
43252 +#define AR6000_XIOCTL_WMI_SET_BT_PARAMS 72
43253 +
43254 +#define AR6000_XIOCTL_WMI_SET_HOST_SLEEP_MODE 73
43255 +#define AR6000_XIOCTL_WMI_SET_WOW_MODE 74
43256 +#define AR6000_XIOCTL_WMI_GET_WOW_LIST 75
43257 +#define AR6000_XIOCTL_WMI_ADD_WOW_PATTERN 76
43258 +#define AR6000_XIOCTL_WMI_DEL_WOW_PATTERN 77
43259 +
43260 +
43261 +
43262 +#define AR6000_XIOCTL_TARGET_INFO 78
43263 +/*
43264 + * arguments:
43265 + * UINT32 cmd (AR6000_XIOCTL_TARGET_INFO)
43266 + * A_UINT32 TargetVersion (returned)
43267 + * A_UINT32 TargetType (returned)
43268 + * (See also bmi_msg.h target_ver and target_type)
43269 + */
43270 +
43271 +#define AR6000_XIOCTL_DUMP_HTC_CREDIT_STATE 79
43272 +/*
43273 + * arguments:
43274 + * none
43275 + */
43276 +
43277 +#define AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE 80
43278 +/*
43279 + * This ioctl is used to emulate traffic activity
43280 + * timeouts. Activity/inactivity will trigger the driver
43281 + * to re-balance credits.
43282 + *
43283 + * arguments:
43284 + * ar6000_traffic_activity_change
43285 + */
43286 +
43287 +#define AR6000_XIOCTL_WMI_SET_CONNECT_CTRL_FLAGS 81
43288 +/*
43289 + * This ioctl is used to set the connect control flags
43290 + *
43291 + * arguments:
43292 + * A_UINT32 connectCtrlFlags
43293 + */
43294 +
43295 +#define AR6000_XIOCTL_WMI_SET_AKMP_PARAMS 82
43296 +/*
43297 + * This IOCTL sets any Authentication,Key Management and Protection
43298 + * related parameters. This is used along with the information set in
43299 + * Connect Command.
43300 + * Currently this enables Multiple PMKIDs to an AP.
43301 + *
43302 + * arguments:
43303 + * struct {
43304 + * A_UINT32 akmpInfo;
43305 + * }
43306 + * uses: WMI_SET_AKMP_PARAMS_CMD
43307 + */
43308 +
43309 +#define AR6000_XIOCTL_WMI_GET_PMKID_LIST 83
43310 +
43311 +#define AR6000_XIOCTL_WMI_SET_PMKID_LIST 84
43312 +/*
43313 + * This IOCTL is used to set a list of PMKIDs. This list of
43314 + * PMKIDs is used in the [Re]AssocReq Frame. This list is used
43315 + * only if the MultiPMKID option is enabled via the
43316 + * AR6000_XIOCTL_WMI_SET_AKMP_PARAMS IOCTL.
43317 + *
43318 + * arguments:
43319 + * struct {
43320 + * A_UINT32 numPMKID;
43321 + * WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
43322 + * }
43323 + * uses: WMI_SET_PMKIDLIST_CMD
43324 + */
43325 +
43326 +/* Historical DSETPATCH support for INI patches */
43327 +#define AR6000_XIOCTL_UNUSED90 90
43328 +
43329 +
43330 +
43331 +/* used by AR6000_IOCTL_WMI_GETREV */
43332 +struct ar6000_version {
43333 + A_UINT32 host_ver;
43334 + A_UINT32 target_ver;
43335 +};
43336 +
43337 +/* used by AR6000_IOCTL_WMI_GET_QOS_QUEUE */
43338 +struct ar6000_queuereq {
43339 + A_UINT8 trafficClass;
43340 + A_UINT16 activeTsids;
43341 +};
43342 +
43343 +/* used by AR6000_IOCTL_WMI_GET_TARGET_STATS */
43344 +typedef struct targetStats_t {
43345 + A_UINT64 tx_packets;
43346 + A_UINT64 tx_bytes;
43347 + A_UINT64 tx_unicast_pkts;
43348 + A_UINT64 tx_unicast_bytes;
43349 + A_UINT64 tx_multicast_pkts;
43350 + A_UINT64 tx_multicast_bytes;
43351 + A_UINT64 tx_broadcast_pkts;
43352 + A_UINT64 tx_broadcast_bytes;
43353 + A_UINT64 tx_rts_success_cnt;
43354 + A_UINT64 tx_packet_per_ac[4];
43355 +
43356 + A_UINT64 tx_errors;
43357 + A_UINT64 tx_failed_cnt;
43358 + A_UINT64 tx_retry_cnt;
43359 + A_UINT64 tx_rts_fail_cnt;
43360 + A_INT32 tx_unicast_rate;
43361 + A_UINT64 rx_packets;
43362 + A_UINT64 rx_bytes;
43363 + A_UINT64 rx_unicast_pkts;
43364 + A_UINT64 rx_unicast_bytes;
43365 + A_UINT64 rx_multicast_pkts;
43366 + A_UINT64 rx_multicast_bytes;
43367 + A_UINT64 rx_broadcast_pkts;
43368 + A_UINT64 rx_broadcast_bytes;
43369 + A_UINT64 rx_fragment_pkt;
43370 +
43371 + A_UINT64 rx_errors;
43372 + A_UINT64 rx_crcerr;
43373 + A_UINT64 rx_key_cache_miss;
43374 + A_UINT64 rx_decrypt_err;
43375 + A_UINT64 rx_duplicate_frames;
43376 + A_INT32 rx_unicast_rate;
43377 +
43378 + A_UINT64 tkip_local_mic_failure;
43379 + A_UINT64 tkip_counter_measures_invoked;
43380 + A_UINT64 tkip_replays;
43381 + A_UINT64 tkip_format_errors;
43382 + A_UINT64 ccmp_format_errors;
43383 + A_UINT64 ccmp_replays;
43384 +
43385 + A_UINT64 power_save_failure_cnt;
43386 + A_INT16 noise_floor_calibation;
43387 +
43388 + A_UINT64 cs_bmiss_cnt;
43389 + A_UINT64 cs_lowRssi_cnt;
43390 + A_UINT64 cs_connect_cnt;
43391 + A_UINT64 cs_disconnect_cnt;
43392 + A_UINT8 cs_aveBeacon_snr;
43393 + A_INT16 cs_aveBeacon_rssi;
43394 + A_UINT8 cs_lastRoam_msec;
43395 + A_UINT8 cs_snr;
43396 + A_INT16 cs_rssi;
43397 +
43398 + A_UINT32 lq_val;
43399 +
43400 + A_UINT32 wow_num_pkts_dropped;
43401 + A_UINT8 wow_num_host_pkt_wakeups;
43402 + A_UINT8 wow_num_host_event_wakeups;
43403 + A_UINT16 wow_num_events_discarded;
43404 +
43405 +}TARGET_STATS;
43406 +
43407 +typedef struct targetStats_cmd_t {
43408 + TARGET_STATS targetStats;
43409 + int clearStats;
43410 +} TARGET_STATS_CMD;
43411 +
43412 +/* used by AR6000_XIOCTL_USER_SETKEYS */
43413 +
43414 +/*
43415 + * Setting this bit to 1 doesnot initialize the RSC on the firmware
43416 + */
43417 +#define AR6000_XIOCTL_USER_SETKEYS_RSC_CTRL 1
43418 +#define AR6000_USER_SETKEYS_RSC_UNCHANGED 0x00000002
43419 +
43420 +typedef struct {
43421 + A_UINT32 keyOpCtrl; /* Bit Map of Key Mgmt Ctrl Flags */
43422 +} AR6000_USER_SETKEYS_INFO;
43423 +
43424 +
43425 +/* used by AR6000_XIOCTL_GPIO_OUTPUT_SET */
43426 +struct ar6000_gpio_output_set_cmd_s {
43427 + A_UINT32 set_mask;
43428 + A_UINT32 clear_mask;
43429 + A_UINT32 enable_mask;
43430 + A_UINT32 disable_mask;
43431 +};
43432 +
43433 +/*
43434 + * used by AR6000_XIOCTL_GPIO_REGISTER_GET and AR6000_XIOCTL_GPIO_REGISTER_SET
43435 + */
43436 +struct ar6000_gpio_register_cmd_s {
43437 + A_UINT32 gpioreg_id;
43438 + A_UINT32 value;
43439 +};
43440 +
43441 +/* used by AR6000_XIOCTL_GPIO_INTR_ACK */
43442 +struct ar6000_gpio_intr_ack_cmd_s {
43443 + A_UINT32 ack_mask;
43444 +};
43445 +
43446 +/* used by AR6000_XIOCTL_GPIO_INTR_WAIT */
43447 +struct ar6000_gpio_intr_wait_cmd_s {
43448 + A_UINT32 intr_mask;
43449 + A_UINT32 input_values;
43450 +};
43451 +
43452 +/* used by the AR6000_XIOCTL_DBGLOG_CFG_MODULE */
43453 +typedef struct ar6000_dbglog_module_config_s {
43454 + A_UINT32 valid;
43455 + A_UINT16 mmask;
43456 + A_UINT16 tsr;
43457 + A_BOOL rep;
43458 + A_UINT16 size;
43459 +} DBGLOG_MODULE_CONFIG;
43460 +
43461 +typedef struct user_rssi_thold_t {
43462 + A_INT16 tag;
43463 + A_INT16 rssi;
43464 +} USER_RSSI_THOLD;
43465 +
43466 +typedef struct user_rssi_params_t {
43467 + A_UINT8 weight;
43468 + A_UINT32 pollTime;
43469 + USER_RSSI_THOLD tholds[12];
43470 +} USER_RSSI_PARAMS;
43471 +
43472 +/*
43473 + * Host driver may have some config parameters. Typically, these
43474 + * config params are one time config parameters. These could
43475 + * correspond to any of the underlying modules. Host driver exposes
43476 + * an api for the underlying modules to get this config.
43477 + */
43478 +#define AR6000_DRIVER_CFG_BASE 0x8000
43479 +
43480 +/* Should driver perform wlan node caching? */
43481 +#define AR6000_DRIVER_CFG_GET_WLANNODECACHING 0x8001
43482 +/*Should we log raw WMI msgs */
43483 +#define AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS 0x8002
43484 +
43485 +/* used by AR6000_XIOCTL_DIAG_READ & AR6000_XIOCTL_DIAG_WRITE */
43486 +struct ar6000_diag_window_cmd_s {
43487 + unsigned int addr;
43488 + unsigned int value;
43489 +};
43490 +
43491 +
43492 +struct ar6000_traffic_activity_change {
43493 + A_UINT32 StreamID; /* stream ID to indicate activity change */
43494 + A_UINT32 Active; /* active (1) or inactive (0) */
43495 +};
43496 +
43497 +#ifdef __cplusplus
43498 +}
43499 +#endif
43500 +#endif
43501 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/athtypes_linux.h
43502 ===================================================================
43503 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
43504 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/athtypes_linux.h 2008-12-11 22:46:49.000000000 +0100
43505 @@ -0,0 +1,47 @@
43506 +/*
43507 + * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/athtypes_linux.h#1 $
43508 + *
43509 + * This file contains the definitions of the basic atheros data types.
43510 + * It is used to map the data types in atheros files to a platform specific
43511 + * type.
43512 + *
43513 + * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
43514 + *
43515 + *
43516 + * This program is free software; you can redistribute it and/or modify
43517 + * it under the terms of the GNU General Public License version 2 as
43518 + * published by the Free Software Foundation;
43519 + *
43520 + * Software distributed under the License is distributed on an "AS
43521 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
43522 + * implied. See the License for the specific language governing
43523 + * rights and limitations under the License.
43524 + *
43525 + *
43526 + *
43527 + */
43528 +
43529 +#ifndef _ATHTYPES_LINUX_H_
43530 +#define _ATHTYPES_LINUX_H_
43531 +
43532 +#ifdef __KERNEL__
43533 +#include <linux/types.h>
43534 +#endif
43535 +
43536 +typedef int8_t A_INT8;
43537 +typedef int16_t A_INT16;
43538 +typedef int32_t A_INT32;
43539 +typedef int64_t A_INT64;
43540 +
43541 +typedef u_int8_t A_UINT8;
43542 +typedef u_int16_t A_UINT16;
43543 +typedef u_int32_t A_UINT32;
43544 +typedef u_int64_t A_UINT64;
43545 +
43546 +typedef int A_BOOL;
43547 +typedef char A_CHAR;
43548 +typedef unsigned char A_UCHAR;
43549 +typedef unsigned long A_ATH_TIMER;
43550 +
43551 +
43552 +#endif /* _ATHTYPES_LINUX_H_ */
43553 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/config_linux.h
43554 ===================================================================
43555 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
43556 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/config_linux.h 2008-12-11 22:46:49.000000000 +0100
43557 @@ -0,0 +1,44 @@
43558 +/*
43559 + * Copyright (c) 2004-2007 Atheros Communications Inc.
43560 + * All rights reserved.
43561 + *
43562 + *
43563 + * This program is free software; you can redistribute it and/or modify
43564 + * it under the terms of the GNU General Public License version 2 as
43565 + * published by the Free Software Foundation;
43566 + *
43567 + * Software distributed under the License is distributed on an "AS
43568 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
43569 + * implied. See the License for the specific language governing
43570 + * rights and limitations under the License.
43571 + *
43572 + *
43573 + *
43574 + */
43575 +
43576 +#ifndef _CONFIG_LINUX_H_
43577 +#define _CONFIG_LINUX_H_
43578 +
43579 +#ifdef __cplusplus
43580 +extern "C" {
43581 +#endif
43582 +
43583 +/*
43584 + * Host-side GPIO support is optional.
43585 + * If run-time access to GPIO pins is not required, then
43586 + * this should be changed to #undef.
43587 + */
43588 +#define CONFIG_HOST_GPIO_SUPPORT
43589 +
43590 +/*
43591 + * Host side Test Command support
43592 + */
43593 +#define CONFIG_HOST_TCMD_SUPPORT
43594 +
43595 +#define USE_4BYTE_REGISTER_ACCESS
43596 +
43597 +#ifdef __cplusplus
43598 +}
43599 +#endif
43600 +
43601 +#endif
43602 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/debug_linux.h
43603 ===================================================================
43604 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
43605 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/debug_linux.h 2008-12-11 22:46:49.000000000 +0100
43606 @@ -0,0 +1,86 @@
43607 +/*
43608 + * Copyright (c) 2004-2006 Atheros Communications Inc.
43609 + * All rights reserved.
43610 + *
43611 + *
43612 + * This program is free software; you can redistribute it and/or modify
43613 + * it under the terms of the GNU General Public License version 2 as
43614 + * published by the Free Software Foundation;
43615 + *
43616 + * Software distributed under the License is distributed on an "AS
43617 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
43618 + * implied. See the License for the specific language governing
43619 + * rights and limitations under the License.
43620 + *
43621 + *
43622 + *
43623 + */
43624 +
43625 +#ifndef _DEBUG_LINUX_H_
43626 +#define _DEBUG_LINUX_H_
43627 +
43628 +#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
43629 +
43630 +extern A_UINT32 g_dbg_flags;
43631 +
43632 +#define DBGFMT "%s() : "
43633 +#define DBGARG __func__
43634 +#define DBGFN A_PRINTF
43635 +
43636 +/* ------- Debug related stuff ------- */
43637 +enum {
43638 + ATH_DEBUG_SEND = 0x0001,
43639 + ATH_DEBUG_RECV = 0x0002,
43640 + ATH_DEBUG_SYNC = 0x0004,
43641 + ATH_DEBUG_DUMP = 0x0008,
43642 + ATH_DEBUG_IRQ = 0x0010,
43643 + ATH_DEBUG_TRC = 0x0020,
43644 + ATH_DEBUG_WARN = 0x0040,
43645 + ATH_DEBUG_ERR = 0x0080,
43646 + ATH_LOG_INF = 0x0100,
43647 + ATH_DEBUG_BMI = 0x0110,
43648 + ATH_DEBUG_WMI = 0x0120,
43649 + ATH_DEBUG_HIF = 0x0140,
43650 + ATH_DEBUG_HTC = 0x0180,
43651 + ATH_DEBUG_WLAN = 0x1000,
43652 + ATH_LOG_ERR = 0x1010,
43653 + ATH_DEBUG_ANY = 0xFFFF,
43654 +};
43655 +
43656 +#ifdef DEBUG
43657 +
43658 +#define A_DPRINTF(f, a) \
43659 + if(g_dbg_flags & (f)) \
43660 + { \
43661 + DBGFN a ; \
43662 + }
43663 +
43664 +
43665 +// TODO FIX usage of A_PRINTF!
43666 +#define AR_DEBUG_LVL_CHECK(lvl) (debughtc & (lvl))
43667 +#define AR_DEBUG_PRINTBUF(buffer, length, desc) do { \
43668 + if (debughtc & ATH_DEBUG_DUMP) { \
43669 + DebugDumpBytes(buffer, length,desc); \
43670 + } \
43671 +} while(0)
43672 +#define PRINTX_ARG(arg...) arg
43673 +#define AR_DEBUG_PRINTF(flags, args) do { \
43674 + if (debughtc & (flags)) { \
43675 + A_PRINTF(KERN_ALERT PRINTX_ARG args); \
43676 + } \
43677 +} while (0)
43678 +#define AR_DEBUG_ASSERT(test) do { \
43679 + if (!(test)) { \
43680 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Debug Assert Caught, File %s, Line: %d, Test:%s \n",__FILE__, __LINE__,#test)); \
43681 + } \
43682 +} while(0)
43683 +extern int debughtc;
43684 +#else
43685 +#define AR_DEBUG_PRINTF(flags, args)
43686 +#define AR_DEBUG_PRINTBUF(buffer, length, desc)
43687 +#define AR_DEBUG_ASSERT(test)
43688 +#define AR_DEBUG_LVL_CHECK(lvl) 0
43689 +#define A_DPRINTF(f, a)
43690 +#endif
43691 +
43692 +#endif /* _DEBUG_LINUX_H_ */
43693 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ioctl.c
43694 ===================================================================
43695 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
43696 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/ioctl.c 2008-12-11 22:46:49.000000000 +0100
43697 @@ -0,0 +1,2540 @@
43698 +/*
43699 + *
43700 + * Copyright (c) 2004-2007 Atheros Communications Inc.
43701 + * All rights reserved.
43702 + *
43703 + *
43704 + * This program is free software; you can redistribute it and/or modify
43705 + * it under the terms of the GNU General Public License version 2 as
43706 + * published by the Free Software Foundation;
43707 + *
43708 + * Software distributed under the License is distributed on an "AS
43709 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
43710 + * implied. See the License for the specific language governing
43711 + * rights and limitations under the License.
43712 + *
43713 + *
43714 + *
43715 + */
43716 +
43717 +#include "ar6000_drv.h"
43718 +
43719 +static A_UINT8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
43720 +static A_UINT8 null_mac[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
43721 +extern USER_RSSI_THOLD rssi_map[12];
43722 +extern unsigned int wmitimeout;
43723 +extern A_WAITQUEUE_HEAD arEvent;
43724 +extern int tspecCompliance;
43725 +extern int bmienable;
43726 +extern int bypasswmi;
43727 +
43728 +static int
43729 +ar6000_ioctl_get_roam_tbl(struct net_device *dev, struct ifreq *rq)
43730 +{
43731 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43732 +
43733 + if (ar->arWmiReady == FALSE) {
43734 + return -EIO;
43735 + }
43736 +
43737 + if(wmi_get_roam_tbl_cmd(ar->arWmi) != A_OK) {
43738 + return -EIO;
43739 + }
43740 +
43741 + return 0;
43742 +}
43743 +
43744 +static int
43745 +ar6000_ioctl_get_roam_data(struct net_device *dev, struct ifreq *rq)
43746 +{
43747 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43748 +
43749 + if (ar->arWmiReady == FALSE) {
43750 + return -EIO;
43751 + }
43752 +
43753 +
43754 + /* currently assume only roam times are required */
43755 + if(wmi_get_roam_data_cmd(ar->arWmi, ROAM_DATA_TIME) != A_OK) {
43756 + return -EIO;
43757 + }
43758 +
43759 +
43760 + return 0;
43761 +}
43762 +
43763 +static int
43764 +ar6000_ioctl_set_roam_ctrl(struct net_device *dev, char *userdata)
43765 +{
43766 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43767 + WMI_SET_ROAM_CTRL_CMD cmd;
43768 + A_UINT8 size = sizeof(cmd);
43769 +
43770 + if (ar->arWmiReady == FALSE) {
43771 + return -EIO;
43772 + }
43773 +
43774 +
43775 + if (copy_from_user(&cmd, userdata, size)) {
43776 + return -EFAULT;
43777 + }
43778 +
43779 + if (cmd.roamCtrlType == WMI_SET_HOST_BIAS) {
43780 + if (cmd.info.bssBiasInfo.numBss > 1) {
43781 + size += (cmd.info.bssBiasInfo.numBss - 1) * sizeof(WMI_BSS_BIAS);
43782 + }
43783 + }
43784 +
43785 + if (copy_from_user(&cmd, userdata, size)) {
43786 + return -EFAULT;
43787 + }
43788 +
43789 + if(wmi_set_roam_ctrl_cmd(ar->arWmi, &cmd, size) != A_OK) {
43790 + return -EIO;
43791 + }
43792 +
43793 + return 0;
43794 +}
43795 +
43796 +static int
43797 +ar6000_ioctl_set_powersave_timers(struct net_device *dev, char *userdata)
43798 +{
43799 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43800 + WMI_POWERSAVE_TIMERS_POLICY_CMD cmd;
43801 + A_UINT8 size = sizeof(cmd);
43802 +
43803 + if (ar->arWmiReady == FALSE) {
43804 + return -EIO;
43805 + }
43806 +
43807 + if (copy_from_user(&cmd, userdata, size)) {
43808 + return -EFAULT;
43809 + }
43810 +
43811 + if (copy_from_user(&cmd, userdata, size)) {
43812 + return -EFAULT;
43813 + }
43814 +
43815 + if(wmi_set_powersave_timers_cmd(ar->arWmi, &cmd, size) != A_OK) {
43816 + return -EIO;
43817 + }
43818 +
43819 + return 0;
43820 +}
43821 +
43822 +static int
43823 +ar6000_ioctl_set_wmm(struct net_device *dev, struct ifreq *rq)
43824 +{
43825 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43826 + WMI_SET_WMM_CMD cmd;
43827 + A_STATUS ret;
43828 +
43829 + if ((dev->flags & IFF_UP) != IFF_UP) {
43830 + return -EIO;
43831 + }
43832 + if (ar->arWmiReady == FALSE) {
43833 + return -EIO;
43834 + }
43835 +
43836 + if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
43837 + sizeof(cmd)))
43838 + {
43839 + return -EFAULT;
43840 + }
43841 +
43842 + if (cmd.status == WMI_WMM_ENABLED) {
43843 + ar->arWmmEnabled = TRUE;
43844 + } else {
43845 + ar->arWmmEnabled = FALSE;
43846 + }
43847 +
43848 + ret = wmi_set_wmm_cmd(ar->arWmi, cmd.status);
43849 +
43850 + switch (ret) {
43851 + case A_OK:
43852 + return 0;
43853 + case A_EBUSY :
43854 + return -EBUSY;
43855 + case A_NO_MEMORY:
43856 + return -ENOMEM;
43857 + case A_EINVAL:
43858 + default:
43859 + return -EFAULT;
43860 + }
43861 +}
43862 +
43863 +static int
43864 +ar6000_ioctl_set_txop(struct net_device *dev, struct ifreq *rq)
43865 +{
43866 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43867 + WMI_SET_WMM_TXOP_CMD cmd;
43868 + A_STATUS ret;
43869 +
43870 + if ((dev->flags & IFF_UP) != IFF_UP) {
43871 + return -EIO;
43872 + }
43873 + if (ar->arWmiReady == FALSE) {
43874 + return -EIO;
43875 + }
43876 +
43877 + if (copy_from_user(&cmd, (char *)((unsigned int*)rq->ifr_data + 1),
43878 + sizeof(cmd)))
43879 + {
43880 + return -EFAULT;
43881 + }
43882 +
43883 + ret = wmi_set_wmm_txop(ar->arWmi, cmd.txopEnable);
43884 +
43885 + switch (ret) {
43886 + case A_OK:
43887 + return 0;
43888 + case A_EBUSY :
43889 + return -EBUSY;
43890 + case A_NO_MEMORY:
43891 + return -ENOMEM;
43892 + case A_EINVAL:
43893 + default:
43894 + return -EFAULT;
43895 + }
43896 +}
43897 +
43898 +static int
43899 +ar6000_ioctl_get_rd(struct net_device *dev, struct ifreq *rq)
43900 +{
43901 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43902 + A_STATUS ret = 0;
43903 +
43904 + if ((dev->flags & IFF_UP) != IFF_UP || ar->arWmiReady == FALSE) {
43905 + return -EIO;
43906 + }
43907 +
43908 + if(copy_to_user((char *)((unsigned int*)rq->ifr_data + 1),
43909 + &ar->arRegCode, sizeof(ar->arRegCode)))
43910 + ret = -EFAULT;
43911 +
43912 + return ret;
43913 +}
43914 +
43915 +
43916 +/* Get power mode command */
43917 +static int
43918 +ar6000_ioctl_get_power_mode(struct net_device *dev, struct ifreq *rq)
43919 +{
43920 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43921 + WMI_POWER_MODE_CMD power_mode;
43922 + int ret = 0;
43923 +
43924 + if (ar->arWmiReady == FALSE) {
43925 + return -EIO;
43926 + }
43927 +
43928 + power_mode.powerMode = wmi_get_power_mode_cmd(ar->arWmi);
43929 + if (copy_to_user(rq->ifr_data, &power_mode, sizeof(WMI_POWER_MODE_CMD))) {
43930 + ret = -EFAULT;
43931 + }
43932 +
43933 + return ret;
43934 +}
43935 +
43936 +
43937 +static int
43938 +ar6000_ioctl_set_channelParams(struct net_device *dev, struct ifreq *rq)
43939 +{
43940 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43941 + WMI_CHANNEL_PARAMS_CMD cmd, *cmdp;
43942 + int ret = 0;
43943 +
43944 + if (ar->arWmiReady == FALSE) {
43945 + return -EIO;
43946 + }
43947 +
43948 +
43949 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
43950 + return -EFAULT;
43951 + }
43952 +
43953 + if (cmd.numChannels > 1) {
43954 + cmdp = A_MALLOC(130);
43955 + if (copy_from_user(cmdp, rq->ifr_data,
43956 + sizeof (*cmdp) +
43957 + ((cmd.numChannels - 1) * sizeof(A_UINT16))))
43958 + {
43959 + kfree(cmdp);
43960 + return -EFAULT;
43961 + }
43962 + } else {
43963 + cmdp = &cmd;
43964 + }
43965 +
43966 + if ((ar->arPhyCapability == WMI_11G_CAPABILITY) &&
43967 + ((cmdp->phyMode == WMI_11A_MODE) || (cmdp->phyMode == WMI_11AG_MODE)))
43968 + {
43969 + ret = -EINVAL;
43970 + }
43971 +
43972 + if (!ret &&
43973 + (wmi_set_channelParams_cmd(ar->arWmi, cmdp->scanParam, cmdp->phyMode,
43974 + cmdp->numChannels, cmdp->channelList)
43975 + != A_OK))
43976 + {
43977 + ret = -EIO;
43978 + }
43979 +
43980 + if (cmd.numChannels > 1) {
43981 + kfree(cmdp);
43982 + }
43983 +
43984 + return ret;
43985 +}
43986 +
43987 +static int
43988 +ar6000_ioctl_set_snr_threshold(struct net_device *dev, struct ifreq *rq)
43989 +{
43990 +
43991 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
43992 + WMI_SNR_THRESHOLD_PARAMS_CMD cmd;
43993 + int ret = 0;
43994 +
43995 + if (ar->arWmiReady == FALSE) {
43996 + return -EIO;
43997 + }
43998 +
43999 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44000 + return -EFAULT;
44001 + }
44002 +
44003 + if( wmi_set_snr_threshold_params(ar->arWmi, &cmd) != A_OK ) {
44004 + ret = -EIO;
44005 + }
44006 +
44007 + return ret;
44008 +}
44009 +
44010 +static int
44011 +ar6000_ioctl_set_rssi_threshold(struct net_device *dev, struct ifreq *rq)
44012 +{
44013 +#define SWAP_THOLD(thold1, thold2) do { \
44014 + USER_RSSI_THOLD tmpThold; \
44015 + tmpThold.tag = thold1.tag; \
44016 + tmpThold.rssi = thold1.rssi; \
44017 + thold1.tag = thold2.tag; \
44018 + thold1.rssi = thold2.rssi; \
44019 + thold2.tag = tmpThold.tag; \
44020 + thold2.rssi = tmpThold.rssi; \
44021 +} while (0)
44022 +
44023 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44024 + WMI_RSSI_THRESHOLD_PARAMS_CMD cmd;
44025 + USER_RSSI_PARAMS rssiParams;
44026 + A_INT32 i, j;
44027 +
44028 + int ret = 0;
44029 +
44030 + if (ar->arWmiReady == FALSE) {
44031 + return -EIO;
44032 + }
44033 +
44034 + if (copy_from_user((char *)&rssiParams, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(USER_RSSI_PARAMS))) {
44035 + return -EFAULT;
44036 + }
44037 + cmd.weight = rssiParams.weight;
44038 + cmd.pollTime = rssiParams.pollTime;
44039 +
44040 + A_MEMCPY(rssi_map, &rssiParams.tholds, sizeof(rssi_map));
44041 + /*
44042 + * only 6 elements, so use bubble sorting, in ascending order
44043 + */
44044 + for (i = 5; i > 0; i--) {
44045 + for (j = 0; j < i; j++) { /* above tholds */
44046 + if (rssi_map[j+1].rssi < rssi_map[j].rssi) {
44047 + SWAP_THOLD(rssi_map[j+1], rssi_map[j]);
44048 + } else if (rssi_map[j+1].rssi == rssi_map[j].rssi) {
44049 + return EFAULT;
44050 + }
44051 + }
44052 + }
44053 + for (i = 11; i > 6; i--) {
44054 + for (j = 6; j < i; j++) { /* below tholds */
44055 + if (rssi_map[j+1].rssi < rssi_map[j].rssi) {
44056 + SWAP_THOLD(rssi_map[j+1], rssi_map[j]);
44057 + } else if (rssi_map[j+1].rssi == rssi_map[j].rssi) {
44058 + return EFAULT;
44059 + }
44060 + }
44061 + }
44062 +
44063 +#ifdef DEBUG
44064 + for (i = 0; i < 12; i++) {
44065 + AR_DEBUG2_PRINTF("thold[%d].tag: %d, thold[%d].rssi: %d \n",
44066 + i, rssi_map[i].tag, i, rssi_map[i].rssi);
44067 + }
44068 +#endif
44069 + cmd.thresholdAbove1_Val = rssi_map[0].rssi;
44070 + cmd.thresholdAbove2_Val = rssi_map[1].rssi;
44071 + cmd.thresholdAbove3_Val = rssi_map[2].rssi;
44072 + cmd.thresholdAbove4_Val = rssi_map[3].rssi;
44073 + cmd.thresholdAbove5_Val = rssi_map[4].rssi;
44074 + cmd.thresholdAbove6_Val = rssi_map[5].rssi;
44075 + cmd.thresholdBelow1_Val = rssi_map[6].rssi;
44076 + cmd.thresholdBelow2_Val = rssi_map[7].rssi;
44077 + cmd.thresholdBelow3_Val = rssi_map[8].rssi;
44078 + cmd.thresholdBelow4_Val = rssi_map[9].rssi;
44079 + cmd.thresholdBelow5_Val = rssi_map[10].rssi;
44080 + cmd.thresholdBelow6_Val = rssi_map[11].rssi;
44081 +
44082 + if( wmi_set_rssi_threshold_params(ar->arWmi, &cmd) != A_OK ) {
44083 + ret = -EIO;
44084 + }
44085 +
44086 + return ret;
44087 +}
44088 +
44089 +static int
44090 +ar6000_ioctl_set_lq_threshold(struct net_device *dev, struct ifreq *rq)
44091 +{
44092 +
44093 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44094 + WMI_LQ_THRESHOLD_PARAMS_CMD cmd;
44095 + int ret = 0;
44096 +
44097 + if (ar->arWmiReady == FALSE) {
44098 + return -EIO;
44099 + }
44100 +
44101 + if (copy_from_user(&cmd, (char *)((unsigned int *)rq->ifr_data + 1), sizeof(cmd))) {
44102 + return -EFAULT;
44103 + }
44104 +
44105 + if( wmi_set_lq_threshold_params(ar->arWmi, &cmd) != A_OK ) {
44106 + ret = -EIO;
44107 + }
44108 +
44109 + return ret;
44110 +}
44111 +
44112 +
44113 +static int
44114 +ar6000_ioctl_set_probedSsid(struct net_device *dev, struct ifreq *rq)
44115 +{
44116 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44117 + WMI_PROBED_SSID_CMD cmd;
44118 + int ret = 0;
44119 +
44120 + if (ar->arWmiReady == FALSE) {
44121 + return -EIO;
44122 + }
44123 +
44124 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44125 + return -EFAULT;
44126 + }
44127 +
44128 + if (wmi_probedSsid_cmd(ar->arWmi, cmd.entryIndex, cmd.flag, cmd.ssidLength,
44129 + cmd.ssid) != A_OK)
44130 + {
44131 + ret = -EIO;
44132 + }
44133 +
44134 + return ret;
44135 +}
44136 +
44137 +static int
44138 +ar6000_ioctl_set_badAp(struct net_device *dev, struct ifreq *rq)
44139 +{
44140 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44141 + WMI_ADD_BAD_AP_CMD cmd;
44142 + int ret = 0;
44143 +
44144 + if (ar->arWmiReady == FALSE) {
44145 + return -EIO;
44146 + }
44147 +
44148 +
44149 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44150 + return -EFAULT;
44151 + }
44152 +
44153 + if (cmd.badApIndex > WMI_MAX_BAD_AP_INDEX) {
44154 + return -EIO;
44155 + }
44156 +
44157 + if (A_MEMCMP(cmd.bssid, null_mac, AR6000_ETH_ADDR_LEN) == 0) {
44158 + /*
44159 + * This is a delete badAP.
44160 + */
44161 + if (wmi_deleteBadAp_cmd(ar->arWmi, cmd.badApIndex) != A_OK) {
44162 + ret = -EIO;
44163 + }
44164 + } else {
44165 + if (wmi_addBadAp_cmd(ar->arWmi, cmd.badApIndex, cmd.bssid) != A_OK) {
44166 + ret = -EIO;
44167 + }
44168 + }
44169 +
44170 + return ret;
44171 +}
44172 +
44173 +static int
44174 +ar6000_ioctl_create_qos(struct net_device *dev, struct ifreq *rq)
44175 +{
44176 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44177 + WMI_CREATE_PSTREAM_CMD cmd;
44178 + A_STATUS ret;
44179 +
44180 + if (ar->arWmiReady == FALSE) {
44181 + return -EIO;
44182 + }
44183 +
44184 +
44185 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44186 + return -EFAULT;
44187 + }
44188 +
44189 + ret = wmi_verify_tspec_params(&cmd, tspecCompliance);
44190 + if (ret == A_OK)
44191 + ret = wmi_create_pstream_cmd(ar->arWmi, &cmd);
44192 +
44193 + switch (ret) {
44194 + case A_OK:
44195 + return 0;
44196 + case A_EBUSY :
44197 + return -EBUSY;
44198 + case A_NO_MEMORY:
44199 + return -ENOMEM;
44200 + case A_EINVAL:
44201 + default:
44202 + return -EFAULT;
44203 + }
44204 +}
44205 +
44206 +static int
44207 +ar6000_ioctl_delete_qos(struct net_device *dev, struct ifreq *rq)
44208 +{
44209 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44210 + WMI_DELETE_PSTREAM_CMD cmd;
44211 + int ret = 0;
44212 +
44213 + if (ar->arWmiReady == FALSE) {
44214 + return -EIO;
44215 + }
44216 +
44217 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44218 + return -EFAULT;
44219 + }
44220 +
44221 + ret = wmi_delete_pstream_cmd(ar->arWmi, cmd.trafficClass, cmd.tsid);
44222 +
44223 + switch (ret) {
44224 + case A_OK:
44225 + return 0;
44226 + case A_EBUSY :
44227 + return -EBUSY;
44228 + case A_NO_MEMORY:
44229 + return -ENOMEM;
44230 + case A_EINVAL:
44231 + default:
44232 + return -EFAULT;
44233 + }
44234 +}
44235 +
44236 +static int
44237 +ar6000_ioctl_get_qos_queue(struct net_device *dev, struct ifreq *rq)
44238 +{
44239 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44240 + struct ar6000_queuereq qreq;
44241 + int ret = 0;
44242 +
44243 + if (ar->arWmiReady == FALSE) {
44244 + return -EIO;
44245 + }
44246 +
44247 + if( copy_from_user(&qreq, rq->ifr_data,
44248 + sizeof(struct ar6000_queuereq)))
44249 + return -EFAULT;
44250 +
44251 + qreq.activeTsids = wmi_get_mapped_qos_queue(ar->arWmi, qreq.trafficClass);
44252 +
44253 + if (copy_to_user(rq->ifr_data, &qreq,
44254 + sizeof(struct ar6000_queuereq)))
44255 + {
44256 + ret = -EFAULT;
44257 + }
44258 +
44259 + return ret;
44260 +}
44261 +
44262 +#ifdef CONFIG_HOST_TCMD_SUPPORT
44263 +static A_STATUS
44264 +ar6000_ioctl_tcmd_get_rx_report(struct net_device *dev,
44265 + struct ifreq *rq, A_UINT8 *data, A_UINT32 len)
44266 +{
44267 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44268 + A_UINT32 buf[2];
44269 + int ret = 0;
44270 +
44271 + if (ar->arWmiReady == FALSE) {
44272 + return -EIO;
44273 + }
44274 +
44275 + if (down_interruptible(&ar->arSem)) {
44276 + return -ERESTARTSYS;
44277 + }
44278 + ar->tcmdRxReport = 0;
44279 + if (wmi_test_cmd(ar->arWmi, data, len) != A_OK) {
44280 + up(&ar->arSem);
44281 + return -EIO;
44282 + }
44283 +
44284 + wait_event_interruptible_timeout(arEvent, ar->tcmdRxReport != 0, wmitimeout * HZ);
44285 +
44286 + if (signal_pending(current)) {
44287 + ret = -EINTR;
44288 + }
44289 +
44290 + buf[0] = ar->tcmdRxTotalPkt;
44291 + buf[1] = ar->tcmdRxRssi;
44292 + if (!ret && copy_to_user(rq->ifr_data, buf, sizeof(buf))) {
44293 + ret = -EFAULT;
44294 + }
44295 +
44296 + up(&ar->arSem);
44297 +
44298 + return ret;
44299 +}
44300 +
44301 +void
44302 +ar6000_tcmd_rx_report_event(void *devt, A_UINT8 * results, int len)
44303 +{
44304 + AR_SOFTC_T *ar = (AR_SOFTC_T *)devt;
44305 + TCMD_CONT_RX * rx_rep = (TCMD_CONT_RX *)results;
44306 +
44307 + ar->tcmdRxTotalPkt = rx_rep->u.report.totalPkt;
44308 + ar->tcmdRxRssi = rx_rep->u.report.rssiInDBm;
44309 + ar->tcmdRxReport = 1;
44310 +
44311 + wake_up(&arEvent);
44312 +}
44313 +#endif /* CONFIG_HOST_TCMD_SUPPORT*/
44314 +
44315 +static int
44316 +ar6000_ioctl_set_error_report_bitmask(struct net_device *dev, struct ifreq *rq)
44317 +{
44318 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44319 + WMI_TARGET_ERROR_REPORT_BITMASK cmd;
44320 + int ret = 0;
44321 +
44322 + if (ar->arWmiReady == FALSE) {
44323 + return -EIO;
44324 + }
44325 +
44326 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44327 + return -EFAULT;
44328 + }
44329 +
44330 + ret = wmi_set_error_report_bitmask(ar->arWmi, cmd.bitmask);
44331 +
44332 + return (ret==0 ? ret : -EINVAL);
44333 +}
44334 +
44335 +static int
44336 +ar6000_clear_target_stats(struct net_device *dev)
44337 +{
44338 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44339 + TARGET_STATS *pStats = &ar->arTargetStats;
44340 + int ret = 0;
44341 +
44342 + if (ar->arWmiReady == FALSE) {
44343 + return -EIO;
44344 + }
44345 + AR6000_SPIN_LOCK(&ar->arLock, 0);
44346 + A_MEMZERO(pStats, sizeof(TARGET_STATS));
44347 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
44348 + return ret;
44349 +}
44350 +
44351 +static int
44352 +ar6000_ioctl_get_target_stats(struct net_device *dev, struct ifreq *rq)
44353 +{
44354 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44355 + TARGET_STATS_CMD cmd;
44356 + TARGET_STATS *pStats = &ar->arTargetStats;
44357 + int ret = 0;
44358 +
44359 + if (ar->arWmiReady == FALSE) {
44360 + return -EIO;
44361 + }
44362 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44363 + return -EFAULT;
44364 + }
44365 + if (down_interruptible(&ar->arSem)) {
44366 + return -ERESTARTSYS;
44367 + }
44368 +
44369 + ar->statsUpdatePending = TRUE;
44370 +
44371 + if(wmi_get_stats_cmd(ar->arWmi) != A_OK) {
44372 + up(&ar->arSem);
44373 + return -EIO;
44374 + }
44375 +
44376 + wait_event_interruptible_timeout(arEvent, ar->statsUpdatePending == FALSE, wmitimeout * HZ);
44377 +
44378 + if (signal_pending(current)) {
44379 + ret = -EINTR;
44380 + }
44381 +
44382 + if (!ret && copy_to_user(rq->ifr_data, pStats, sizeof(*pStats))) {
44383 + ret = -EFAULT;
44384 + }
44385 +
44386 + if (cmd.clearStats == 1) {
44387 + ret = ar6000_clear_target_stats(dev);
44388 + }
44389 +
44390 + up(&ar->arSem);
44391 +
44392 + return ret;
44393 +}
44394 +
44395 +static int
44396 +ar6000_ioctl_set_access_params(struct net_device *dev, struct ifreq *rq)
44397 +{
44398 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44399 + WMI_SET_ACCESS_PARAMS_CMD cmd;
44400 + int ret = 0;
44401 +
44402 + if (ar->arWmiReady == FALSE) {
44403 + return -EIO;
44404 + }
44405 +
44406 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44407 + return -EFAULT;
44408 + }
44409 +
44410 + if (wmi_set_access_params_cmd(ar->arWmi, cmd.txop, cmd.eCWmin, cmd.eCWmax,
44411 + cmd.aifsn) == A_OK)
44412 + {
44413 + ret = 0;
44414 + } else {
44415 + ret = -EINVAL;
44416 + }
44417 +
44418 + return (ret);
44419 +}
44420 +
44421 +static int
44422 +ar6000_ioctl_set_disconnect_timeout(struct net_device *dev, struct ifreq *rq)
44423 +{
44424 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44425 + WMI_DISC_TIMEOUT_CMD cmd;
44426 + int ret = 0;
44427 +
44428 + if (ar->arWmiReady == FALSE) {
44429 + return -EIO;
44430 + }
44431 +
44432 + if (copy_from_user(&cmd, rq->ifr_data, sizeof(cmd))) {
44433 + return -EFAULT;
44434 + }
44435 +
44436 + if (wmi_disctimeout_cmd(ar->arWmi, cmd.disconnectTimeout) == A_OK)
44437 + {
44438 + ret = 0;
44439 + } else {
44440 + ret = -EINVAL;
44441 + }
44442 +
44443 + return (ret);
44444 +}
44445 +
44446 +static int
44447 +ar6000_xioctl_set_voice_pkt_size(struct net_device *dev, char * userdata)
44448 +{
44449 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44450 + WMI_SET_VOICE_PKT_SIZE_CMD cmd;
44451 + int ret = 0;
44452 +
44453 + if (ar->arWmiReady == FALSE) {
44454 + return -EIO;
44455 + }
44456 +
44457 + if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
44458 + return -EFAULT;
44459 + }
44460 +
44461 + if (wmi_set_voice_pkt_size_cmd(ar->arWmi, cmd.voicePktSize) == A_OK)
44462 + {
44463 + ret = 0;
44464 + } else {
44465 + ret = -EINVAL;
44466 + }
44467 +
44468 +
44469 + return (ret);
44470 +}
44471 +
44472 +static int
44473 +ar6000_xioctl_set_max_sp_len(struct net_device *dev, char * userdata)
44474 +{
44475 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44476 + WMI_SET_MAX_SP_LEN_CMD cmd;
44477 + int ret = 0;
44478 +
44479 + if (ar->arWmiReady == FALSE) {
44480 + return -EIO;
44481 + }
44482 +
44483 + if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
44484 + return -EFAULT;
44485 + }
44486 +
44487 + if (wmi_set_max_sp_len_cmd(ar->arWmi, cmd.maxSPLen) == A_OK)
44488 + {
44489 + ret = 0;
44490 + } else {
44491 + ret = -EINVAL;
44492 + }
44493 +
44494 + return (ret);
44495 +}
44496 +
44497 +
44498 +static int
44499 +ar6000_xioctl_set_bt_status_cmd(struct net_device *dev, char * userdata)
44500 +{
44501 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44502 + WMI_SET_BT_STATUS_CMD cmd;
44503 + int ret = 0;
44504 +
44505 + if (ar->arWmiReady == FALSE) {
44506 + return -EIO;
44507 + }
44508 +
44509 + if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
44510 + return -EFAULT;
44511 + }
44512 +
44513 + if (wmi_set_bt_status_cmd(ar->arWmi, cmd.streamType, cmd.status) == A_OK)
44514 + {
44515 + ret = 0;
44516 + } else {
44517 + ret = -EINVAL;
44518 + }
44519 +
44520 + return (ret);
44521 +}
44522 +
44523 +static int
44524 +ar6000_xioctl_set_bt_params_cmd(struct net_device *dev, char * userdata)
44525 +{
44526 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44527 + WMI_SET_BT_PARAMS_CMD cmd;
44528 + int ret = 0;
44529 +
44530 + if (ar->arWmiReady == FALSE) {
44531 + return -EIO;
44532 + }
44533 +
44534 + if (copy_from_user(&cmd, userdata, sizeof(cmd))) {
44535 + return -EFAULT;
44536 + }
44537 +
44538 + if (wmi_set_bt_params_cmd(ar->arWmi, &cmd) == A_OK)
44539 + {
44540 + ret = 0;
44541 + } else {
44542 + ret = -EINVAL;
44543 + }
44544 +
44545 + return (ret);
44546 +}
44547 +
44548 +#ifdef CONFIG_HOST_GPIO_SUPPORT
44549 +struct ar6000_gpio_intr_wait_cmd_s gpio_intr_results;
44550 +/* gpio_reg_results and gpio_data_available are protected by arSem */
44551 +static struct ar6000_gpio_register_cmd_s gpio_reg_results;
44552 +static A_BOOL gpio_data_available; /* Requested GPIO data available */
44553 +static A_BOOL gpio_intr_available; /* GPIO interrupt info available */
44554 +static A_BOOL gpio_ack_received; /* GPIO ack was received */
44555 +
44556 +/* Host-side initialization for General Purpose I/O support */
44557 +void ar6000_gpio_init(void)
44558 +{
44559 + gpio_intr_available = FALSE;
44560 + gpio_data_available = FALSE;
44561 + gpio_ack_received = FALSE;
44562 +}
44563 +
44564 +/*
44565 + * Called when a GPIO interrupt is received from the Target.
44566 + * intr_values shows which GPIO pins have interrupted.
44567 + * input_values shows a recent value of GPIO pins.
44568 + */
44569 +void
44570 +ar6000_gpio_intr_rx(A_UINT32 intr_mask, A_UINT32 input_values)
44571 +{
44572 + gpio_intr_results.intr_mask = intr_mask;
44573 + gpio_intr_results.input_values = input_values;
44574 + *((volatile A_BOOL *)&gpio_intr_available) = TRUE;
44575 + wake_up(&arEvent);
44576 +}
44577 +
44578 +/*
44579 + * This is called when a response is received from the Target
44580 + * for a previous or ar6000_gpio_input_get or ar6000_gpio_register_get
44581 + * call.
44582 + */
44583 +void
44584 +ar6000_gpio_data_rx(A_UINT32 reg_id, A_UINT32 value)
44585 +{
44586 + gpio_reg_results.gpioreg_id = reg_id;
44587 + gpio_reg_results.value = value;
44588 + *((volatile A_BOOL *)&gpio_data_available) = TRUE;
44589 + wake_up(&arEvent);
44590 +}
44591 +
44592 +/*
44593 + * This is called when an acknowledgement is received from the Target
44594 + * for a previous or ar6000_gpio_output_set or ar6000_gpio_register_set
44595 + * call.
44596 + */
44597 +void
44598 +ar6000_gpio_ack_rx(void)
44599 +{
44600 + gpio_ack_received = TRUE;
44601 + wake_up(&arEvent);
44602 +}
44603 +
44604 +A_STATUS
44605 +ar6000_gpio_output_set(struct net_device *dev,
44606 + A_UINT32 set_mask,
44607 + A_UINT32 clear_mask,
44608 + A_UINT32 enable_mask,
44609 + A_UINT32 disable_mask)
44610 +{
44611 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44612 +
44613 + gpio_ack_received = FALSE;
44614 + return wmi_gpio_output_set(ar->arWmi,
44615 + set_mask, clear_mask, enable_mask, disable_mask);
44616 +}
44617 +
44618 +static A_STATUS
44619 +ar6000_gpio_input_get(struct net_device *dev)
44620 +{
44621 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44622 +
44623 + *((volatile A_BOOL *)&gpio_data_available) = FALSE;
44624 + return wmi_gpio_input_get(ar->arWmi);
44625 +}
44626 +
44627 +static A_STATUS
44628 +ar6000_gpio_register_set(struct net_device *dev,
44629 + A_UINT32 gpioreg_id,
44630 + A_UINT32 value)
44631 +{
44632 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44633 +
44634 + gpio_ack_received = FALSE;
44635 + return wmi_gpio_register_set(ar->arWmi, gpioreg_id, value);
44636 +}
44637 +
44638 +static A_STATUS
44639 +ar6000_gpio_register_get(struct net_device *dev,
44640 + A_UINT32 gpioreg_id)
44641 +{
44642 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44643 +
44644 + *((volatile A_BOOL *)&gpio_data_available) = FALSE;
44645 + return wmi_gpio_register_get(ar->arWmi, gpioreg_id);
44646 +}
44647 +
44648 +static A_STATUS
44649 +ar6000_gpio_intr_ack(struct net_device *dev,
44650 + A_UINT32 ack_mask)
44651 +{
44652 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44653 +
44654 + gpio_intr_available = FALSE;
44655 + return wmi_gpio_intr_ack(ar->arWmi, ack_mask);
44656 +}
44657 +#endif /* CONFIG_HOST_GPIO_SUPPORT */
44658 +
44659 +int ar6000_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
44660 +{
44661 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
44662 + HIF_DEVICE *hifDevice = ar->arHifDevice;
44663 + int ret, param, param2;
44664 + unsigned int address = 0;
44665 + unsigned int length = 0;
44666 + unsigned char *buffer;
44667 + char *userdata;
44668 + A_UINT32 connectCtrlFlags;
44669 +
44670 +
44671 + static WMI_SCAN_PARAMS_CMD scParams = {0, 0, 0, 0, 0,
44672 + WMI_SHORTSCANRATIO_DEFAULT,
44673 + DEFAULT_SCAN_CTRL_FLAGS,
44674 + 0};
44675 + WMI_SET_AKMP_PARAMS_CMD akmpParams;
44676 + WMI_SET_PMKID_LIST_CMD pmkidInfo;
44677 +
44678 + if (cmd == AR6000_IOCTL_EXTENDED)
44679 + {
44680 + /*
44681 + * This allows for many more wireless ioctls than would otherwise
44682 + * be available. Applications embed the actual ioctl command in
44683 + * the first word of the parameter block, and use the command
44684 + * AR6000_IOCTL_EXTENDED_CMD on the ioctl call.
44685 + */
44686 + get_user(cmd, (int *)rq->ifr_data);
44687 + userdata = (char *)(((unsigned int *)rq->ifr_data)+1);
44688 + }
44689 + else
44690 + {
44691 + userdata = (char *)rq->ifr_data;
44692 + }
44693 +
44694 + if ((ar->arWlanState == WLAN_DISABLED) &&
44695 + ((cmd != AR6000_XIOCTRL_WMI_SET_WLAN_STATE) &&
44696 + (cmd != AR6000_XIOCTL_DIAG_READ) &&
44697 + (cmd != AR6000_XIOCTL_DIAG_WRITE)))
44698 + {
44699 + return -EIO;
44700 + }
44701 +
44702 + ret = 0;
44703 + switch(cmd)
44704 + {
44705 +#ifdef CONFIG_HOST_TCMD_SUPPORT
44706 + case AR6000_XIOCTL_TCMD_CONT_TX:
44707 + {
44708 + TCMD_CONT_TX txCmd;
44709 +
44710 + if (ar->tcmdPm == TCMD_PM_SLEEP) {
44711 + A_PRINTF("Can NOT send tx tcmd when target is asleep! \n");
44712 + return -EFAULT;
44713 + }
44714 +
44715 + if(copy_from_user(&txCmd, userdata, sizeof(TCMD_CONT_TX)))
44716 + return -EFAULT;
44717 + wmi_test_cmd(ar->arWmi,(A_UINT8 *)&txCmd, sizeof(TCMD_CONT_TX));
44718 + }
44719 + break;
44720 + case AR6000_XIOCTL_TCMD_CONT_RX:
44721 + {
44722 + TCMD_CONT_RX rxCmd;
44723 +
44724 + if (ar->tcmdPm == TCMD_PM_SLEEP) {
44725 + A_PRINTF("Can NOT send rx tcmd when target is asleep! \n");
44726 + return -EFAULT;
44727 + }
44728 + if(copy_from_user(&rxCmd, userdata, sizeof(TCMD_CONT_RX)))
44729 + return -EFAULT;
44730 + switch(rxCmd.act)
44731 + {
44732 + case TCMD_CONT_RX_PROMIS:
44733 + case TCMD_CONT_RX_FILTER:
44734 + case TCMD_CONT_RX_SETMAC:
44735 + wmi_test_cmd(ar->arWmi,(A_UINT8 *)&rxCmd,
44736 + sizeof(TCMD_CONT_RX));
44737 + break;
44738 + case TCMD_CONT_RX_REPORT:
44739 + ar6000_ioctl_tcmd_get_rx_report(dev, rq,
44740 + (A_UINT8 *)&rxCmd, sizeof(TCMD_CONT_RX));
44741 + break;
44742 + default:
44743 + A_PRINTF("Unknown Cont Rx mode: %d\n",rxCmd.act);
44744 + return -EINVAL;
44745 + }
44746 + }
44747 + break;
44748 + case AR6000_XIOCTL_TCMD_PM:
44749 + {
44750 + TCMD_PM pmCmd;
44751 +
44752 + if(copy_from_user(&pmCmd, userdata, sizeof(TCMD_PM)))
44753 + return -EFAULT;
44754 + ar->tcmdPm = pmCmd.mode;
44755 + wmi_test_cmd(ar->arWmi, (A_UINT8*)&pmCmd, sizeof(TCMD_PM));
44756 + }
44757 + break;
44758 +#endif /* CONFIG_HOST_TCMD_SUPPORT */
44759 +
44760 + case AR6000_XIOCTL_BMI_DONE:
44761 + if(bmienable)
44762 + {
44763 + ret = ar6000_init(dev);
44764 + }
44765 + else
44766 + {
44767 + ret = BMIDone(hifDevice);
44768 + }
44769 + break;
44770 +
44771 + case AR6000_XIOCTL_BMI_READ_MEMORY:
44772 + get_user(address, (unsigned int *)userdata);
44773 + get_user(length, (unsigned int *)userdata + 1);
44774 + AR_DEBUG_PRINTF("Read Memory (address: 0x%x, length: %d)\n",
44775 + address, length);
44776 + if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
44777 + A_MEMZERO(buffer, length);
44778 + ret = BMIReadMemory(hifDevice, address, buffer, length);
44779 + if (copy_to_user(rq->ifr_data, buffer, length)) {
44780 + ret = -EFAULT;
44781 + }
44782 + A_FREE(buffer);
44783 + } else {
44784 + ret = -ENOMEM;
44785 + }
44786 + break;
44787 +
44788 + case AR6000_XIOCTL_BMI_WRITE_MEMORY:
44789 + get_user(address, (unsigned int *)userdata);
44790 + get_user(length, (unsigned int *)userdata + 1);
44791 + AR_DEBUG_PRINTF("Write Memory (address: 0x%x, length: %d)\n",
44792 + address, length);
44793 + if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
44794 + A_MEMZERO(buffer, length);
44795 + if (copy_from_user(buffer, &userdata[sizeof(address) +
44796 + sizeof(length)], length))
44797 + {
44798 + ret = -EFAULT;
44799 + } else {
44800 + ret = BMIWriteMemory(hifDevice, address, buffer, length);
44801 + }
44802 + A_FREE(buffer);
44803 + } else {
44804 + ret = -ENOMEM;
44805 + }
44806 + break;
44807 +
44808 + case AR6000_XIOCTL_BMI_TEST:
44809 + AR_DEBUG_PRINTF("No longer supported\n");
44810 + ret = -EOPNOTSUPP;
44811 + break;
44812 +
44813 + case AR6000_XIOCTL_BMI_EXECUTE:
44814 + get_user(address, (unsigned int *)userdata);
44815 + get_user(param, (unsigned int *)userdata + 1);
44816 + AR_DEBUG_PRINTF("Execute (address: 0x%x, param: %d)\n",
44817 + address, param);
44818 + ret = BMIExecute(hifDevice, address, &param);
44819 + put_user(param, (unsigned int *)rq->ifr_data); /* return value */
44820 + break;
44821 +
44822 + case AR6000_XIOCTL_BMI_SET_APP_START:
44823 + get_user(address, (unsigned int *)userdata);
44824 + AR_DEBUG_PRINTF("Set App Start (address: 0x%x)\n", address);
44825 + ret = BMISetAppStart(hifDevice, address);
44826 + break;
44827 +
44828 + case AR6000_XIOCTL_BMI_READ_SOC_REGISTER:
44829 + get_user(address, (unsigned int *)userdata);
44830 + ret = BMIReadSOCRegister(hifDevice, address, &param);
44831 + put_user(param, (unsigned int *)rq->ifr_data); /* return value */
44832 + break;
44833 +
44834 + case AR6000_XIOCTL_BMI_WRITE_SOC_REGISTER:
44835 + get_user(address, (unsigned int *)userdata);
44836 + get_user(param, (unsigned int *)userdata + 1);
44837 + ret = BMIWriteSOCRegister(hifDevice, address, param);
44838 + break;
44839 +
44840 +#ifdef HTC_RAW_INTERFACE
44841 + case AR6000_XIOCTL_HTC_RAW_OPEN:
44842 + ret = A_OK;
44843 + if (!arRawIfEnabled(ar)) {
44844 + /* make sure block size is set in case the target was reset since last
44845 + * BMI phase (i.e. flashup downloads) */
44846 + ret = ar6000_SetHTCBlockSize(ar);
44847 + if (A_FAILED(ret)) {
44848 + break;
44849 + }
44850 + /* Terminate the BMI phase */
44851 + ret = BMIDone(hifDevice);
44852 + if (ret == A_OK) {
44853 + ret = ar6000_htc_raw_open(ar);
44854 + }
44855 + }
44856 + break;
44857 +
44858 + case AR6000_XIOCTL_HTC_RAW_CLOSE:
44859 + if (arRawIfEnabled(ar)) {
44860 + ret = ar6000_htc_raw_close(ar);
44861 + arRawIfEnabled(ar) = FALSE;
44862 + } else {
44863 + ret = A_ERROR;
44864 + }
44865 + break;
44866 +
44867 + case AR6000_XIOCTL_HTC_RAW_READ:
44868 + if (arRawIfEnabled(ar)) {
44869 + unsigned int streamID;
44870 + get_user(streamID, (unsigned int *)userdata);
44871 + get_user(length, (unsigned int *)userdata + 1);
44872 + buffer = rq->ifr_data + sizeof(length);
44873 + ret = ar6000_htc_raw_read(ar, (HTC_RAW_STREAM_ID)streamID,
44874 + buffer, length);
44875 + put_user(ret, (unsigned int *)rq->ifr_data);
44876 + } else {
44877 + ret = A_ERROR;
44878 + }
44879 + break;
44880 +
44881 + case AR6000_XIOCTL_HTC_RAW_WRITE:
44882 + if (arRawIfEnabled(ar)) {
44883 + unsigned int streamID;
44884 + get_user(streamID, (unsigned int *)userdata);
44885 + get_user(length, (unsigned int *)userdata + 1);
44886 + buffer = userdata + sizeof(streamID) + sizeof(length);
44887 + ret = ar6000_htc_raw_write(ar, (HTC_RAW_STREAM_ID)streamID,
44888 + buffer, length);
44889 + put_user(ret, (unsigned int *)rq->ifr_data);
44890 + } else {
44891 + ret = A_ERROR;
44892 + }
44893 + break;
44894 +#endif /* HTC_RAW_INTERFACE */
44895 +
44896 + case AR6000_IOCTL_WMI_GETREV:
44897 + {
44898 + if (copy_to_user(rq->ifr_data, &ar->arVersion,
44899 + sizeof(ar->arVersion)))
44900 + {
44901 + ret = -EFAULT;
44902 + }
44903 + break;
44904 + }
44905 + case AR6000_IOCTL_WMI_SETPWR:
44906 + {
44907 + WMI_POWER_MODE_CMD pwrModeCmd;
44908 +
44909 + if (ar->arWmiReady == FALSE) {
44910 + ret = -EIO;
44911 + } else if (copy_from_user(&pwrModeCmd, userdata,
44912 + sizeof(pwrModeCmd)))
44913 + {
44914 + ret = -EFAULT;
44915 + } else {
44916 + if (wmi_powermode_cmd(ar->arWmi, pwrModeCmd.powerMode)
44917 + != A_OK)
44918 + {
44919 + ret = -EIO;
44920 + }
44921 + }
44922 + break;
44923 + }
44924 + case AR6000_IOCTL_WMI_SET_IBSS_PM_CAPS:
44925 + {
44926 + WMI_IBSS_PM_CAPS_CMD ibssPmCaps;
44927 +
44928 + if (ar->arWmiReady == FALSE) {
44929 + ret = -EIO;
44930 + } else if (copy_from_user(&ibssPmCaps, userdata,
44931 + sizeof(ibssPmCaps)))
44932 + {
44933 + ret = -EFAULT;
44934 + } else {
44935 + if (wmi_ibsspmcaps_cmd(ar->arWmi, ibssPmCaps.power_saving, ibssPmCaps.ttl,
44936 + ibssPmCaps.atim_windows, ibssPmCaps.timeout_value) != A_OK)
44937 + {
44938 + ret = -EIO;
44939 + }
44940 + AR6000_SPIN_LOCK(&ar->arLock, 0);
44941 + ar->arIbssPsEnable = ibssPmCaps.power_saving;
44942 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
44943 + }
44944 + break;
44945 + }
44946 + case AR6000_IOCTL_WMI_SET_PMPARAMS:
44947 + {
44948 + WMI_POWER_PARAMS_CMD pmParams;
44949 +
44950 + if (ar->arWmiReady == FALSE) {
44951 + ret = -EIO;
44952 + } else if (copy_from_user(&pmParams, userdata,
44953 + sizeof(pmParams)))
44954 + {
44955 + ret = -EFAULT;
44956 + } else {
44957 + if (wmi_pmparams_cmd(ar->arWmi, pmParams.idle_period,
44958 + pmParams.pspoll_number,
44959 + pmParams.dtim_policy) != A_OK)
44960 + {
44961 + ret = -EIO;
44962 + }
44963 + }
44964 + break;
44965 + }
44966 + case AR6000_IOCTL_WMI_SETSCAN:
44967 + {
44968 + if (ar->arWmiReady == FALSE) {
44969 + ret = -EIO;
44970 + } else if (copy_from_user(&scParams, userdata,
44971 + sizeof(scParams)))
44972 + {
44973 + ret = -EFAULT;
44974 + } else {
44975 + if (CAN_SCAN_IN_CONNECT(scParams.scanCtrlFlags)) {
44976 + ar->arSkipScan = FALSE;
44977 + } else {
44978 + ar->arSkipScan = TRUE;
44979 + }
44980 +
44981 + if (wmi_scanparams_cmd(ar->arWmi, scParams.fg_start_period,
44982 + scParams.fg_end_period,
44983 + scParams.bg_period,
44984 + scParams.minact_chdwell_time,
44985 + scParams.maxact_chdwell_time,
44986 + scParams.pas_chdwell_time,
44987 + scParams.shortScanRatio,
44988 + scParams.scanCtrlFlags,
44989 + scParams.max_dfsch_act_time) != A_OK)
44990 + {
44991 + ret = -EIO;
44992 + }
44993 + }
44994 + break;
44995 + }
44996 + case AR6000_IOCTL_WMI_SETLISTENINT:
44997 + {
44998 + WMI_LISTEN_INT_CMD listenCmd;
44999 +
45000 + if (ar->arWmiReady == FALSE) {
45001 + ret = -EIO;
45002 + } else if (copy_from_user(&listenCmd, userdata,
45003 + sizeof(listenCmd)))
45004 + {
45005 + ret = -EFAULT;
45006 + } else {
45007 + if (wmi_listeninterval_cmd(ar->arWmi, listenCmd.listenInterval, listenCmd.numBeacons) != A_OK) {
45008 + ret = -EIO;
45009 + } else {
45010 + AR6000_SPIN_LOCK(&ar->arLock, 0);
45011 + ar->arListenInterval = param;
45012 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
45013 + }
45014 +
45015 + }
45016 + break;
45017 + }
45018 + case AR6000_IOCTL_WMI_SET_BMISS_TIME:
45019 + {
45020 + WMI_BMISS_TIME_CMD bmissCmd;
45021 +
45022 + if (ar->arWmiReady == FALSE) {
45023 + ret = -EIO;
45024 + } else if (copy_from_user(&bmissCmd, userdata,
45025 + sizeof(bmissCmd)))
45026 + {
45027 + ret = -EFAULT;
45028 + } else {
45029 + if (wmi_bmisstime_cmd(ar->arWmi, bmissCmd.bmissTime, bmissCmd.numBeacons) != A_OK) {
45030 + ret = -EIO;
45031 + }
45032 + }
45033 + break;
45034 + }
45035 + case AR6000_IOCTL_WMI_SETBSSFILTER:
45036 + {
45037 + if (ar->arWmiReady == FALSE) {
45038 + ret = -EIO;
45039 + } else {
45040 +
45041 + get_user(param, (unsigned char *)userdata);
45042 + get_user(param2, (unsigned int *)(userdata + 1));
45043 + printk("SETBSSFILTER: filter 0x%x, mask: 0x%x\n", param, param2);
45044 + if (wmi_bssfilter_cmd(ar->arWmi, param, param2) != A_OK) {
45045 + ret = -EIO;
45046 + }
45047 + }
45048 + break;
45049 + }
45050 + case AR6000_IOCTL_WMI_SET_SNRTHRESHOLD:
45051 + {
45052 + ret = ar6000_ioctl_set_snr_threshold(dev, rq);
45053 + break;
45054 + }
45055 + case AR6000_XIOCTL_WMI_SET_RSSITHRESHOLD:
45056 + {
45057 + ret = ar6000_ioctl_set_rssi_threshold(dev, rq);
45058 + break;
45059 + }
45060 + case AR6000_XIOCTL_WMI_CLR_RSSISNR:
45061 + {
45062 + if (ar->arWmiReady == FALSE) {
45063 + ret = -EIO;
45064 + }
45065 + ret = wmi_clr_rssi_snr(ar->arWmi);
45066 + break;
45067 + }
45068 + case AR6000_XIOCTL_WMI_SET_LQTHRESHOLD:
45069 + {
45070 + ret = ar6000_ioctl_set_lq_threshold(dev, rq);
45071 + break;
45072 + }
45073 + case AR6000_XIOCTL_WMI_SET_LPREAMBLE:
45074 + {
45075 + WMI_SET_LPREAMBLE_CMD setLpreambleCmd;
45076 +
45077 + if (ar->arWmiReady == FALSE) {
45078 + ret = -EIO;
45079 + } else if (copy_from_user(&setLpreambleCmd, userdata,
45080 + sizeof(setLpreambleCmd)))
45081 + {
45082 + ret = -EFAULT;
45083 + } else {
45084 + if (wmi_set_lpreamble_cmd(ar->arWmi, setLpreambleCmd.status)
45085 + != A_OK)
45086 + {
45087 + ret = -EIO;
45088 + }
45089 + }
45090 +
45091 + break;
45092 + }
45093 + case AR6000_XIOCTL_WMI_SET_RTS:
45094 + {
45095 + WMI_SET_RTS_CMD rtsCmd;
45096 +
45097 + if (ar->arWmiReady == FALSE) {
45098 + ret = -EIO;
45099 + } else if (copy_from_user(&rtsCmd, userdata,
45100 + sizeof(rtsCmd)))
45101 + {
45102 + ret = -EFAULT;
45103 + } else {
45104 + if (wmi_set_rts_cmd(ar->arWmi, rtsCmd.threshold)
45105 + != A_OK)
45106 + {
45107 + ret = -EIO;
45108 + }
45109 + }
45110 +
45111 + break;
45112 + }
45113 + case AR6000_XIOCTL_WMI_SET_WMM:
45114 + {
45115 + ret = ar6000_ioctl_set_wmm(dev, rq);
45116 + break;
45117 + }
45118 + case AR6000_XIOCTL_WMI_SET_TXOP:
45119 + {
45120 + ret = ar6000_ioctl_set_txop(dev, rq);
45121 + break;
45122 + }
45123 + case AR6000_XIOCTL_WMI_GET_RD:
45124 + {
45125 + ret = ar6000_ioctl_get_rd(dev, rq);
45126 + break;
45127 + }
45128 + case AR6000_IOCTL_WMI_SET_CHANNELPARAMS:
45129 + {
45130 + ret = ar6000_ioctl_set_channelParams(dev, rq);
45131 + break;
45132 + }
45133 + case AR6000_IOCTL_WMI_SET_PROBEDSSID:
45134 + {
45135 + ret = ar6000_ioctl_set_probedSsid(dev, rq);
45136 + break;
45137 + }
45138 + case AR6000_IOCTL_WMI_SET_BADAP:
45139 + {
45140 + ret = ar6000_ioctl_set_badAp(dev, rq);
45141 + break;
45142 + }
45143 + case AR6000_IOCTL_WMI_CREATE_QOS:
45144 + {
45145 + ret = ar6000_ioctl_create_qos(dev, rq);
45146 + break;
45147 + }
45148 + case AR6000_IOCTL_WMI_DELETE_QOS:
45149 + {
45150 + ret = ar6000_ioctl_delete_qos(dev, rq);
45151 + break;
45152 + }
45153 + case AR6000_IOCTL_WMI_GET_QOS_QUEUE:
45154 + {
45155 + ret = ar6000_ioctl_get_qos_queue(dev, rq);
45156 + break;
45157 + }
45158 + case AR6000_IOCTL_WMI_GET_TARGET_STATS:
45159 + {
45160 + ret = ar6000_ioctl_get_target_stats(dev, rq);
45161 + break;
45162 + }
45163 + case AR6000_IOCTL_WMI_SET_ERROR_REPORT_BITMASK:
45164 + {
45165 + ret = ar6000_ioctl_set_error_report_bitmask(dev, rq);
45166 + break;
45167 + }
45168 + case AR6000_IOCTL_WMI_SET_ASSOC_INFO:
45169 + {
45170 + WMI_SET_ASSOC_INFO_CMD cmd;
45171 + A_UINT8 assocInfo[WMI_MAX_ASSOC_INFO_LEN];
45172 +
45173 + if (ar->arWmiReady == FALSE) {
45174 + ret = -EIO;
45175 + } else {
45176 + get_user(cmd.ieType, userdata);
45177 + if (cmd.ieType >= WMI_MAX_ASSOC_INFO_TYPE) {
45178 + ret = -EIO;
45179 + } else {
45180 + get_user(cmd.bufferSize, userdata + 1);
45181 + if (cmd.bufferSize > WMI_MAX_ASSOC_INFO_LEN) {
45182 + ret = -EFAULT;
45183 + break;
45184 + }
45185 + if (copy_from_user(assocInfo, userdata + 2,
45186 + cmd.bufferSize))
45187 + {
45188 + ret = -EFAULT;
45189 + } else {
45190 + if (wmi_associnfo_cmd(ar->arWmi, cmd.ieType,
45191 + cmd.bufferSize,
45192 + assocInfo) != A_OK)
45193 + {
45194 + ret = -EIO;
45195 + }
45196 + }
45197 + }
45198 + }
45199 + break;
45200 + }
45201 + case AR6000_IOCTL_WMI_SET_ACCESS_PARAMS:
45202 + {
45203 + ret = ar6000_ioctl_set_access_params(dev, rq);
45204 + break;
45205 + }
45206 + case AR6000_IOCTL_WMI_SET_DISC_TIMEOUT:
45207 + {
45208 + ret = ar6000_ioctl_set_disconnect_timeout(dev, rq);
45209 + break;
45210 + }
45211 + case AR6000_XIOCTL_FORCE_TARGET_RESET:
45212 + {
45213 + if (ar->arHtcTarget)
45214 + {
45215 +// HTCForceReset(htcTarget);
45216 + }
45217 + else
45218 + {
45219 + AR_DEBUG_PRINTF("ar6000_ioctl cannot attempt reset.\n");
45220 + }
45221 + break;
45222 + }
45223 + case AR6000_XIOCTL_TARGET_INFO:
45224 + case AR6000_XIOCTL_CHECK_TARGET_READY: /* backwards compatibility */
45225 + {
45226 + /* If we made it to here, then the Target exists and is ready. */
45227 +
45228 + if (cmd == AR6000_XIOCTL_TARGET_INFO) {
45229 + if (copy_to_user((A_UINT32 *)rq->ifr_data, &ar->arVersion.target_ver,
45230 + sizeof(ar->arVersion.target_ver)))
45231 + {
45232 + ret = -EFAULT;
45233 + }
45234 + if (copy_to_user(((A_UINT32 *)rq->ifr_data)+1, &ar->arTargetType,
45235 + sizeof(ar->arTargetType)))
45236 + {
45237 + ret = -EFAULT;
45238 + }
45239 + }
45240 + break;
45241 + }
45242 + case AR6000_XIOCTL_WMI_SET_HB_CHALLENGE_RESP_PARAMS:
45243 + {
45244 + WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD hbparam;
45245 +
45246 + if (copy_from_user(&hbparam, userdata, sizeof(hbparam)))
45247 + {
45248 + ret = -EFAULT;
45249 + } else {
45250 + AR6000_SPIN_LOCK(&ar->arLock, 0);
45251 + /* Start a cyclic timer with the parameters provided. */
45252 + if (hbparam.frequency) {
45253 + ar->arHBChallengeResp.frequency = hbparam.frequency;
45254 + }
45255 + if (hbparam.threshold) {
45256 + ar->arHBChallengeResp.missThres = hbparam.threshold;
45257 + }
45258 +
45259 + /* Delete the pending timer and start a new one */
45260 + if (timer_pending(&ar->arHBChallengeResp.timer)) {
45261 + A_UNTIMEOUT(&ar->arHBChallengeResp.timer);
45262 + }
45263 + A_TIMEOUT_MS(&ar->arHBChallengeResp.timer, ar->arHBChallengeResp.frequency * 1000, 0);
45264 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
45265 + }
45266 + break;
45267 + }
45268 + case AR6000_XIOCTL_WMI_GET_HB_CHALLENGE_RESP:
45269 + {
45270 + A_UINT32 cookie;
45271 +
45272 + if (copy_from_user(&cookie, userdata, sizeof(cookie))) {
45273 + return -EFAULT;
45274 + }
45275 +
45276 + /* Send the challenge on the control channel */
45277 + if (wmi_get_challenge_resp_cmd(ar->arWmi, cookie, APP_HB_CHALLENGE) != A_OK) {
45278 + return -EIO;
45279 + }
45280 + break;
45281 + }
45282 +#ifdef USER_KEYS
45283 + case AR6000_XIOCTL_USER_SETKEYS:
45284 + {
45285 +
45286 + ar->user_savedkeys_stat = USER_SAVEDKEYS_STAT_RUN;
45287 +
45288 + if (copy_from_user(&ar->user_key_ctrl, userdata,
45289 + sizeof(ar->user_key_ctrl)))
45290 + {
45291 + return -EFAULT;
45292 + }
45293 +
45294 + A_PRINTF("ar6000 USER set key %x\n", ar->user_key_ctrl);
45295 + break;
45296 + }
45297 +#endif /* USER_KEYS */
45298 +
45299 +#ifdef CONFIG_HOST_GPIO_SUPPORT
45300 + case AR6000_XIOCTL_GPIO_OUTPUT_SET:
45301 + {
45302 + struct ar6000_gpio_output_set_cmd_s gpio_output_set_cmd;
45303 +
45304 + if (ar->arWmiReady == FALSE) {
45305 + return -EIO;
45306 + }
45307 + if (down_interruptible(&ar->arSem)) {
45308 + return -ERESTARTSYS;
45309 + }
45310 +
45311 + if (copy_from_user(&gpio_output_set_cmd, userdata,
45312 + sizeof(gpio_output_set_cmd)))
45313 + {
45314 + ret = -EFAULT;
45315 + } else {
45316 + ret = ar6000_gpio_output_set(dev,
45317 + gpio_output_set_cmd.set_mask,
45318 + gpio_output_set_cmd.clear_mask,
45319 + gpio_output_set_cmd.enable_mask,
45320 + gpio_output_set_cmd.disable_mask);
45321 + if (ret != A_OK) {
45322 + ret = EIO;
45323 + }
45324 + }
45325 + up(&ar->arSem);
45326 + break;
45327 + }
45328 + case AR6000_XIOCTL_GPIO_INPUT_GET:
45329 + {
45330 + if (ar->arWmiReady == FALSE) {
45331 + return -EIO;
45332 + }
45333 + if (down_interruptible(&ar->arSem)) {
45334 + return -ERESTARTSYS;
45335 + }
45336 +
45337 + ret = ar6000_gpio_input_get(dev);
45338 + if (ret != A_OK) {
45339 + up(&ar->arSem);
45340 + return -EIO;
45341 + }
45342 +
45343 + /* Wait for Target to respond. */
45344 + wait_event_interruptible(arEvent, gpio_data_available);
45345 + if (signal_pending(current)) {
45346 + ret = -EINTR;
45347 + } else {
45348 + A_ASSERT(gpio_reg_results.gpioreg_id == GPIO_ID_NONE);
45349 +
45350 + if (copy_to_user(userdata, &gpio_reg_results.value,
45351 + sizeof(gpio_reg_results.value)))
45352 + {
45353 + ret = -EFAULT;
45354 + }
45355 + }
45356 + up(&ar->arSem);
45357 + break;
45358 + }
45359 + case AR6000_XIOCTL_GPIO_REGISTER_SET:
45360 + {
45361 + struct ar6000_gpio_register_cmd_s gpio_register_cmd;
45362 +
45363 + if (ar->arWmiReady == FALSE) {
45364 + return -EIO;
45365 + }
45366 + if (down_interruptible(&ar->arSem)) {
45367 + return -ERESTARTSYS;
45368 + }
45369 +
45370 + if (copy_from_user(&gpio_register_cmd, userdata,
45371 + sizeof(gpio_register_cmd)))
45372 + {
45373 + ret = -EFAULT;
45374 + } else {
45375 + ret = ar6000_gpio_register_set(dev,
45376 + gpio_register_cmd.gpioreg_id,
45377 + gpio_register_cmd.value);
45378 + if (ret != A_OK) {
45379 + ret = EIO;
45380 + }
45381 +
45382 + /* Wait for acknowledgement from Target */
45383 + wait_event_interruptible(arEvent, gpio_ack_received);
45384 + if (signal_pending(current)) {
45385 + ret = -EINTR;
45386 + }
45387 + }
45388 + up(&ar->arSem);
45389 + break;
45390 + }
45391 + case AR6000_XIOCTL_GPIO_REGISTER_GET:
45392 + {
45393 + struct ar6000_gpio_register_cmd_s gpio_register_cmd;
45394 +
45395 + if (ar->arWmiReady == FALSE) {
45396 + return -EIO;
45397 + }
45398 + if (down_interruptible(&ar->arSem)) {
45399 + return -ERESTARTSYS;
45400 + }
45401 +
45402 + if (copy_from_user(&gpio_register_cmd, userdata,
45403 + sizeof(gpio_register_cmd)))
45404 + {
45405 + ret = -EFAULT;
45406 + } else {
45407 + ret = ar6000_gpio_register_get(dev, gpio_register_cmd.gpioreg_id);
45408 + if (ret != A_OK) {
45409 + up(&ar->arSem);
45410 + return -EIO;
45411 + }
45412 +
45413 + /* Wait for Target to respond. */
45414 + wait_event_interruptible(arEvent, gpio_data_available);
45415 + if (signal_pending(current)) {
45416 + ret = -EINTR;
45417 + } else {
45418 + A_ASSERT(gpio_register_cmd.gpioreg_id == gpio_reg_results.gpioreg_id);
45419 + if (copy_to_user(userdata, &gpio_reg_results,
45420 + sizeof(gpio_reg_results)))
45421 + {
45422 + ret = -EFAULT;
45423 + }
45424 + }
45425 + }
45426 + up(&ar->arSem);
45427 + break;
45428 + }
45429 + case AR6000_XIOCTL_GPIO_INTR_ACK:
45430 + {
45431 + struct ar6000_gpio_intr_ack_cmd_s gpio_intr_ack_cmd;
45432 +
45433 + if (ar->arWmiReady == FALSE) {
45434 + return -EIO;
45435 + }
45436 + if (down_interruptible(&ar->arSem)) {
45437 + return -ERESTARTSYS;
45438 + }
45439 +
45440 + if (copy_from_user(&gpio_intr_ack_cmd, userdata,
45441 + sizeof(gpio_intr_ack_cmd)))
45442 + {
45443 + ret = -EFAULT;
45444 + } else {
45445 + ret = ar6000_gpio_intr_ack(dev, gpio_intr_ack_cmd.ack_mask);
45446 + if (ret != A_OK) {
45447 + ret = EIO;
45448 + }
45449 + }
45450 + up(&ar->arSem);
45451 + break;
45452 + }
45453 + case AR6000_XIOCTL_GPIO_INTR_WAIT:
45454 + {
45455 + /* Wait for Target to report an interrupt. */
45456 + dev_hold(dev);
45457 + rtnl_unlock();
45458 + wait_event_interruptible(arEvent, gpio_intr_available);
45459 + rtnl_lock();
45460 + __dev_put(dev);
45461 +
45462 + if (signal_pending(current)) {
45463 + ret = -EINTR;
45464 + } else {
45465 + if (copy_to_user(userdata, &gpio_intr_results,
45466 + sizeof(gpio_intr_results)))
45467 + {
45468 + ret = -EFAULT;
45469 + }
45470 + }
45471 + break;
45472 + }
45473 +#endif /* CONFIG_HOST_GPIO_SUPPORT */
45474 +
45475 + case AR6000_XIOCTL_DBGLOG_CFG_MODULE:
45476 + {
45477 + struct ar6000_dbglog_module_config_s config;
45478 +
45479 + if (copy_from_user(&config, userdata, sizeof(config))) {
45480 + return -EFAULT;
45481 + }
45482 +
45483 + /* Send the challenge on the control channel */
45484 + if (wmi_config_debug_module_cmd(ar->arWmi, config.mmask,
45485 + config.tsr, config.rep,
45486 + config.size, config.valid) != A_OK)
45487 + {
45488 + return -EIO;
45489 + }
45490 + break;
45491 + }
45492 +
45493 + case AR6000_XIOCTL_DBGLOG_GET_DEBUG_LOGS:
45494 + {
45495 + /* Send the challenge on the control channel */
45496 + if (ar6000_dbglog_get_debug_logs(ar) != A_OK)
45497 + {
45498 + return -EIO;
45499 + }
45500 + break;
45501 + }
45502 +
45503 + case AR6000_XIOCTL_SET_ADHOC_BSSID:
45504 + {
45505 + WMI_SET_ADHOC_BSSID_CMD adhocBssid;
45506 +
45507 + if (ar->arWmiReady == FALSE) {
45508 + ret = -EIO;
45509 + } else if (copy_from_user(&adhocBssid, userdata,
45510 + sizeof(adhocBssid)))
45511 + {
45512 + ret = -EFAULT;
45513 + } else if (A_MEMCMP(adhocBssid.bssid, bcast_mac,
45514 + AR6000_ETH_ADDR_LEN) == 0)
45515 + {
45516 + ret = -EFAULT;
45517 + } else {
45518 +
45519 + A_MEMCPY(ar->arReqBssid, adhocBssid.bssid, sizeof(ar->arReqBssid));
45520 + }
45521 + break;
45522 + }
45523 +
45524 + case AR6000_XIOCTL_SET_OPT_MODE:
45525 + {
45526 + WMI_SET_OPT_MODE_CMD optModeCmd;
45527 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
45528 +
45529 + if (ar->arWmiReady == FALSE) {
45530 + ret = -EIO;
45531 + } else if (copy_from_user(&optModeCmd, userdata,
45532 + sizeof(optModeCmd)))
45533 + {
45534 + ret = -EFAULT;
45535 + } else if (ar->arConnected && optModeCmd.optMode == SPECIAL_ON) {
45536 + ret = -EFAULT;
45537 +
45538 + } else if (wmi_set_opt_mode_cmd(ar->arWmi, optModeCmd.optMode)
45539 + != A_OK)
45540 + {
45541 + ret = -EIO;
45542 + }
45543 + break;
45544 + }
45545 +
45546 + case AR6000_XIOCTL_OPT_SEND_FRAME:
45547 + {
45548 + WMI_OPT_TX_FRAME_CMD optTxFrmCmd;
45549 + A_UINT8 data[MAX_OPT_DATA_LEN];
45550 +
45551 + if (ar->arWmiReady == FALSE) {
45552 + ret = -EIO;
45553 + } else if (copy_from_user(&optTxFrmCmd, userdata,
45554 + sizeof(optTxFrmCmd)))
45555 + {
45556 + ret = -EFAULT;
45557 + } else if (copy_from_user(data,
45558 + userdata+sizeof(WMI_OPT_TX_FRAME_CMD)-1,
45559 + optTxFrmCmd.optIEDataLen))
45560 + {
45561 + ret = -EFAULT;
45562 + } else {
45563 + ret = wmi_opt_tx_frame_cmd(ar->arWmi,
45564 + optTxFrmCmd.frmType,
45565 + optTxFrmCmd.dstAddr,
45566 + optTxFrmCmd.bssid,
45567 + optTxFrmCmd.optIEDataLen,
45568 + data);
45569 + }
45570 +
45571 + break;
45572 + }
45573 + case AR6000_XIOCTL_WMI_SETRETRYLIMITS:
45574 + {
45575 + WMI_SET_RETRY_LIMITS_CMD setRetryParams;
45576 +
45577 + if (ar->arWmiReady == FALSE) {
45578 + ret = -EIO;
45579 + } else if (copy_from_user(&setRetryParams, userdata,
45580 + sizeof(setRetryParams)))
45581 + {
45582 + ret = -EFAULT;
45583 + } else {
45584 + if (wmi_set_retry_limits_cmd(ar->arWmi, setRetryParams.frameType,
45585 + setRetryParams.trafficClass,
45586 + setRetryParams.maxRetries,
45587 + setRetryParams.enableNotify) != A_OK)
45588 + {
45589 + ret = -EIO;
45590 + }
45591 + AR6000_SPIN_LOCK(&ar->arLock, 0);
45592 + ar->arMaxRetries = setRetryParams.maxRetries;
45593 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
45594 + }
45595 + break;
45596 + }
45597 +
45598 + case AR6000_XIOCTL_SET_ADHOC_BEACON_INTVAL:
45599 + {
45600 + WMI_BEACON_INT_CMD bIntvlCmd;
45601 +
45602 + if (ar->arWmiReady == FALSE) {
45603 + ret = -EIO;
45604 + } else if (copy_from_user(&bIntvlCmd, userdata,
45605 + sizeof(bIntvlCmd)))
45606 + {
45607 + ret = -EFAULT;
45608 + } else if (wmi_set_adhoc_bconIntvl_cmd(ar->arWmi, bIntvlCmd.beaconInterval)
45609 + != A_OK)
45610 + {
45611 + ret = -EIO;
45612 + }
45613 + break;
45614 + }
45615 + case IEEE80211_IOCTL_SETAUTHALG:
45616 + {
45617 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
45618 + struct ieee80211req_authalg req;
45619 +
45620 + if (ar->arWmiReady == FALSE) {
45621 + ret = -EIO;
45622 + } else if (copy_from_user(&req, userdata,
45623 + sizeof(struct ieee80211req_authalg)))
45624 + {
45625 + ret = -EFAULT;
45626 + } else if (req.auth_alg == AUTH_ALG_OPEN_SYSTEM) {
45627 + ar->arDot11AuthMode = OPEN_AUTH;
45628 + ar->arPairwiseCrypto = NONE_CRYPT;
45629 + ar->arGroupCrypto = NONE_CRYPT;
45630 + } else if (req.auth_alg == AUTH_ALG_LEAP) {
45631 + ar->arDot11AuthMode = LEAP_AUTH;
45632 + } else {
45633 + ret = -EIO;
45634 + }
45635 + break;
45636 + }
45637 +
45638 + case AR6000_XIOCTL_SET_VOICE_PKT_SIZE:
45639 + ret = ar6000_xioctl_set_voice_pkt_size(dev, userdata);
45640 + break;
45641 +
45642 + case AR6000_XIOCTL_SET_MAX_SP:
45643 + ret = ar6000_xioctl_set_max_sp_len(dev, userdata);
45644 + break;
45645 +
45646 + case AR6000_XIOCTL_WMI_GET_ROAM_TBL:
45647 + ret = ar6000_ioctl_get_roam_tbl(dev, rq);
45648 + break;
45649 + case AR6000_XIOCTL_WMI_SET_ROAM_CTRL:
45650 + ret = ar6000_ioctl_set_roam_ctrl(dev, userdata);
45651 + break;
45652 + case AR6000_XIOCTRL_WMI_SET_POWERSAVE_TIMERS:
45653 + ret = ar6000_ioctl_set_powersave_timers(dev, userdata);
45654 + break;
45655 + case AR6000_XIOCTRL_WMI_GET_POWER_MODE:
45656 + ret = ar6000_ioctl_get_power_mode(dev, rq);
45657 + break;
45658 + case AR6000_XIOCTRL_WMI_SET_WLAN_STATE:
45659 + get_user(ar->arWlanState, (unsigned int *)userdata);
45660 + if (ar->arWmiReady == FALSE) {
45661 + ret = -EIO;
45662 + break;
45663 + }
45664 +
45665 + if (ar->arWlanState == WLAN_ENABLED) {
45666 + /* Enable foreground scanning */
45667 + if (wmi_scanparams_cmd(ar->arWmi, scParams.fg_start_period,
45668 + scParams.fg_end_period,
45669 + scParams.bg_period,
45670 + scParams.minact_chdwell_time,
45671 + scParams.maxact_chdwell_time,
45672 + scParams.pas_chdwell_time,
45673 + scParams.shortScanRatio,
45674 + scParams.scanCtrlFlags,
45675 + scParams.max_dfsch_act_time) != A_OK)
45676 + {
45677 + ret = -EIO;
45678 + }
45679 + if (ar->arSsidLen) {
45680 + ar->arConnectPending = TRUE;
45681 + if (wmi_connect_cmd(ar->arWmi, ar->arNetworkType,
45682 + ar->arDot11AuthMode, ar->arAuthMode,
45683 + ar->arPairwiseCrypto,
45684 + ar->arPairwiseCryptoLen,
45685 + ar->arGroupCrypto, ar->arGroupCryptoLen,
45686 + ar->arSsidLen, ar->arSsid,
45687 + ar->arReqBssid, ar->arChannelHint,
45688 + ar->arConnectCtrlFlags) != A_OK)
45689 + {
45690 + ret = -EIO;
45691 + ar->arConnectPending = FALSE;
45692 + }
45693 + }
45694 + } else {
45695 + /* Disconnect from the AP and disable foreground scanning */
45696 + AR6000_SPIN_LOCK(&ar->arLock, 0);
45697 + if (ar->arConnected == TRUE || ar->arConnectPending == TRUE) {
45698 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
45699 + wmi_disconnect_cmd(ar->arWmi);
45700 + } else {
45701 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
45702 + }
45703 +
45704 + if (wmi_scanparams_cmd(ar->arWmi, 0xFFFF, 0, 0, 0, 0, 0, 0, 0xFF, 0) != A_OK)
45705 + {
45706 + ret = -EIO;
45707 + }
45708 + }
45709 + break;
45710 + case AR6000_XIOCTL_WMI_GET_ROAM_DATA:
45711 + ret = ar6000_ioctl_get_roam_data(dev, rq);
45712 + break;
45713 + case AR6000_XIOCTL_WMI_SET_BT_STATUS:
45714 + ret = ar6000_xioctl_set_bt_status_cmd(dev, userdata);
45715 + break;
45716 + case AR6000_XIOCTL_WMI_SET_BT_PARAMS:
45717 + ret = ar6000_xioctl_set_bt_params_cmd(dev, userdata);
45718 + break;
45719 + case AR6000_XIOCTL_WMI_STARTSCAN:
45720 + {
45721 + WMI_START_SCAN_CMD setStartScanCmd;
45722 +
45723 + if (ar->arWmiReady == FALSE) {
45724 + ret = -EIO;
45725 + } else if (copy_from_user(&setStartScanCmd, userdata,
45726 + sizeof(setStartScanCmd)))
45727 + {
45728 + ret = -EFAULT;
45729 + } else {
45730 + if (wmi_startscan_cmd(ar->arWmi, setStartScanCmd.scanType,
45731 + setStartScanCmd.forceFgScan,
45732 + setStartScanCmd.isLegacy,
45733 + setStartScanCmd.homeDwellTime,
45734 + setStartScanCmd.forceScanInterval) != A_OK)
45735 + {
45736 + ret = -EIO;
45737 + }
45738 + }
45739 + break;
45740 + }
45741 + case AR6000_XIOCTL_WMI_SETFIXRATES:
45742 + {
45743 + WMI_FIX_RATES_CMD setFixRatesCmd;
45744 + A_STATUS returnStatus;
45745 +
45746 + if (ar->arWmiReady == FALSE) {
45747 + ret = -EIO;
45748 + } else if (copy_from_user(&setFixRatesCmd, userdata,
45749 + sizeof(setFixRatesCmd)))
45750 + {
45751 + ret = -EFAULT;
45752 + } else {
45753 + returnStatus = wmi_set_fixrates_cmd(ar->arWmi, setFixRatesCmd.fixRateMask);
45754 + if (returnStatus == A_EINVAL)
45755 + {
45756 + ret = -EINVAL;
45757 + }
45758 + else if(returnStatus != A_OK) {
45759 + ret = -EIO;
45760 + }
45761 + }
45762 + break;
45763 + }
45764 +
45765 + case AR6000_XIOCTL_WMI_GETFIXRATES:
45766 + {
45767 + WMI_FIX_RATES_CMD getFixRatesCmd;
45768 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
45769 + int ret = 0;
45770 +
45771 + if (ar->arWmiReady == FALSE) {
45772 + return -EIO;
45773 + }
45774 +
45775 + if (down_interruptible(&ar->arSem)) {
45776 + return -ERESTARTSYS;
45777 + }
45778 + /* Used copy_from_user/copy_to_user to access user space data */
45779 + if (copy_from_user(&getFixRatesCmd, userdata, sizeof(getFixRatesCmd))) {
45780 + ret = -EFAULT;
45781 + } else {
45782 + ar->arRateMask = 0xFFFF;
45783 +
45784 + if (wmi_get_ratemask_cmd(ar->arWmi) != A_OK) {
45785 + up(&ar->arSem);
45786 + return -EIO;
45787 + }
45788 +
45789 + wait_event_interruptible_timeout(arEvent, ar->arRateMask != 0xFFFF, wmitimeout * HZ);
45790 +
45791 + if (signal_pending(current)) {
45792 + ret = -EINTR;
45793 + }
45794 +
45795 + if (!ret) {
45796 + getFixRatesCmd.fixRateMask = ar->arRateMask;
45797 + }
45798 +
45799 + if(copy_to_user(userdata, &getFixRatesCmd, sizeof(getFixRatesCmd))) {
45800 + ret = -EFAULT;
45801 + }
45802 +
45803 + up(&ar->arSem);
45804 + }
45805 + break;
45806 + }
45807 + case AR6000_XIOCTL_WMI_SET_AUTHMODE:
45808 + {
45809 + WMI_SET_AUTH_MODE_CMD setAuthMode;
45810 +
45811 + if (ar->arWmiReady == FALSE) {
45812 + ret = -EIO;
45813 + } else if (copy_from_user(&setAuthMode, userdata,
45814 + sizeof(setAuthMode)))
45815 + {
45816 + ret = -EFAULT;
45817 + } else {
45818 + if (wmi_set_authmode_cmd(ar->arWmi, setAuthMode.mode) != A_OK)
45819 + {
45820 + ret = -EIO;
45821 + }
45822 + }
45823 + break;
45824 + }
45825 + case AR6000_XIOCTL_WMI_SET_REASSOCMODE:
45826 + {
45827 + WMI_SET_REASSOC_MODE_CMD setReassocMode;
45828 +
45829 + if (ar->arWmiReady == FALSE) {
45830 + ret = -EIO;
45831 + } else if (copy_from_user(&setReassocMode, userdata,
45832 + sizeof(setReassocMode)))
45833 + {
45834 + ret = -EFAULT;
45835 + } else {
45836 + if (wmi_set_reassocmode_cmd(ar->arWmi, setReassocMode.mode) != A_OK)
45837 + {
45838 + ret = -EIO;
45839 + }
45840 + }
45841 + break;
45842 + }
45843 + case AR6000_XIOCTL_DIAG_READ:
45844 + {
45845 + A_UINT32 addr, data;
45846 + get_user(addr, (unsigned int *)userdata);
45847 + if (ar6000_ReadRegDiag(ar->arHifDevice, &addr, &data) != A_OK) {
45848 + ret = -EIO;
45849 + }
45850 + put_user(data, (unsigned int *)userdata + 1);
45851 + break;
45852 + }
45853 + case AR6000_XIOCTL_DIAG_WRITE:
45854 + {
45855 + A_UINT32 addr, data;
45856 + get_user(addr, (unsigned int *)userdata);
45857 + get_user(data, (unsigned int *)userdata + 1);
45858 + if (ar6000_WriteRegDiag(ar->arHifDevice, &addr, &data) != A_OK) {
45859 + ret = -EIO;
45860 + }
45861 + break;
45862 + }
45863 + case AR6000_XIOCTL_WMI_SET_KEEPALIVE:
45864 + {
45865 + WMI_SET_KEEPALIVE_CMD setKeepAlive;
45866 + if (ar->arWmiReady == FALSE) {
45867 + return -EIO;
45868 + } else if (copy_from_user(&setKeepAlive, userdata,
45869 + sizeof(setKeepAlive))){
45870 + ret = -EFAULT;
45871 + } else {
45872 + if (wmi_set_keepalive_cmd(ar->arWmi, setKeepAlive.keepaliveInterval) != A_OK) {
45873 + ret = -EIO;
45874 + }
45875 + }
45876 + break;
45877 + }
45878 + case AR6000_XIOCTL_WMI_GET_KEEPALIVE:
45879 + {
45880 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
45881 + WMI_GET_KEEPALIVE_CMD getKeepAlive;
45882 + int ret = 0;
45883 + if (ar->arWmiReady == FALSE) {
45884 + return -EIO;
45885 + }
45886 + if (down_interruptible(&ar->arSem)) {
45887 + return -ERESTARTSYS;
45888 + }
45889 + if (copy_from_user(&getKeepAlive, userdata,sizeof(getKeepAlive))) {
45890 + ret = -EFAULT;
45891 + } else {
45892 + getKeepAlive.keepaliveInterval = wmi_get_keepalive_cmd(ar->arWmi);
45893 + ar->arKeepaliveConfigured = 0xFF;
45894 + if (wmi_get_keepalive_configured(ar->arWmi) != A_OK){
45895 + up(&ar->arSem);
45896 + return -EIO;
45897 + }
45898 + wait_event_interruptible_timeout(arEvent, ar->arKeepaliveConfigured != 0xFF, wmitimeout * HZ);
45899 + if (signal_pending(current)) {
45900 + ret = -EINTR;
45901 + }
45902 +
45903 + if (!ret) {
45904 + getKeepAlive.configured = ar->arKeepaliveConfigured;
45905 + }
45906 + if (copy_to_user(userdata, &getKeepAlive, sizeof(getKeepAlive))) {
45907 + ret = -EFAULT;
45908 + }
45909 + up(&ar->arSem);
45910 + }
45911 + break;
45912 + }
45913 + case AR6000_XIOCTL_WMI_SET_APPIE:
45914 + {
45915 + WMI_SET_APPIE_CMD appIEcmd;
45916 + A_UINT8 appIeInfo[IEEE80211_APPIE_FRAME_MAX_LEN];
45917 + A_UINT32 fType,ieLen;
45918 +
45919 + if (ar->arWmiReady == FALSE) {
45920 + return -EIO;
45921 + }
45922 + get_user(fType, (A_UINT32 *)userdata);
45923 + appIEcmd.mgmtFrmType = fType;
45924 + if (appIEcmd.mgmtFrmType >= IEEE80211_APPIE_NUM_OF_FRAME) {
45925 + ret = -EIO;
45926 + } else {
45927 + get_user(ieLen, (A_UINT32 *)(userdata + 4));
45928 + appIEcmd.ieLen = ieLen;
45929 + if (appIEcmd.ieLen > IEEE80211_APPIE_FRAME_MAX_LEN) {
45930 + ret = -EIO;
45931 + break;
45932 + }
45933 + if (copy_from_user(appIeInfo, userdata + 8, appIEcmd.ieLen)) {
45934 + ret = -EFAULT;
45935 + } else {
45936 + if (wmi_set_appie_cmd(ar->arWmi, appIEcmd.mgmtFrmType,
45937 + appIEcmd.ieLen, appIeInfo) != A_OK)
45938 + {
45939 + ret = -EIO;
45940 + }
45941 + }
45942 + }
45943 + break;
45944 + }
45945 + case AR6000_XIOCTL_WMI_SET_MGMT_FRM_RX_FILTER:
45946 + {
45947 + WMI_BSS_FILTER_CMD cmd;
45948 + A_UINT32 filterType;
45949 +
45950 + if (copy_from_user(&filterType, userdata, sizeof(A_UINT32)))
45951 + {
45952 + return -EFAULT;
45953 + }
45954 + if (filterType & (IEEE80211_FILTER_TYPE_BEACON |
45955 + IEEE80211_FILTER_TYPE_PROBE_RESP))
45956 + {
45957 + cmd.bssFilter = ALL_BSS_FILTER;
45958 + } else {
45959 + cmd.bssFilter = NONE_BSS_FILTER;
45960 + }
45961 + if (wmi_bssfilter_cmd(ar->arWmi, cmd.bssFilter, 0) != A_OK) {
45962 + ret = -EIO;
45963 + }
45964 +
45965 + AR6000_SPIN_LOCK(&ar->arLock, 0);
45966 + ar->arMgmtFilter = filterType;
45967 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
45968 + break;
45969 + }
45970 + case AR6000_XIOCTL_WMI_SET_WSC_STATUS:
45971 + {
45972 + A_UINT32 wsc_status;
45973 +
45974 + if (copy_from_user(&wsc_status, userdata, sizeof(A_UINT32)))
45975 + {
45976 + return -EFAULT;
45977 + }
45978 + if (wmi_set_wsc_status_cmd(ar->arWmi, wsc_status) != A_OK) {
45979 + ret = -EIO;
45980 + }
45981 + break;
45982 + }
45983 + case AR6000_XIOCTL_BMI_ROMPATCH_INSTALL:
45984 + {
45985 + A_UINT32 ROM_addr;
45986 + A_UINT32 RAM_addr;
45987 + A_UINT32 nbytes;
45988 + A_UINT32 do_activate;
45989 + A_UINT32 rompatch_id;
45990 +
45991 + get_user(ROM_addr, (A_UINT32 *)userdata);
45992 + get_user(RAM_addr, (A_UINT32 *)userdata + 1);
45993 + get_user(nbytes, (A_UINT32 *)userdata + 2);
45994 + get_user(do_activate, (A_UINT32 *)userdata + 3);
45995 + AR_DEBUG_PRINTF("Install rompatch from ROM: 0x%x to RAM: 0x%x length: %d\n",
45996 + ROM_addr, RAM_addr, nbytes);
45997 + ret = BMIrompatchInstall(hifDevice, ROM_addr, RAM_addr,
45998 + nbytes, do_activate, &rompatch_id);
45999 + if (ret == A_OK) {
46000 + put_user(rompatch_id, (unsigned int *)rq->ifr_data); /* return value */
46001 + }
46002 + break;
46003 + }
46004 +
46005 + case AR6000_XIOCTL_BMI_ROMPATCH_UNINSTALL:
46006 + {
46007 + A_UINT32 rompatch_id;
46008 +
46009 + get_user(rompatch_id, (A_UINT32 *)userdata);
46010 + AR_DEBUG_PRINTF("UNinstall rompatch_id %d\n", rompatch_id);
46011 + ret = BMIrompatchUninstall(hifDevice, rompatch_id);
46012 + break;
46013 + }
46014 +
46015 + case AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE:
46016 + case AR6000_XIOCTL_BMI_ROMPATCH_DEACTIVATE:
46017 + {
46018 + A_UINT32 rompatch_count;
46019 +
46020 + get_user(rompatch_count, (A_UINT32 *)userdata);
46021 + AR_DEBUG_PRINTF("Change rompatch activation count=%d\n", rompatch_count);
46022 + length = sizeof(A_UINT32) * rompatch_count;
46023 + if ((buffer = (unsigned char *)A_MALLOC(length)) != NULL) {
46024 + A_MEMZERO(buffer, length);
46025 + if (copy_from_user(buffer, &userdata[sizeof(rompatch_count)], length))
46026 + {
46027 + ret = -EFAULT;
46028 + } else {
46029 + if (cmd == AR6000_XIOCTL_BMI_ROMPATCH_ACTIVATE) {
46030 + ret = BMIrompatchActivate(hifDevice, rompatch_count, (A_UINT32 *)buffer);
46031 + } else {
46032 + ret = BMIrompatchDeactivate(hifDevice, rompatch_count, (A_UINT32 *)buffer);
46033 + }
46034 + }
46035 + A_FREE(buffer);
46036 + } else {
46037 + ret = -ENOMEM;
46038 + }
46039 +
46040 + break;
46041 + }
46042 +
46043 + case AR6000_XIOCTL_WMI_SET_HOST_SLEEP_MODE:
46044 + {
46045 + WMI_SET_HOST_SLEEP_MODE_CMD setHostSleepMode;
46046 +
46047 + if (ar->arWmiReady == FALSE) {
46048 + ret = -EIO;
46049 + } else if (copy_from_user(&setHostSleepMode, userdata,
46050 + sizeof(setHostSleepMode)))
46051 + {
46052 + ret = -EFAULT;
46053 + } else {
46054 + if (wmi_set_host_sleep_mode_cmd(ar->arWmi,
46055 + &setHostSleepMode) != A_OK)
46056 + {
46057 + ret = -EIO;
46058 + }
46059 + }
46060 + break;
46061 + }
46062 + case AR6000_XIOCTL_WMI_SET_WOW_MODE:
46063 + {
46064 + WMI_SET_WOW_MODE_CMD setWowMode;
46065 +
46066 + if (ar->arWmiReady == FALSE) {
46067 + ret = -EIO;
46068 + } else if (copy_from_user(&setWowMode, userdata,
46069 + sizeof(setWowMode)))
46070 + {
46071 + ret = -EFAULT;
46072 + } else {
46073 + if (wmi_set_wow_mode_cmd(ar->arWmi,
46074 + &setWowMode) != A_OK)
46075 + {
46076 + ret = -EIO;
46077 + }
46078 + }
46079 + break;
46080 + }
46081 + case AR6000_XIOCTL_WMI_GET_WOW_LIST:
46082 + {
46083 + WMI_GET_WOW_LIST_CMD getWowList;
46084 +
46085 + if (ar->arWmiReady == FALSE) {
46086 + ret = -EIO;
46087 + } else if (copy_from_user(&getWowList, userdata,
46088 + sizeof(getWowList)))
46089 + {
46090 + ret = -EFAULT;
46091 + } else {
46092 + if (wmi_get_wow_list_cmd(ar->arWmi,
46093 + &getWowList) != A_OK)
46094 + {
46095 + ret = -EIO;
46096 + }
46097 + }
46098 + break;
46099 + }
46100 + case AR6000_XIOCTL_WMI_ADD_WOW_PATTERN:
46101 + {
46102 +#define WOW_PATTERN_SIZE 64
46103 +#define WOW_MASK_SIZE 64
46104 +
46105 + WMI_ADD_WOW_PATTERN_CMD cmd;
46106 + A_UINT8 mask_data[WOW_PATTERN_SIZE]={0};
46107 + A_UINT8 pattern_data[WOW_PATTERN_SIZE]={0};
46108 +
46109 + if (ar->arWmiReady == FALSE) {
46110 + ret = -EIO;
46111 + } else {
46112 +
46113 + if(copy_from_user(&cmd, userdata,
46114 + sizeof(WMI_ADD_WOW_PATTERN_CMD)))
46115 + return -EFAULT;
46116 + if (copy_from_user(pattern_data,
46117 + userdata + 3,
46118 + cmd.filter_size)){
46119 + ret = -EFAULT;
46120 + break;
46121 + }
46122 + if (copy_from_user(mask_data,
46123 + (userdata + 3 + cmd.filter_size),
46124 + cmd.filter_size)){
46125 + ret = -EFAULT;
46126 + break;
46127 + } else {
46128 + if (wmi_add_wow_pattern_cmd(ar->arWmi,
46129 + &cmd, pattern_data, mask_data, cmd.filter_size) != A_OK){
46130 + ret = -EIO;
46131 + }
46132 + }
46133 + }
46134 +#undef WOW_PATTERN_SIZE
46135 +#undef WOW_MASK_SIZE
46136 + break;
46137 + }
46138 + case AR6000_XIOCTL_WMI_DEL_WOW_PATTERN:
46139 + {
46140 + WMI_DEL_WOW_PATTERN_CMD delWowPattern;
46141 +
46142 + if (ar->arWmiReady == FALSE) {
46143 + ret = -EIO;
46144 + } else if (copy_from_user(&delWowPattern, userdata,
46145 + sizeof(delWowPattern)))
46146 + {
46147 + ret = -EFAULT;
46148 + } else {
46149 + if (wmi_del_wow_pattern_cmd(ar->arWmi,
46150 + &delWowPattern) != A_OK)
46151 + {
46152 + ret = -EIO;
46153 + }
46154 + }
46155 + break;
46156 + }
46157 + case AR6000_XIOCTL_DUMP_HTC_CREDIT_STATE:
46158 + if (ar->arHtcTarget != NULL) {
46159 + HTCDumpCreditStates(ar->arHtcTarget);
46160 + }
46161 + break;
46162 + case AR6000_XIOCTL_TRAFFIC_ACTIVITY_CHANGE:
46163 + if (ar->arHtcTarget != NULL) {
46164 + struct ar6000_traffic_activity_change data;
46165 +
46166 + if (copy_from_user(&data, userdata, sizeof(data)))
46167 + {
46168 + return -EFAULT;
46169 + }
46170 + /* note, this is used for testing (mbox ping testing), indicate activity
46171 + * change using the stream ID as the traffic class */
46172 + ar6000_indicate_tx_activity(ar,
46173 + (A_UINT8)data.StreamID,
46174 + data.Active ? TRUE : FALSE);
46175 + }
46176 + break;
46177 + case AR6000_XIOCTL_WMI_SET_CONNECT_CTRL_FLAGS:
46178 + if (ar->arWmiReady == FALSE) {
46179 + ret = -EIO;
46180 + } else if (copy_from_user(&connectCtrlFlags, userdata,
46181 + sizeof(connectCtrlFlags)))
46182 + {
46183 + ret = -EFAULT;
46184 + } else {
46185 + ar->arConnectCtrlFlags = connectCtrlFlags;
46186 + }
46187 + break;
46188 + case AR6000_XIOCTL_WMI_SET_AKMP_PARAMS:
46189 + if (ar->arWmiReady == FALSE) {
46190 + ret = -EIO;
46191 + } else if (copy_from_user(&akmpParams, userdata,
46192 + sizeof(WMI_SET_AKMP_PARAMS_CMD)))
46193 + {
46194 + ret = -EFAULT;
46195 + } else {
46196 + if (wmi_set_akmp_params_cmd(ar->arWmi, &akmpParams) != A_OK) {
46197 + ret = -EIO;
46198 + }
46199 + }
46200 + break;
46201 + case AR6000_XIOCTL_WMI_SET_PMKID_LIST:
46202 + if (ar->arWmiReady == FALSE) {
46203 + ret = -EIO;
46204 + } else {
46205 + if (copy_from_user(&pmkidInfo.numPMKID, userdata,
46206 + sizeof(pmkidInfo.numPMKID)))
46207 + {
46208 + ret = -EFAULT;
46209 + break;
46210 + }
46211 + if (copy_from_user(&pmkidInfo.pmkidList,
46212 + userdata + sizeof(pmkidInfo.numPMKID),
46213 + pmkidInfo.numPMKID * sizeof(WMI_PMKID)))
46214 + {
46215 + ret = -EFAULT;
46216 + break;
46217 + }
46218 + if (wmi_set_pmkid_list_cmd(ar->arWmi, &pmkidInfo) != A_OK) {
46219 + ret = -EIO;
46220 + }
46221 + }
46222 + break;
46223 + case AR6000_XIOCTL_WMI_GET_PMKID_LIST:
46224 + if (ar->arWmiReady == FALSE) {
46225 + ret = -EIO;
46226 + } else {
46227 + if (wmi_get_pmkid_list_cmd(ar->arWmi) != A_OK) {
46228 + ret = -EIO;
46229 + }
46230 + }
46231 + break;
46232 + default:
46233 + ret = -EOPNOTSUPP;
46234 + }
46235 + return ret;
46236 +}
46237 +
46238 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/netbuf.c
46239 ===================================================================
46240 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
46241 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/netbuf.c 2008-12-11 22:46:49.000000000 +0100
46242 @@ -0,0 +1,225 @@
46243 +
46244 +/*
46245 + *
46246 + * Copyright (c) 2004-2007 Atheros Communications Inc.
46247 + * All rights reserved.
46248 + *
46249 + *
46250 + * This program is free software; you can redistribute it and/or modify
46251 + * it under the terms of the GNU General Public License version 2 as
46252 + * published by the Free Software Foundation;
46253 + *
46254 + * Software distributed under the License is distributed on an "AS
46255 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
46256 + * implied. See the License for the specific language governing
46257 + * rights and limitations under the License.
46258 + *
46259 + *
46260 + *
46261 + */
46262 +#include <linux/kernel.h>
46263 +#include <linux/skbuff.h>
46264 +#include <a_config.h>
46265 +#include "athdefs.h"
46266 +#include "a_types.h"
46267 +#include "a_osapi.h"
46268 +#include "htc_packet.h"
46269 +
46270 +#define AR6000_DATA_OFFSET 64
46271 +
46272 +void a_netbuf_enqueue(A_NETBUF_QUEUE_T *q, void *pkt)
46273 +{
46274 + skb_queue_tail((struct sk_buff_head *) q, (struct sk_buff *) pkt);
46275 +}
46276 +
46277 +void a_netbuf_prequeue(A_NETBUF_QUEUE_T *q, void *pkt)
46278 +{
46279 + skb_queue_head((struct sk_buff_head *) q, (struct sk_buff *) pkt);
46280 +}
46281 +
46282 +void *a_netbuf_dequeue(A_NETBUF_QUEUE_T *q)
46283 +{
46284 + return((void *) skb_dequeue((struct sk_buff_head *) q));
46285 +}
46286 +
46287 +int a_netbuf_queue_size(A_NETBUF_QUEUE_T *q)
46288 +{
46289 + return(skb_queue_len((struct sk_buff_head *) q));
46290 +}
46291 +
46292 +int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q)
46293 +{
46294 + return(skb_queue_empty((struct sk_buff_head *) q));
46295 +}
46296 +
46297 +void a_netbuf_queue_init(A_NETBUF_QUEUE_T *q)
46298 +{
46299 + skb_queue_head_init((struct sk_buff_head *) q);
46300 +}
46301 +
46302 +void *
46303 +a_netbuf_alloc(int size)
46304 +{
46305 + struct sk_buff *skb;
46306 + skb = dev_alloc_skb(AR6000_DATA_OFFSET + sizeof(HTC_PACKET) + size);
46307 + skb_reserve(skb, AR6000_DATA_OFFSET + sizeof(HTC_PACKET));
46308 + return ((void *)skb);
46309 +}
46310 +
46311 +/*
46312 + * Allocate an SKB w.o. any encapsulation requirement.
46313 + */
46314 +void *
46315 +a_netbuf_alloc_raw(int size)
46316 +{
46317 + struct sk_buff *skb;
46318 +
46319 + skb = dev_alloc_skb(size);
46320 +
46321 + return ((void *)skb);
46322 +}
46323 +
46324 +void
46325 +a_netbuf_free(void *bufPtr)
46326 +{
46327 + struct sk_buff *skb = (struct sk_buff *)bufPtr;
46328 +
46329 + dev_kfree_skb(skb);
46330 +}
46331 +
46332 +A_UINT32
46333 +a_netbuf_to_len(void *bufPtr)
46334 +{
46335 + return (((struct sk_buff *)bufPtr)->len);
46336 +}
46337 +
46338 +void *
46339 +a_netbuf_to_data(void *bufPtr)
46340 +{
46341 + return (((struct sk_buff *)bufPtr)->data);
46342 +}
46343 +
46344 +/*
46345 + * Add len # of bytes to the beginning of the network buffer
46346 + * pointed to by bufPtr
46347 + */
46348 +A_STATUS
46349 +a_netbuf_push(void *bufPtr, A_INT32 len)
46350 +{
46351 + skb_push((struct sk_buff *)bufPtr, len);
46352 +
46353 + return A_OK;
46354 +}
46355 +
46356 +/*
46357 + * Add len # of bytes to the beginning of the network buffer
46358 + * pointed to by bufPtr and also fill with data
46359 + */
46360 +A_STATUS
46361 +a_netbuf_push_data(void *bufPtr, char *srcPtr, A_INT32 len)
46362 +{
46363 + skb_push((struct sk_buff *) bufPtr, len);
46364 + A_MEMCPY(((struct sk_buff *)bufPtr)->data, srcPtr, len);
46365 +
46366 + return A_OK;
46367 +}
46368 +
46369 +/*
46370 + * Add len # of bytes to the end of the network buffer
46371 + * pointed to by bufPtr
46372 + */
46373 +A_STATUS
46374 +a_netbuf_put(void *bufPtr, A_INT32 len)
46375 +{
46376 + skb_put((struct sk_buff *)bufPtr, len);
46377 +
46378 + return A_OK;
46379 +}
46380 +
46381 +/*
46382 + * Add len # of bytes to the end of the network buffer
46383 + * pointed to by bufPtr and also fill with data
46384 + */
46385 +A_STATUS
46386 +a_netbuf_put_data(void *bufPtr, char *srcPtr, A_INT32 len)
46387 +{
46388 + char *start = ((struct sk_buff *)bufPtr)->data +
46389 + ((struct sk_buff *)bufPtr)->len;
46390 + skb_put((struct sk_buff *)bufPtr, len);
46391 + A_MEMCPY(start, srcPtr, len);
46392 +
46393 + return A_OK;
46394 +}
46395 +
46396 +
46397 +/*
46398 + * Trim the network buffer pointed to by bufPtr to len # of bytes
46399 + */
46400 +A_STATUS
46401 +a_netbuf_setlen(void *bufPtr, A_INT32 len)
46402 +{
46403 + skb_trim((struct sk_buff *)bufPtr, len);
46404 +
46405 + return A_OK;
46406 +}
46407 +
46408 +/*
46409 + * Chop of len # of bytes from the end of the buffer.
46410 + */
46411 +A_STATUS
46412 +a_netbuf_trim(void *bufPtr, A_INT32 len)
46413 +{
46414 + skb_trim((struct sk_buff *)bufPtr, ((struct sk_buff *)bufPtr)->len - len);
46415 +
46416 + return A_OK;
46417 +}
46418 +
46419 +/*
46420 + * Chop of len # of bytes from the end of the buffer and return the data.
46421 + */
46422 +A_STATUS
46423 +a_netbuf_trim_data(void *bufPtr, char *dstPtr, A_INT32 len)
46424 +{
46425 + char *start = ((struct sk_buff *)bufPtr)->data +
46426 + (((struct sk_buff *)bufPtr)->len - len);
46427 +
46428 + A_MEMCPY(dstPtr, start, len);
46429 + skb_trim((struct sk_buff *)bufPtr, ((struct sk_buff *)bufPtr)->len - len);
46430 +
46431 + return A_OK;
46432 +}
46433 +
46434 +
46435 +/*
46436 + * Returns the number of bytes available to a a_netbuf_push()
46437 + */
46438 +A_INT32
46439 +a_netbuf_headroom(void *bufPtr)
46440 +{
46441 + return (skb_headroom((struct sk_buff *)bufPtr));
46442 +}
46443 +
46444 +/*
46445 + * Removes specified number of bytes from the beginning of the buffer
46446 + */
46447 +A_STATUS
46448 +a_netbuf_pull(void *bufPtr, A_INT32 len)
46449 +{
46450 + skb_pull((struct sk_buff *)bufPtr, len);
46451 +
46452 + return A_OK;
46453 +}
46454 +
46455 +/*
46456 + * Removes specified number of bytes from the beginning of the buffer
46457 + * and return the data
46458 + */
46459 +A_STATUS
46460 +a_netbuf_pull_data(void *bufPtr, char *dstPtr, A_INT32 len)
46461 +{
46462 + A_MEMCPY(dstPtr, ((struct sk_buff *)bufPtr)->data, len);
46463 + skb_pull((struct sk_buff *)bufPtr, len);
46464 +
46465 + return A_OK;
46466 +}
46467 +
46468 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/osapi_linux.h
46469 ===================================================================
46470 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
46471 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/osapi_linux.h 2008-12-11 22:46:49.000000000 +0100
46472 @@ -0,0 +1,319 @@
46473 +/*
46474 + * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/osapi_linux.h#1 $
46475 + *
46476 + * This file contains the definitions of the basic atheros data types.
46477 + * It is used to map the data types in atheros files to a platform specific
46478 + * type.
46479 + *
46480 + * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
46481 + *
46482 + *
46483 + * This program is free software; you can redistribute it and/or modify
46484 + * it under the terms of the GNU General Public License version 2 as
46485 + * published by the Free Software Foundation;
46486 + *
46487 + * Software distributed under the License is distributed on an "AS
46488 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
46489 + * implied. See the License for the specific language governing
46490 + * rights and limitations under the License.
46491 + *
46492 + *
46493 + *
46494 + */
46495 +
46496 +#ifndef _OSAPI_LINUX_H_
46497 +#define _OSAPI_LINUX_H_
46498 +
46499 +#ifdef __KERNEL__
46500 +
46501 +#include <linux/version.h>
46502 +#include <linux/types.h>
46503 +#include <linux/kernel.h>
46504 +#include <linux/string.h>
46505 +#include <linux/skbuff.h>
46506 +#include <linux/netdevice.h>
46507 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
46508 +#include <linux/jiffies.h>
46509 +#endif
46510 +#include <linux/timer.h>
46511 +#include <linux/delay.h>
46512 +#include <linux/wait.h>
46513 +#ifdef KERNEL_2_4
46514 +#include <asm/arch/irq.h>
46515 +#include <asm/irq.h>
46516 +#endif
46517 +
46518 +#ifdef __GNUC__
46519 +#define __ATTRIB_PACK __attribute__ ((packed))
46520 +#define __ATTRIB_PRINTF __attribute__ ((format (printf, 1, 2)))
46521 +#define __ATTRIB_NORETURN __attribute__ ((noreturn))
46522 +#ifndef INLINE
46523 +#define INLINE __inline__
46524 +#endif
46525 +#else /* Not GCC */
46526 +#define __ATTRIB_PACK
46527 +#define __ATTRIB_PRINTF
46528 +#define __ATTRIB_NORETURN
46529 +#ifndef INLINE
46530 +#define INLINE __inline
46531 +#endif
46532 +#endif /* End __GNUC__ */
46533 +
46534 +#define PREPACK
46535 +#define POSTPACK __ATTRIB_PACK
46536 +
46537 +/*
46538 + * Endianes macros
46539 + */
46540 +#define A_BE2CPU8(x) ntohb(x)
46541 +#define A_BE2CPU16(x) ntohs(x)
46542 +#define A_BE2CPU32(x) ntohl(x)
46543 +
46544 +#define A_LE2CPU8(x) (x)
46545 +#define A_LE2CPU16(x) (x)
46546 +#define A_LE2CPU32(x) (x)
46547 +
46548 +#define A_CPU2BE8(x) htonb(x)
46549 +#define A_CPU2BE16(x) htons(x)
46550 +#define A_CPU2BE32(x) htonl(x)
46551 +
46552 +#define A_MEMCPY(dst, src, len) memcpy((A_UINT8 *)(dst), (src), (len))
46553 +#define A_MEMZERO(addr, len) memset(addr, 0, len)
46554 +#define A_MEMCMP(addr1, addr2, len) memcmp((addr1), (addr2), (len))
46555 +#define A_MALLOC(size) kmalloc((size), GFP_KERNEL)
46556 +#define A_MALLOC_NOWAIT(size) kmalloc((size), GFP_ATOMIC)
46557 +#define A_FREE(addr) kfree(addr)
46558 +#define A_PRINTF(args...) printk(args)
46559 +
46560 +/* Mutual Exclusion */
46561 +typedef spinlock_t A_MUTEX_T;
46562 +#define A_MUTEX_INIT(mutex) spin_lock_init(mutex)
46563 +#define A_MUTEX_LOCK(mutex) spin_lock_bh(mutex)
46564 +#define A_MUTEX_UNLOCK(mutex) spin_unlock_bh(mutex)
46565 +#define A_IS_MUTEX_VALID(mutex) TRUE /* okay to return true, since A_MUTEX_DELETE does nothing */
46566 +#define A_MUTEX_DELETE(mutex) /* spin locks are not kernel resources so nothing to free.. */
46567 +
46568 +/* Get current time in ms adding a constant offset (in ms) */
46569 +#define A_GET_MS(offset) \
46570 + (jiffies + ((offset) / 1000) * HZ)
46571 +
46572 +/*
46573 + * Timer Functions
46574 + */
46575 +#define A_MDELAY(msecs) mdelay(msecs)
46576 +typedef struct timer_list A_TIMER;
46577 +
46578 +#define A_INIT_TIMER(pTimer, pFunction, pArg) do { \
46579 + init_timer(pTimer); \
46580 + (pTimer)->function = (pFunction); \
46581 + (pTimer)->data = (unsigned long)(pArg); \
46582 +} while (0)
46583 +
46584 +/*
46585 + * Start a Timer that elapses after 'periodMSec' milli-seconds
46586 + * Support is provided for a one-shot timer. The 'repeatFlag' is
46587 + * ignored.
46588 + */
46589 +#define A_TIMEOUT_MS(pTimer, periodMSec, repeatFlag) do { \
46590 + if (repeatFlag) { \
46591 + printk("\n" __FILE__ ":%d: Timer Repeat requested\n",__LINE__); \
46592 + panic("Timer Repeat"); \
46593 + } \
46594 + mod_timer((pTimer), jiffies + HZ * (periodMSec) / 1000); \
46595 +} while (0)
46596 +
46597 +/*
46598 + * Cancel the Timer.
46599 + */
46600 +#define A_UNTIMEOUT(pTimer) do { \
46601 + del_timer((pTimer)); \
46602 +} while (0)
46603 +
46604 +#define A_DELETE_TIMER(pTimer) do { \
46605 +} while (0)
46606 +
46607 +/*
46608 + * Wait Queue related functions
46609 + */
46610 +typedef wait_queue_head_t A_WAITQUEUE_HEAD;
46611 +#define A_INIT_WAITQUEUE_HEAD(head) init_waitqueue_head(head)
46612 +#ifndef wait_event_interruptible_timeout
46613 +#define __wait_event_interruptible_timeout(wq, condition, ret) \
46614 +do { \
46615 + wait_queue_t __wait; \
46616 + init_waitqueue_entry(&__wait, current); \
46617 + \
46618 + add_wait_queue(&wq, &__wait); \
46619 + for (;;) { \
46620 + set_current_state(TASK_INTERRUPTIBLE); \
46621 + if (condition) \
46622 + break; \
46623 + if (!signal_pending(current)) { \
46624 + ret = schedule_timeout(ret); \
46625 + if (!ret) \
46626 + break; \
46627 + continue; \
46628 + } \
46629 + ret = -ERESTARTSYS; \
46630 + break; \
46631 + } \
46632 + current->state = TASK_RUNNING; \
46633 + remove_wait_queue(&wq, &__wait); \
46634 +} while (0)
46635 +
46636 +#define wait_event_interruptible_timeout(wq, condition, timeout) \
46637 +({ \
46638 + long __ret = timeout; \
46639 + if (!(condition)) \
46640 + __wait_event_interruptible_timeout(wq, condition, __ret); \
46641 + __ret; \
46642 +})
46643 +#endif /* wait_event_interruptible_timeout */
46644 +
46645 +#define A_WAIT_EVENT_INTERRUPTIBLE_TIMEOUT(head, condition, timeout) do { \
46646 + wait_event_interruptible_timeout(head, condition, timeout); \
46647 +} while (0)
46648 +
46649 +#define A_WAKE_UP(head) wake_up(head)
46650 +
46651 +#ifdef DEBUG
46652 +#define A_ASSERT(expr) \
46653 + if (!(expr)) { \
46654 + printk(KERN_ALERT "\n" __FILE__ ":%d: Assertion " #expr " failed!\n",__LINE__); \
46655 + panic(#expr); \
46656 + }
46657 +
46658 +#else
46659 +#define A_ASSERT(expr)
46660 +#endif /* DEBUG */
46661 +
46662 +/*
46663 + * Initialization of the network buffer subsystem
46664 + */
46665 +#define A_NETBUF_INIT()
46666 +
46667 +/*
46668 + * Network buffer queue support
46669 + */
46670 +typedef struct sk_buff_head A_NETBUF_QUEUE_T;
46671 +
46672 +#define A_NETBUF_QUEUE_INIT(q) \
46673 + a_netbuf_queue_init(q)
46674 +
46675 +#define A_NETBUF_ENQUEUE(q, pkt) \
46676 + a_netbuf_enqueue((q), (pkt))
46677 +#define A_NETBUF_PREQUEUE(q, pkt) \
46678 + a_netbuf_prequeue((q), (pkt))
46679 +#define A_NETBUF_DEQUEUE(q) \
46680 + (a_netbuf_dequeue(q))
46681 +#define A_NETBUF_QUEUE_SIZE(q) \
46682 + a_netbuf_queue_size(q)
46683 +#define A_NETBUF_QUEUE_EMPTY(q) \
46684 + a_netbuf_queue_empty(q)
46685 +
46686 +/*
46687 + * Network buffer support
46688 + */
46689 +#define A_NETBUF_ALLOC(size) \
46690 + a_netbuf_alloc(size)
46691 +#define A_NETBUF_ALLOC_RAW(size) \
46692 + a_netbuf_alloc_raw(size)
46693 +#define A_NETBUF_FREE(bufPtr) \
46694 + a_netbuf_free(bufPtr)
46695 +#define A_NETBUF_DATA(bufPtr) \
46696 + a_netbuf_to_data(bufPtr)
46697 +#define A_NETBUF_LEN(bufPtr) \
46698 + a_netbuf_to_len(bufPtr)
46699 +#define A_NETBUF_PUSH(bufPtr, len) \
46700 + a_netbuf_push(bufPtr, len)
46701 +#define A_NETBUF_PUT(bufPtr, len) \
46702 + a_netbuf_put(bufPtr, len)
46703 +#define A_NETBUF_TRIM(bufPtr,len) \
46704 + a_netbuf_trim(bufPtr, len)
46705 +#define A_NETBUF_PULL(bufPtr, len) \
46706 + a_netbuf_pull(bufPtr, len)
46707 +#define A_NETBUF_HEADROOM(bufPtr)\
46708 + a_netbuf_headroom(bufPtr)
46709 +#define A_NETBUF_SETLEN(bufPtr,len) \
46710 + a_netbuf_setlen(bufPtr, len)
46711 +
46712 +/* Add data to end of a buffer */
46713 +#define A_NETBUF_PUT_DATA(bufPtr, srcPtr, len) \
46714 + a_netbuf_put_data(bufPtr, srcPtr, len)
46715 +
46716 +/* Add data to start of the buffer */
46717 +#define A_NETBUF_PUSH_DATA(bufPtr, srcPtr, len) \
46718 + a_netbuf_push_data(bufPtr, srcPtr, len)
46719 +
46720 +/* Remove data at start of the buffer */
46721 +#define A_NETBUF_PULL_DATA(bufPtr, dstPtr, len) \
46722 + a_netbuf_pull_data(bufPtr, dstPtr, len)
46723 +
46724 +/* Remove data from the end of the buffer */
46725 +#define A_NETBUF_TRIM_DATA(bufPtr, dstPtr, len) \
46726 + a_netbuf_trim_data(bufPtr, dstPtr, len)
46727 +
46728 +/* View data as "size" contiguous bytes of type "t" */
46729 +#define A_NETBUF_VIEW_DATA(bufPtr, t, size) \
46730 + (t )( ((struct skbuf *)(bufPtr))->data)
46731 +
46732 +/* return the beginning of the headroom for the buffer */
46733 +#define A_NETBUF_HEAD(bufPtr) \
46734 + ((((struct sk_buff *)(bufPtr))->head))
46735 +
46736 +/*
46737 + * OS specific network buffer access routines
46738 + */
46739 +void *a_netbuf_alloc(int size);
46740 +void *a_netbuf_alloc_raw(int size);
46741 +void a_netbuf_free(void *bufPtr);
46742 +void *a_netbuf_to_data(void *bufPtr);
46743 +A_UINT32 a_netbuf_to_len(void *bufPtr);
46744 +A_STATUS a_netbuf_push(void *bufPtr, A_INT32 len);
46745 +A_STATUS a_netbuf_push_data(void *bufPtr, char *srcPtr, A_INT32 len);
46746 +A_STATUS a_netbuf_put(void *bufPtr, A_INT32 len);
46747 +A_STATUS a_netbuf_put_data(void *bufPtr, char *srcPtr, A_INT32 len);
46748 +A_STATUS a_netbuf_pull(void *bufPtr, A_INT32 len);
46749 +A_STATUS a_netbuf_pull_data(void *bufPtr, char *dstPtr, A_INT32 len);
46750 +A_STATUS a_netbuf_trim(void *bufPtr, A_INT32 len);
46751 +A_STATUS a_netbuf_trim_data(void *bufPtr, char *dstPtr, A_INT32 len);
46752 +A_STATUS a_netbuf_setlen(void *bufPtr, A_INT32 len);
46753 +A_INT32 a_netbuf_headroom(void *bufPtr);
46754 +void a_netbuf_enqueue(A_NETBUF_QUEUE_T *q, void *pkt);
46755 +void a_netbuf_prequeue(A_NETBUF_QUEUE_T *q, void *pkt);
46756 +void *a_netbuf_dequeue(A_NETBUF_QUEUE_T *q);
46757 +int a_netbuf_queue_size(A_NETBUF_QUEUE_T *q);
46758 +int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q);
46759 +int a_netbuf_queue_empty(A_NETBUF_QUEUE_T *q);
46760 +void a_netbuf_queue_init(A_NETBUF_QUEUE_T *q);
46761 +
46762 +/*
46763 + * Kernel v.s User space functions
46764 + */
46765 +A_UINT32 a_copy_to_user(void *to, const void *from, A_UINT32 n);
46766 +A_UINT32 a_copy_from_user(void *to, const void *from, A_UINT32 n);
46767 +
46768 +#else /* __KERNEL__ */
46769 +
46770 +#ifdef __GNUC__
46771 +#define __ATTRIB_PACK __attribute__ ((packed))
46772 +#define __ATTRIB_PRINTF __attribute__ ((format (printf, 1, 2)))
46773 +#define __ATTRIB_NORETURN __attribute__ ((noreturn))
46774 +#ifndef INLINE
46775 +#define INLINE __inline__
46776 +#endif
46777 +#else /* Not GCC */
46778 +#define __ATTRIB_PACK
46779 +#define __ATTRIB_PRINTF
46780 +#define __ATTRIB_NORETURN
46781 +#ifndef INLINE
46782 +#define INLINE __inline
46783 +#endif
46784 +#endif /* End __GNUC__ */
46785 +
46786 +#define PREPACK
46787 +#define POSTPACK __ATTRIB_PACK
46788 +
46789 +#endif /* __KERNEL__ */
46790 +
46791 +#endif /* _OSAPI_LINUX_H_ */
46792 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/wireless_ext.c
46793 ===================================================================
46794 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
46795 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/ar6000/wireless_ext.c 2008-12-11 22:46:49.000000000 +0100
46796 @@ -0,0 +1,1952 @@
46797 +/*
46798 + *
46799 + * Copyright (c) 2004-2007 Atheros Communications Inc.
46800 + * All rights reserved.
46801 + *
46802 + *
46803 + * This program is free software; you can redistribute it and/or modify
46804 + * it under the terms of the GNU General Public License version 2 as
46805 + * published by the Free Software Foundation;
46806 + *
46807 + * Software distributed under the License is distributed on an "AS
46808 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
46809 + * implied. See the License for the specific language governing
46810 + * rights and limitations under the License.
46811 + *
46812 + *
46813 + *
46814 + */
46815 +
46816 +#include "ar6000_drv.h"
46817 +
46818 +static A_UINT8 bcast_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
46819 +static void ar6000_set_quality(struct iw_quality *iq, A_INT8 rssi);
46820 +extern unsigned int wmitimeout;
46821 +extern A_WAITQUEUE_HEAD arEvent;
46822 +extern wait_queue_head_t ar6000_scan_queue;
46823 +
46824 +/*
46825 + * Encode a WPA or RSN information element as a custom
46826 + * element using the hostap format.
46827 + */
46828 +static u_int
46829 +encode_ie(void *buf, size_t bufsize,
46830 + const u_int8_t *ie, size_t ielen,
46831 + const char *leader, size_t leader_len)
46832 +{
46833 + u_int8_t *p;
46834 + int i;
46835 +
46836 + if (bufsize < leader_len)
46837 + return 0;
46838 + p = buf;
46839 + memcpy(p, leader, leader_len);
46840 + bufsize -= leader_len;
46841 + p += leader_len;
46842 + for (i = 0; i < ielen && bufsize > 2; i++)
46843 + p += sprintf(p, "%02x", ie[i]);
46844 + return (i == ielen ? p - (u_int8_t *)buf : 0);
46845 +}
46846 +
46847 +void
46848 +ar6000_scan_node(void *arg, bss_t *ni)
46849 +{
46850 + struct iw_event iwe;
46851 +#if WIRELESS_EXT > 14
46852 + char buf[64*2 + 30];
46853 +#endif
46854 + struct ar_giwscan_param *param;
46855 + A_CHAR *current_ev;
46856 + A_CHAR *end_buf;
46857 + struct ieee80211_common_ie *cie;
46858 +
46859 + param = (struct ar_giwscan_param *)arg;
46860 +
46861 + if (param->current_ev >= param->end_buf) {
46862 + return;
46863 + }
46864 + if ((param->firstPass == TRUE) &&
46865 + ((ni->ni_cie.ie_wpa == NULL) && (ni->ni_cie.ie_rsn == NULL))) {
46866 + /*
46867 + * Only forward wpa bss's in first pass
46868 + */
46869 + return;
46870 + }
46871 +
46872 + if ((param->firstPass == FALSE) &&
46873 + ((ni->ni_cie.ie_wpa != NULL) || (ni->ni_cie.ie_rsn != NULL))) {
46874 + /*
46875 + * Only forward non-wpa bss's in 2nd pass
46876 + */
46877 + return;
46878 + }
46879 +
46880 + current_ev = param->current_ev;
46881 + end_buf = param->end_buf;
46882 +
46883 + cie = &ni->ni_cie;
46884 +
46885 + A_MEMZERO(&iwe, sizeof(iwe));
46886 + iwe.cmd = SIOCGIWAP;
46887 + iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
46888 + A_MEMCPY(iwe.u.ap_addr.sa_data, ni->ni_macaddr, 6);
46889 + current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
46890 + IW_EV_ADDR_LEN);
46891 +
46892 + A_MEMZERO(&iwe, sizeof(iwe));
46893 + iwe.cmd = SIOCGIWESSID;
46894 + iwe.u.data.flags = 1;
46895 + iwe.u.data.length = cie->ie_ssid[1];
46896 + current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe,
46897 + &cie->ie_ssid[2]);
46898 +
46899 + if (cie->ie_capInfo & (IEEE80211_CAPINFO_ESS|IEEE80211_CAPINFO_IBSS)) {
46900 + A_MEMZERO(&iwe, sizeof(iwe));
46901 + iwe.cmd = SIOCGIWMODE;
46902 + iwe.u.mode = cie->ie_capInfo & IEEE80211_CAPINFO_ESS ?
46903 + IW_MODE_MASTER : IW_MODE_ADHOC;
46904 + current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
46905 + IW_EV_UINT_LEN);
46906 + }
46907 +
46908 + A_MEMZERO(&iwe, sizeof(iwe));
46909 + iwe.cmd = SIOCGIWFREQ;
46910 + iwe.u.freq.m = cie->ie_chan * 100000;
46911 + iwe.u.freq.e = 1;
46912 + current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
46913 + IW_EV_FREQ_LEN);
46914 +
46915 + A_MEMZERO(&iwe, sizeof(iwe));
46916 + iwe.cmd = IWEVQUAL;
46917 + ar6000_set_quality(&iwe.u.qual, ni->ni_snr);
46918 + current_ev = iwe_stream_add_event(current_ev, end_buf, &iwe,
46919 + IW_EV_QUAL_LEN);
46920 +
46921 + A_MEMZERO(&iwe, sizeof(iwe));
46922 + iwe.cmd = SIOCGIWENCODE;
46923 + if (cie->ie_capInfo & IEEE80211_CAPINFO_PRIVACY) {
46924 + iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
46925 + } else {
46926 + iwe.u.data.flags = IW_ENCODE_DISABLED;
46927 + }
46928 + iwe.u.data.length = 0;
46929 + current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, "");
46930 +
46931 + A_MEMZERO(&iwe, sizeof(iwe));
46932 + iwe.cmd = IWEVCUSTOM;
46933 + snprintf(buf, sizeof(buf), "bcn_int=%d", cie->ie_beaconInt);
46934 + iwe.u.data.length = strlen(buf);
46935 + current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, buf);
46936 +
46937 + if (cie->ie_wpa != NULL) {
46938 + static const char wpa_leader[] = "wpa_ie=";
46939 +
46940 + A_MEMZERO(&iwe, sizeof(iwe));
46941 + iwe.cmd = IWEVCUSTOM;
46942 + iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_wpa,
46943 + cie->ie_wpa[1]+2,
46944 + wpa_leader, sizeof(wpa_leader)-1);
46945 +
46946 + if (iwe.u.data.length != 0) {
46947 + current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, buf);
46948 + }
46949 + }
46950 +
46951 + if (cie->ie_rsn != NULL && cie->ie_rsn[0] == IEEE80211_ELEMID_RSN) {
46952 + static const char rsn_leader[] = "rsn_ie=";
46953 +
46954 + A_MEMZERO(&iwe, sizeof(iwe));
46955 + iwe.cmd = IWEVCUSTOM;
46956 + iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_rsn,
46957 + cie->ie_rsn[1]+2,
46958 + rsn_leader, sizeof(rsn_leader)-1);
46959 +
46960 + if (iwe.u.data.length != 0) {
46961 + current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, buf);
46962 + }
46963 + }
46964 +
46965 + if (cie->ie_wmm != NULL) {
46966 + static const char wmm_leader[] = "wmm_ie=";
46967 +
46968 + A_MEMZERO(&iwe, sizeof(iwe));
46969 + iwe.cmd = IWEVCUSTOM;
46970 + iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_wmm,
46971 + cie->ie_wmm[1]+2,
46972 + wmm_leader, sizeof(wmm_leader)-1);
46973 + if (iwe.u.data.length != 0) {
46974 + current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, buf);
46975 + }
46976 + }
46977 +
46978 + if (cie->ie_ath != NULL) {
46979 + static const char ath_leader[] = "ath_ie=";
46980 +
46981 + A_MEMZERO(&iwe, sizeof(iwe));
46982 + iwe.cmd = IWEVCUSTOM;
46983 + iwe.u.data.length = encode_ie(buf, sizeof(buf), cie->ie_ath,
46984 + cie->ie_ath[1]+2,
46985 + ath_leader, sizeof(ath_leader)-1);
46986 + if (iwe.u.data.length != 0) {
46987 + current_ev = iwe_stream_add_point(current_ev, end_buf, &iwe, buf);
46988 + }
46989 + }
46990 +
46991 + param->current_ev = current_ev;
46992 +}
46993 +
46994 +int
46995 +ar6000_ioctl_giwscan(struct net_device *dev,
46996 + struct iw_request_info *info,
46997 + struct iw_point *data, char *extra)
46998 +{
46999 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47000 + struct ar_giwscan_param param;
47001 + int i;
47002 +
47003 + if (ar->arWlanState == WLAN_DISABLED) {
47004 + return -EIO;
47005 + }
47006 +
47007 + if (ar->arWmiReady == FALSE) {
47008 + return -EIO;
47009 + }
47010 +
47011 + param.current_ev = extra;
47012 + param.end_buf = extra + IW_SCAN_MAX_DATA;
47013 + param.firstPass = TRUE;
47014 +
47015 + /*
47016 + * Do two passes to insure WPA scan candidates
47017 + * are sorted to the front. This is a hack to deal with
47018 + * the wireless extensions capping scan results at
47019 + * IW_SCAN_MAX_DATA bytes. In densely populated environments
47020 + * it's easy to overflow this buffer (especially with WPA/RSN
47021 + * information elements). Note this sorting hack does not
47022 + * guarantee we won't overflow anyway.
47023 + */
47024 + for (i = 0; i < 2; i++) {
47025 + /*
47026 + * Translate data to WE format.
47027 + */
47028 + wmi_iterate_nodes(ar->arWmi, ar6000_scan_node, &param);
47029 + param.firstPass = FALSE;
47030 + if (param.current_ev >= param.end_buf) {
47031 + data->length = param.current_ev - extra;
47032 + return -E2BIG;
47033 + }
47034 + }
47035 +
47036 + if(!(data->length = param.current_ev - extra)) {
47037 + printk("%s(): data length %d\n", __FUNCTION__, data->length);
47038 + return -EAGAIN;
47039 + }
47040 + return 0;
47041 +}
47042 +
47043 +extern int reconnect_flag;
47044 +/* SIOCSIWESSID */
47045 +static int
47046 +ar6000_ioctl_siwessid(struct net_device *dev,
47047 + struct iw_request_info *info,
47048 + struct iw_point *data, char *ssid)
47049 +{
47050 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47051 + A_STATUS status;
47052 + A_UINT8 arNetworkType;
47053 +
47054 + if (ar->arWlanState == WLAN_DISABLED) {
47055 + return -EIO;
47056 + }
47057 +
47058 + if (ar->arWmiReady == FALSE) {
47059 + return -EIO;
47060 + }
47061 +
47062 + /*
47063 + * iwconfig passes a string with length excluding any trailing NUL.
47064 + * FIXME: we should be able to set an ESSID of 32 bytes, yet things fall
47065 + * over badly if we do. So we limit the ESSID to 31 bytes.
47066 + */
47067 + if (data->flags && (!data->length || data->length >= sizeof(ar->arSsid))) {
47068 + /*
47069 + * ssid is invalid
47070 + */
47071 + return -EINVAL;
47072 + }
47073 + /* Added for bug 25178, return an IOCTL error instead of target returning
47074 + Illegal parameter error when either the BSSID or channel is missing
47075 + and we cannot scan during connect.
47076 + */
47077 + if (data->flags) {
47078 + if (ar->arSkipScan == TRUE &&
47079 + (ar->arChannelHint == 0 ||
47080 + (!ar->arReqBssid[0] && !ar->arReqBssid[1] && !ar->arReqBssid[2] &&
47081 + !ar->arReqBssid[3] && !ar->arReqBssid[4] && !ar->arReqBssid[5])))
47082 + {
47083 + return -EINVAL;
47084 + }
47085 + }
47086 +
47087 + if (down_interruptible(&ar->arSem)) {
47088 + return -ERESTARTSYS;
47089 + }
47090 +
47091 + if (ar->arTxPending[WMI_CONTROL_PRI]) {
47092 + /*
47093 + * sleep until the command queue drains
47094 + */
47095 + wait_event_interruptible_timeout(arEvent,
47096 + ar->arTxPending[WMI_CONTROL_PRI] == 0, wmitimeout * HZ);
47097 + if (signal_pending(current)) {
47098 + return -EINTR;
47099 + }
47100 + }
47101 +
47102 + if (!data->flags) {
47103 + arNetworkType = ar->arNetworkType;
47104 + ar6000_init_profile_info(ar);
47105 + ar->arNetworkType = arNetworkType;
47106 + }
47107 +
47108 + if ((ar->arSsidLen) || (!data->flags))
47109 + {
47110 + if ((!data->flags) ||
47111 + (A_MEMCMP(ar->arSsid, ssid, ar->arSsidLen) != 0) ||
47112 + (ar->arSsidLen != (data->length)))
47113 + {
47114 + /*
47115 + * SSID set previously or essid off has been issued.
47116 + *
47117 + * Disconnect Command is issued in two cases after wmi is ready
47118 + * (1) ssid is different from the previous setting
47119 + * (2) essid off has been issued
47120 + *
47121 + */
47122 + if (ar->arWmiReady == TRUE) {
47123 + reconnect_flag = 0;
47124 + status = wmi_disconnect_cmd(ar->arWmi);
47125 + A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
47126 + ar->arSsidLen = 0;
47127 + if (ar->arSkipScan == FALSE) {
47128 + A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
47129 + }
47130 + if (!data->flags) {
47131 + up(&ar->arSem);
47132 + return 0;
47133 + }
47134 + } else {
47135 + up(&ar->arSem);
47136 + }
47137 + }
47138 + else
47139 + {
47140 + /*
47141 + * SSID is same, so we assume profile hasn't changed.
47142 + * If the interface is up and wmi is ready, we issue
47143 + * a reconnect cmd. Issue a reconnect only we are already
47144 + * connected.
47145 + */
47146 + if((ar->arConnected == TRUE) && (ar->arWmiReady == TRUE))
47147 + {
47148 + reconnect_flag = TRUE;
47149 + status = wmi_reconnect_cmd(ar->arWmi,ar->arReqBssid,
47150 + ar->arChannelHint);
47151 + up(&ar->arSem);
47152 + if (status != A_OK) {
47153 + return -EIO;
47154 + }
47155 + return 0;
47156 + }
47157 + else{
47158 + /*
47159 + * Dont return if connect is pending.
47160 + */
47161 + if(!(ar->arConnectPending)) {
47162 + up(&ar->arSem);
47163 + return 0;
47164 + }
47165 + }
47166 + }
47167 + }
47168 +
47169 + ar->arSsidLen = data->length;
47170 + A_MEMCPY(ar->arSsid, ssid, ar->arSsidLen);
47171 +
47172 + /* The ssid length check prevents second "essid off" from the user,
47173 + to be treated as a connect cmd. The second "essid off" is ignored.
47174 + */
47175 + if((ar->arWmiReady == TRUE) && (ar->arSsidLen > 0) )
47176 + {
47177 + AR6000_SPIN_LOCK(&ar->arLock, 0);
47178 + if (SHARED_AUTH == ar->arDot11AuthMode) {
47179 + ar6000_install_static_wep_keys(ar);
47180 + }
47181 + AR_DEBUG_PRINTF("Connect called with authmode %d dot11 auth %d"\
47182 + " PW crypto %d PW crypto Len %d GRP crypto %d"\
47183 + " GRP crypto Len %d\n",
47184 + ar->arAuthMode, ar->arDot11AuthMode,
47185 + ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
47186 + ar->arGroupCrypto, ar->arGroupCryptoLen);
47187 + reconnect_flag = 0;
47188 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
47189 + status = wmi_connect_cmd(ar->arWmi, ar->arNetworkType,
47190 + ar->arDot11AuthMode, ar->arAuthMode,
47191 + ar->arPairwiseCrypto, ar->arPairwiseCryptoLen,
47192 + ar->arGroupCrypto,ar->arGroupCryptoLen,
47193 + ar->arSsidLen, ar->arSsid,
47194 + ar->arReqBssid, ar->arChannelHint,
47195 + ar->arConnectCtrlFlags);
47196 +
47197 +
47198 + up(&ar->arSem);
47199 +
47200 + if (status != A_OK) {
47201 + return -EIO;
47202 + }
47203 + ar->arConnectPending = TRUE;
47204 + }else{
47205 + up(&ar->arSem);
47206 + }
47207 + return 0;
47208 +}
47209 +
47210 +/* SIOCGIWESSID */
47211 +static int
47212 +ar6000_ioctl_giwessid(struct net_device *dev,
47213 + struct iw_request_info *info,
47214 + struct iw_point *data, char *essid)
47215 +{
47216 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47217 +
47218 + if (ar->arWlanState == WLAN_DISABLED) {
47219 + return -EIO;
47220 + }
47221 +
47222 + data->flags = 1;
47223 + data->length = ar->arSsidLen;
47224 + A_MEMCPY(essid, ar->arSsid, ar->arSsidLen);
47225 +
47226 + return 0;
47227 +}
47228 +
47229 +
47230 +void ar6000_install_static_wep_keys(AR_SOFTC_T *ar)
47231 +{
47232 + A_UINT8 index;
47233 + A_UINT8 keyUsage;
47234 +
47235 + for (index = WMI_MIN_KEY_INDEX; index <= WMI_MAX_KEY_INDEX; index++) {
47236 + if (ar->arWepKeyList[index].arKeyLen) {
47237 + keyUsage = GROUP_USAGE;
47238 + if (index == ar->arDefTxKeyIndex) {
47239 + keyUsage |= TX_USAGE;
47240 + }
47241 + wmi_addKey_cmd(ar->arWmi,
47242 + index,
47243 + WEP_CRYPT,
47244 + keyUsage,
47245 + ar->arWepKeyList[index].arKeyLen,
47246 + NULL,
47247 + ar->arWepKeyList[index].arKey, KEY_OP_INIT_VAL,
47248 + NO_SYNC_WMIFLAG);
47249 + }
47250 + }
47251 +}
47252 +
47253 +int
47254 +ar6000_ioctl_delkey(struct net_device *dev, struct iw_request_info *info,
47255 + void *w, char *extra)
47256 +{
47257 + return 0;
47258 +}
47259 +
47260 +int
47261 +ar6000_ioctl_setmlme(struct net_device *dev, struct iw_request_info *info,
47262 + void *w, char *extra)
47263 +{
47264 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47265 + struct ieee80211req_mlme *mlme = (struct ieee80211req_mlme *)extra;
47266 +
47267 + if ((ar->arWmiReady == FALSE) || (ar->arConnected != TRUE))
47268 + return -EIO;
47269 +
47270 + switch (mlme->im_op) {
47271 + case IEEE80211_MLME_DISASSOC:
47272 + case IEEE80211_MLME_DEAUTH:
47273 + /* Not Supported */
47274 + break;
47275 + default:
47276 + break;
47277 + }
47278 + return 0;
47279 +}
47280 +
47281 +
47282 +int
47283 +ar6000_ioctl_setwmmparams(struct net_device *dev, struct iw_request_info *info,
47284 + void *w, char *extra)
47285 +{
47286 + return -EIO; /* for now */
47287 +}
47288 +
47289 +int
47290 +ar6000_ioctl_getwmmparams(struct net_device *dev, struct iw_request_info *info,
47291 + void *w, char *extra)
47292 +{
47293 + return -EIO; /* for now */
47294 +}
47295 +
47296 +int ar6000_ioctl_setoptie(struct net_device *dev, struct iw_request_info *info,
47297 + struct iw_point *data, char *extra)
47298 +{
47299 + /* The target generates the WPA/RSN IE */
47300 + return 0;
47301 +}
47302 +
47303 +int
47304 +ar6000_ioctl_setauthalg(struct net_device *dev, struct iw_request_info *info,
47305 + void *w, char *extra)
47306 +{
47307 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47308 + struct ieee80211req_authalg *req = (struct ieee80211req_authalg *)extra;
47309 + int ret = 0;
47310 +
47311 +
47312 + AR6000_SPIN_LOCK(&ar->arLock, 0);
47313 +
47314 + if (req->auth_alg == AUTH_ALG_OPEN_SYSTEM) {
47315 + ar->arDot11AuthMode = OPEN_AUTH;
47316 + } else if (req->auth_alg == AUTH_ALG_LEAP) {
47317 + ar->arDot11AuthMode = LEAP_AUTH;
47318 + ar->arPairwiseCrypto = WEP_CRYPT;
47319 + ar->arGroupCrypto = WEP_CRYPT;
47320 + } else {
47321 + ret = -EIO;
47322 + }
47323 +
47324 + AR6000_SPIN_UNLOCK(&ar->arLock, 0);
47325 +
47326 + return ret;
47327 +}
47328 +static int
47329 +ar6000_ioctl_addpmkid(struct net_device *dev, struct iw_request_info *info,
47330 + void *w, char *extra)
47331 +{
47332 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47333 + struct ieee80211req_addpmkid *req = (struct ieee80211req_addpmkid *)extra;
47334 + A_STATUS status;
47335 +
47336 + if (ar->arWlanState == WLAN_DISABLED) {
47337 + return -EIO;
47338 + }
47339 +
47340 + AR_DEBUG_PRINTF("Add pmkid for %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x en=%d\n",
47341 + req->pi_bssid[0], req->pi_bssid[1], req->pi_bssid[2],
47342 + req->pi_bssid[3], req->pi_bssid[4], req->pi_bssid[5],
47343 + req->pi_enable);
47344 +
47345 + status = wmi_setPmkid_cmd(ar->arWmi, req->pi_bssid, req->pi_pmkid,
47346 + req->pi_enable);
47347 +
47348 + if (status != A_OK) {
47349 + return -EIO;
47350 + }
47351 +
47352 + return 0;
47353 +}
47354 +
47355 +/*
47356 + * SIOCSIWRATE
47357 + */
47358 +int
47359 +ar6000_ioctl_siwrate(struct net_device *dev,
47360 + struct iw_request_info *info,
47361 + struct iw_param *rrq, char *extra)
47362 +{
47363 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47364 + A_UINT32 kbps;
47365 +
47366 + if (rrq->fixed) {
47367 + kbps = rrq->value / 1000; /* rrq->value is in bps */
47368 + } else {
47369 + kbps = -1; /* -1 indicates auto rate */
47370 + }
47371 + if(kbps != -1 && wmi_validate_bitrate(ar->arWmi, kbps) == A_EINVAL)
47372 + {
47373 + AR_DEBUG_PRINTF("BitRate is not Valid %d\n", kbps);
47374 + return -EINVAL;
47375 + }
47376 + ar->arBitRate = kbps;
47377 + if(ar->arWmiReady == TRUE)
47378 + {
47379 + if (wmi_set_bitrate_cmd(ar->arWmi, kbps) != A_OK) {
47380 + return -EINVAL;
47381 + }
47382 + }
47383 + return 0;
47384 +}
47385 +
47386 +/*
47387 + * SIOCGIWRATE
47388 + */
47389 +int
47390 +ar6000_ioctl_giwrate(struct net_device *dev,
47391 + struct iw_request_info *info,
47392 + struct iw_param *rrq, char *extra)
47393 +{
47394 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47395 + int ret = 0;
47396 +
47397 + if (down_interruptible(&ar->arSem)) {
47398 + return -ERESTARTSYS;
47399 + }
47400 + if(ar->arWmiReady == TRUE)
47401 + {
47402 + ar->arBitRate = 0xFFFF;
47403 + if (wmi_get_bitrate_cmd(ar->arWmi) != A_OK) {
47404 + up(&ar->arSem);
47405 + return -EIO;
47406 + }
47407 + wait_event_interruptible_timeout(arEvent, ar->arBitRate != 0xFFFF, wmitimeout * HZ);
47408 + if (signal_pending(current)) {
47409 + ret = -EINTR;
47410 + }
47411 + }
47412 + /* If the interface is down or wmi is not ready or the target is not
47413 + connected - return the value stored in the device structure */
47414 + if (!ret) {
47415 + if (ar->arBitRate == -1) {
47416 + rrq->fixed = TRUE;
47417 + rrq->value = 0;
47418 + } else {
47419 + rrq->value = ar->arBitRate * 1000;
47420 + }
47421 + }
47422 +
47423 + up(&ar->arSem);
47424 +
47425 + return ret;
47426 +}
47427 +
47428 +/*
47429 + * SIOCSIWTXPOW
47430 + */
47431 +static int
47432 +ar6000_ioctl_siwtxpow(struct net_device *dev,
47433 + struct iw_request_info *info,
47434 + struct iw_param *rrq, char *extra)
47435 +{
47436 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47437 + A_UINT8 dbM;
47438 +
47439 + if (ar->arWlanState == WLAN_DISABLED) {
47440 + return -EIO;
47441 + }
47442 +
47443 + if (ar->arRadioSwitch == WLAN_ENABLED
47444 + && rrq->disabled) {
47445 + if (wmi_switch_radio(ar->arWmi, WLAN_DISABLED) < 0)
47446 + return -EIO;
47447 + ar->arRadioSwitch = WLAN_DISABLED;
47448 + } else if (ar->arRadioSwitch == WLAN_DISABLED
47449 + && !rrq->disabled) {
47450 + if (wmi_switch_radio(ar->arWmi, WLAN_ENABLED) < 0)
47451 + return -EIO;
47452 + ar->arRadioSwitch = WLAN_ENABLED;
47453 + }
47454 +
47455 + if (rrq->fixed) {
47456 + if (rrq->flags != IW_TXPOW_DBM) {
47457 + return -EOPNOTSUPP;
47458 + }
47459 + ar->arTxPwr= dbM = rrq->value;
47460 + ar->arTxPwrSet = TRUE;
47461 + } else {
47462 + ar->arTxPwr = dbM = 0;
47463 + ar->arTxPwrSet = FALSE;
47464 + }
47465 + if(ar->arWmiReady == TRUE)
47466 + {
47467 + AR_DEBUG_PRINTF("Set tx pwr cmd %d dbM\n", dbM);
47468 + wmi_set_txPwr_cmd(ar->arWmi, dbM);
47469 + }
47470 + return 0;
47471 +}
47472 +
47473 +/*
47474 + * SIOCGIWTXPOW
47475 + */
47476 +int
47477 +ar6000_ioctl_giwtxpow(struct net_device *dev,
47478 + struct iw_request_info *info,
47479 + struct iw_param *rrq, char *extra)
47480 +{
47481 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47482 + int ret = 0;
47483 +
47484 + if (ar->arWlanState == WLAN_DISABLED) {
47485 + return -EIO;
47486 + }
47487 +
47488 + if (ar->arRadioSwitch == WLAN_DISABLED) {
47489 + rrq->disabled = 1;
47490 + return 0;
47491 + }
47492 +
47493 + if (down_interruptible(&ar->arSem)) {
47494 + return -ERESTARTSYS;
47495 + }
47496 + if((ar->arWmiReady == TRUE) && (ar->arConnected == TRUE))
47497 + {
47498 + ar->arTxPwr = 0;
47499 +
47500 + if (wmi_get_txPwr_cmd(ar->arWmi) != A_OK) {
47501 + up(&ar->arSem);
47502 + return -EIO;
47503 + }
47504 +
47505 + wait_event_interruptible_timeout(arEvent, ar->arTxPwr != 0, wmitimeout * HZ);
47506 +
47507 + if (signal_pending(current)) {
47508 + ret = -EINTR;
47509 + }
47510 + }
47511 + /* If the interace is down or wmi is not ready or target is not connected
47512 + then return value stored in the device structure */
47513 +
47514 + if (!ret) {
47515 + if (ar->arTxPwrSet == TRUE) {
47516 + rrq->fixed = TRUE;
47517 + }
47518 + rrq->value = ar->arTxPwr;
47519 + rrq->flags = IW_TXPOW_DBM;
47520 + }
47521 +
47522 + up(&ar->arSem);
47523 +
47524 + return ret;
47525 +}
47526 +
47527 +/*
47528 + * SIOCSIWRETRY
47529 + * since iwconfig only provides us with one max retry value, we use it
47530 + * to apply to data frames of the BE traffic class.
47531 + */
47532 +static int
47533 +ar6000_ioctl_siwretry(struct net_device *dev,
47534 + struct iw_request_info *info,
47535 + struct iw_param *rrq, char *extra)
47536 +{
47537 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47538 +
47539 + if (ar->arWlanState == WLAN_DISABLED) {
47540 + return -EIO;
47541 + }
47542 +
47543 + if (rrq->disabled) {
47544 + return -EOPNOTSUPP;
47545 + }
47546 +
47547 + if ((rrq->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT) {
47548 + return -EOPNOTSUPP;
47549 + }
47550 +
47551 + if ( !(rrq->value >= WMI_MIN_RETRIES) || !(rrq->value <= WMI_MAX_RETRIES)) {
47552 + return - EINVAL;
47553 + }
47554 + if(ar->arWmiReady == TRUE)
47555 + {
47556 + if (wmi_set_retry_limits_cmd(ar->arWmi, DATA_FRAMETYPE, WMM_AC_BE,
47557 + rrq->value, 0) != A_OK){
47558 + return -EINVAL;
47559 + }
47560 + }
47561 + ar->arMaxRetries = rrq->value;
47562 + return 0;
47563 +}
47564 +
47565 +/*
47566 + * SIOCGIWRETRY
47567 + */
47568 +static int
47569 +ar6000_ioctl_giwretry(struct net_device *dev,
47570 + struct iw_request_info *info,
47571 + struct iw_param *rrq, char *extra)
47572 +{
47573 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47574 +
47575 + if (ar->arWlanState == WLAN_DISABLED) {
47576 + return -EIO;
47577 + }
47578 +
47579 + rrq->disabled = 0;
47580 + switch (rrq->flags & IW_RETRY_TYPE) {
47581 + case IW_RETRY_LIFETIME:
47582 + return -EOPNOTSUPP;
47583 + break;
47584 + case IW_RETRY_LIMIT:
47585 + rrq->flags = IW_RETRY_LIMIT;
47586 + switch (rrq->flags & IW_RETRY_MODIFIER) {
47587 + case IW_RETRY_MIN:
47588 + rrq->flags |= IW_RETRY_MIN;
47589 + rrq->value = WMI_MIN_RETRIES;
47590 + break;
47591 + case IW_RETRY_MAX:
47592 + rrq->flags |= IW_RETRY_MAX;
47593 + rrq->value = ar->arMaxRetries;
47594 + break;
47595 + }
47596 + break;
47597 + }
47598 + return 0;
47599 +}
47600 +
47601 +/*
47602 + * SIOCSIWENCODE
47603 + */
47604 +static int
47605 +ar6000_ioctl_siwencode(struct net_device *dev,
47606 + struct iw_request_info *info,
47607 + struct iw_point *erq, char *keybuf)
47608 +{
47609 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
47610 + int index;
47611 + A_INT32 auth = ar->arDot11AuthMode;
47612 +
47613 + if (ar->arWlanState == WLAN_DISABLED) {
47614 + return -EIO;
47615 + }
47616 +
47617 + index = erq->flags & IW_ENCODE_INDEX;
47618 +
47619 + if (index && (((index - 1) < WMI_MIN_KEY_INDEX) ||
47620 + ((index - 1) > WMI_MAX_KEY_INDEX)))
47621 + {
47622 + return -EIO;
47623 + }
47624 +
47625 + if (erq->flags & IW_ENCODE_DISABLED) {
47626 + /*
47627 + * Encryption disabled
47628 + */
47629 + if (index) {
47630 + /*
47631 + * If key index was specified then clear the specified key
47632 + */
47633 + index--;
47634 + A_MEMZERO(ar->arWepKeyList[index].arKey,
47635 + sizeof(ar->arWepKeyList[index].arKey));
47636 + ar->arWepKeyList[index].arKeyLen = 0;
47637 + }
47638 + ar->arDot11AuthMode = OPEN_AUTH;
47639 + ar->arPairwiseCrypto = NONE_CRYPT;
47640 + ar->arGroupCrypto = NONE_CRYPT;
47641 + ar->arAuthMode = NONE_AUTH;
47642 + } else {
47643 + /*
47644 + * Enabling WEP encryption
47645 + */
47646 + if (index) {
47647 + index--; /* keyindex is off base 1 in iwconfig */
47648 + }
47649 +
47650 + if (erq->flags & IW_ENCODE_OPEN) {
47651 + auth = OPEN_AUTH;
47652 + } else if (erq->flags & IW_ENCODE_RESTRICTED) {
47653 + auth = SHARED_AUTH;
47654 + }
47655 +
47656 + if (erq->length) {
47657 + if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(erq->length)) {
47658 + return -EIO;
47659 + }
47660 +
47661 + A_MEMZERO(ar->arWepKeyList[index].arKey,
47662 + sizeof(ar->arWepKeyList[index].arKey));
47663 + A_MEMCPY(ar->arWepKeyList[index].arKey, keybuf, erq->length);
47664 + ar->arWepKeyList[index].arKeyLen = erq->length;
47665 + } else {
47666 + if (ar->arWepKeyList[index].arKeyLen == 0) {
47667 + return -EIO;
47668 + }
47669 + ar->arDefTxKeyIndex = index;
47670 + }
47671 +
47672 + ar->arPairwiseCrypto = WEP_CRYPT;
47673 + ar->arGroupCrypto = WEP_CRYPT;
47674 + ar->arDot11AuthMode = auth;
47675 + ar->arAuthMode = NONE_AUTH;
47676 + }
47677 +
47678 + /*
47679 + * profile has changed. Erase ssid to signal change
47680 + */
47681 + A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
47682 + ar->arSsidLen = 0;
47683 +
47684 + return 0;
47685 +}
47686 +
47687 +static int
47688 +ar6000_ioctl_giwencode(struct net_device *dev,
47689 + struct iw_request_info *info,
47690 + struct iw_point *erq, char *key)
47691 +{
47692 + AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
47693 + A_UINT8 keyIndex;
47694 + struct ar_wep_key *wk;
47695 +
47696 + if (ar->arWlanState == WLAN_DISABLED) {
47697 + return -EIO;
47698 + }
47699 +
47700 + if (ar->arPairwiseCrypto == NONE_CRYPT) {
47701 + erq->length = 0;
47702 + erq->flags = IW_ENCODE_DISABLED;
47703 + } else {
47704 + /* get the keyIndex */
47705 + keyIndex = erq->flags & IW_ENCODE_INDEX;
47706 + if (0 == keyIndex) {
47707 + keyIndex = ar->arDefTxKeyIndex;
47708 + } else if ((keyIndex - 1 < WMI_MIN_KEY_INDEX) ||
47709 + (keyIndex - 1 > WMI_MAX_KEY_INDEX))
47710 + {
47711 + keyIndex = WMI_MIN_KEY_INDEX;
47712 + } else {
47713 + keyIndex--;
47714 + }
47715 + erq->flags = keyIndex + 1;
47716 + erq->flags |= IW_ENCODE_ENABLED;
47717 + wk = &ar->arWepKeyList[keyIndex];
47718 + if (erq->length > wk->arKeyLen) {
47719 + erq->length = wk->arKeyLen;
47720 + }
47721 + if (wk->arKeyLen) {
47722 + A_MEMCPY(key, wk->arKey, erq->length);
47723 + }
47724 + if (ar->arDot11AuthMode == OPEN_AUTH) {
47725 + erq->flags |= IW_ENCODE_OPEN;
47726 + } else if (ar->arDot11AuthMode == SHARED_AUTH) {
47727 + erq->flags |= IW_ENCODE_RESTRICTED;
47728 + }
47729 + }
47730 +
47731 + return 0;
47732 +}
47733 +
47734 +static int ar6000_ioctl_siwpower(struct net_device *dev,
47735 + struct iw_request_info *info,
47736 + union iwreq_data *wrqu, char *extra)
47737 +{
47738 + AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
47739 + WMI_POWER_MODE power_mode;
47740 +
47741 + if (wrqu->power.disabled)
47742 + power_mode = MAX_PERF_POWER;
47743 + else
47744 + power_mode = REC_POWER;
47745 +
47746 + if (wmi_powermode_cmd(ar->arWmi, power_mode) < 0)
47747 + return -EIO;
47748 +
47749 + return 0;
47750 +}
47751 +
47752 +static int ar6000_ioctl_giwpower(struct net_device *dev,
47753 + struct iw_request_info *info,
47754 + union iwreq_data *wrqu, char *extra)
47755 +{
47756 + AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
47757 +
47758 + return wmi_get_power_mode_cmd(ar->arWmi);
47759 +}
47760 +
47761 +static int ar6000_ioctl_siwgenie(struct net_device *dev,
47762 + struct iw_request_info *info,
47763 + struct iw_point *dwrq,
47764 + char *extra)
47765 +{
47766 + /* The target does that for us */
47767 + return 0;
47768 +}
47769 +
47770 +static int ar6000_ioctl_giwgenie(struct net_device *dev,
47771 + struct iw_request_info *info,
47772 + struct iw_point *dwrq,
47773 + char *extra)
47774 +{
47775 + return 0;
47776 +}
47777 +
47778 +static int ar6000_ioctl_siwauth(struct net_device *dev,
47779 + struct iw_request_info *info,
47780 + struct iw_param *param,
47781 + char *extra)
47782 +{
47783 + AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
47784 + int reset = 0;
47785 +
47786 + switch (param->flags & IW_AUTH_INDEX) {
47787 + case IW_AUTH_WPA_VERSION:
47788 + if (param->value & IW_AUTH_WPA_VERSION_DISABLED) {
47789 + ar->arAuthMode = NONE_AUTH;
47790 + }
47791 + if (param->value & IW_AUTH_WPA_VERSION_WPA) {
47792 + ar->arAuthMode = WPA_AUTH;
47793 + }
47794 + if (param->value & IW_AUTH_WPA_VERSION_WPA2) {
47795 + ar->arAuthMode = WPA2_AUTH;
47796 + }
47797 +
47798 + reset = 1;
47799 + break;
47800 + case IW_AUTH_CIPHER_PAIRWISE:
47801 + if (param->value & IW_AUTH_CIPHER_NONE) {
47802 + ar->arPairwiseCrypto = NONE_CRYPT;
47803 + }
47804 + if (param->value & IW_AUTH_CIPHER_WEP40) {
47805 + ar->arPairwiseCrypto = WEP_CRYPT;
47806 + }
47807 + if (param->value & IW_AUTH_CIPHER_TKIP) {
47808 + ar->arPairwiseCrypto = TKIP_CRYPT;
47809 + }
47810 + if (param->value & IW_AUTH_CIPHER_CCMP) {
47811 + ar->arPairwiseCrypto = AES_CRYPT;
47812 + }
47813 +
47814 + reset = 1;
47815 + break;
47816 + case IW_AUTH_CIPHER_GROUP:
47817 + if (param->value & IW_AUTH_CIPHER_NONE) {
47818 + ar->arGroupCrypto = NONE_CRYPT;
47819 + }
47820 + if (param->value & IW_AUTH_CIPHER_WEP40) {
47821 + ar->arGroupCrypto = WEP_CRYPT;
47822 + }
47823 + if (param->value & IW_AUTH_CIPHER_TKIP) {
47824 + ar->arGroupCrypto = TKIP_CRYPT;
47825 + }
47826 + if (param->value & IW_AUTH_CIPHER_CCMP) {
47827 + ar->arGroupCrypto = AES_CRYPT;
47828 + }
47829 +
47830 + reset = 1;
47831 + break;
47832 + case IW_AUTH_KEY_MGMT:
47833 + if (param->value & IW_AUTH_KEY_MGMT_PSK) {
47834 + if (ar->arAuthMode == WPA_AUTH) {
47835 + ar->arAuthMode = WPA_PSK_AUTH;
47836 + } else if (ar->arAuthMode == WPA2_AUTH) {
47837 + ar->arAuthMode = WPA2_PSK_AUTH;
47838 + }
47839 +
47840 + reset = 1;
47841 + }
47842 + break;
47843 +
47844 + case IW_AUTH_TKIP_COUNTERMEASURES:
47845 + if (ar->arWmiReady == FALSE) {
47846 + return -EIO;
47847 + }
47848 + wmi_set_tkip_countermeasures_cmd(ar->arWmi, param->value);
47849 + break;
47850 +
47851 + case IW_AUTH_DROP_UNENCRYPTED:
47852 + break;
47853 +
47854 + case IW_AUTH_80211_AUTH_ALG:
47855 + if (param->value & IW_AUTH_ALG_OPEN_SYSTEM) {
47856 + ar->arDot11AuthMode = OPEN_AUTH;
47857 + }
47858 + if (param->value & IW_AUTH_ALG_SHARED_KEY) {
47859 + ar->arDot11AuthMode = SHARED_AUTH;
47860 + }
47861 + if (param->value & IW_AUTH_ALG_LEAP) {
47862 + ar->arDot11AuthMode = LEAP_AUTH;
47863 + ar->arPairwiseCrypto = WEP_CRYPT;
47864 + ar->arGroupCrypto = WEP_CRYPT;
47865 + }
47866 +
47867 + reset = 1;
47868 + break;
47869 +
47870 + case IW_AUTH_WPA_ENABLED:
47871 + reset = 1;
47872 + break;
47873 +
47874 + case IW_AUTH_RX_UNENCRYPTED_EAPOL:
47875 + break;
47876 +
47877 + case IW_AUTH_PRIVACY_INVOKED:
47878 + break;
47879 +
47880 + default:
47881 + printk("%s(): Unknown flag 0x%x\n", __FUNCTION__, param->flags);
47882 + return -EOPNOTSUPP;
47883 + }
47884 +
47885 + if (reset) {
47886 + A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
47887 + ar->arSsidLen = 0;
47888 + }
47889 +
47890 + return 0;
47891 +}
47892 +
47893 +static int ar6000_ioctl_giwauth(struct net_device *dev,
47894 + struct iw_request_info *info,
47895 + struct iw_param *dwrq,
47896 + char *extra)
47897 +{
47898 + return 0;
47899 +}
47900 +
47901 +static int ar6000_ioctl_siwencodeext(struct net_device *dev,
47902 + struct iw_request_info *info,
47903 + union iwreq_data *wrqu,
47904 + char *extra)
47905 +{
47906 + AR_SOFTC_T *ar = (AR_SOFTC_T *)netdev_priv(dev);
47907 + struct iw_point *encoding = &wrqu->encoding;
47908 + struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
47909 + int alg = ext->alg, idx;
47910 +
47911 + if (ar->arWlanState == WLAN_DISABLED) {
47912 + return -EIO;
47913 + }
47914 +
47915 + /* Determine and validate the key index */
47916 + idx = (encoding->flags & IW_ENCODE_INDEX) - 1;
47917 + if (idx) {
47918 + if (idx < 0 || idx > 3)
47919 + return -EINVAL;
47920 + }
47921 +
47922 + if ((alg == IW_ENCODE_ALG_TKIP) || (alg == IW_ENCODE_ALG_CCMP)) {
47923 + struct ieee80211req_key ik;
47924 + KEY_USAGE key_usage;
47925 + CRYPTO_TYPE key_type = NONE_CRYPT;
47926 + int status;
47927 +
47928 + ar->user_saved_keys.keyOk = FALSE;
47929 +
47930 + if (alg == IW_ENCODE_ALG_TKIP) {
47931 + key_type = TKIP_CRYPT;
47932 + ik.ik_type = IEEE80211_CIPHER_TKIP;
47933 + } else {
47934 + key_type = AES_CRYPT;
47935 + ik.ik_type = IEEE80211_CIPHER_AES_CCM;
47936 + }
47937 +
47938 + ik.ik_keyix = idx;
47939 + ik.ik_keylen = ext->key_len;
47940 + ik.ik_flags = IEEE80211_KEY_RECV;
47941 + if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
47942 + ik.ik_flags |= IEEE80211_KEY_XMIT
47943 + | IEEE80211_KEY_DEFAULT;
47944 + }
47945 +
47946 + if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) {
47947 + memcpy(&ik.ik_keyrsc, ext->rx_seq, 8);
47948 + }
47949 +
47950 + memcpy(ik.ik_keydata, ext->key, ext->key_len);
47951 +
47952 + ar->user_saved_keys.keyType = key_type;
47953 + if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
47954 + key_usage = GROUP_USAGE;
47955 + memset(ik.ik_macaddr, 0, ETH_ALEN);
47956 + memcpy(&ar->user_saved_keys.bcast_ik, &ik,
47957 + sizeof(struct ieee80211req_key));
47958 + } else {
47959 + key_usage = PAIRWISE_USAGE;
47960 + memcpy(ik.ik_macaddr, ext->addr.sa_data, ETH_ALEN);
47961 + memcpy(&ar->user_saved_keys.ucast_ik, &ik,
47962 + sizeof(struct ieee80211req_key));
47963 + }
47964 +
47965 + status = wmi_addKey_cmd(ar->arWmi, ik.ik_keyix, key_type,
47966 + key_usage, ik.ik_keylen,
47967 + (A_UINT8 *)&ik.ik_keyrsc,
47968 + ik.ik_keydata,
47969 + KEY_OP_INIT_VAL, SYNC_BEFORE_WMIFLAG);
47970 +
47971 + if (status < 0)
47972 + return -EIO;
47973 +
47974 + ar->user_saved_keys.keyOk = TRUE;
47975 +
47976 + return 0;
47977 +
47978 + } else {
47979 + /* WEP falls back to SIWENCODE */
47980 + return -EOPNOTSUPP;
47981 + }
47982 +
47983 + return 0;
47984 +}
47985 +
47986 +
47987 +static int ar6000_ioctl_giwencodeext(struct net_device *dev,
47988 + struct iw_request_info *info,
47989 + struct iw_point *dwrq,
47990 + char *extra)
47991 +{
47992 + return 0;
47993 +}
47994 +
47995 +
47996 +static int
47997 +ar6000_ioctl_setparam(struct net_device *dev,
47998 + struct iw_request_info *info,
47999 + void *erq, char *extra)
48000 +{
48001 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48002 + int *i = (int *)extra;
48003 + int param = i[0];
48004 + int value = i[1];
48005 + int ret = 0;
48006 + A_BOOL profChanged = FALSE;
48007 +
48008 + if (ar->arWlanState == WLAN_DISABLED) {
48009 + return -EIO;
48010 + }
48011 +
48012 + switch (param) {
48013 + case IEEE80211_PARAM_WPA:
48014 + switch (value) {
48015 + case WPA_MODE_WPA1:
48016 + ar->arAuthMode = WPA_AUTH;
48017 + profChanged = TRUE;
48018 + break;
48019 + case WPA_MODE_WPA2:
48020 + ar->arAuthMode = WPA2_AUTH;
48021 + profChanged = TRUE;
48022 + break;
48023 + case WPA_MODE_NONE:
48024 + ar->arAuthMode = NONE_AUTH;
48025 + profChanged = TRUE;
48026 + break;
48027 + default:
48028 + printk("IEEE80211_PARAM_WPA: Unknown value %d\n", value);
48029 + }
48030 + break;
48031 + case IEEE80211_PARAM_AUTHMODE:
48032 + switch(value) {
48033 + case IEEE80211_AUTH_WPA_PSK:
48034 + if (WPA_AUTH == ar->arAuthMode) {
48035 + ar->arAuthMode = WPA_PSK_AUTH;
48036 + profChanged = TRUE;
48037 + } else if (WPA2_AUTH == ar->arAuthMode) {
48038 + ar->arAuthMode = WPA2_PSK_AUTH;
48039 + profChanged = TRUE;
48040 + } else {
48041 + AR_DEBUG_PRINTF("Error - Setting PSK mode when WPA "\
48042 + "param was set to %d\n",
48043 + ar->arAuthMode);
48044 + ret = -1;
48045 + }
48046 + break;
48047 + case IEEE80211_AUTH_WPA_CCKM:
48048 + if (WPA2_AUTH == ar->arAuthMode) {
48049 + ar->arAuthMode = WPA2_AUTH_CCKM;
48050 + } else {
48051 + ar->arAuthMode = WPA_AUTH_CCKM;
48052 + }
48053 + break;
48054 + default:
48055 + break;
48056 + }
48057 + break;
48058 + case IEEE80211_PARAM_UCASTCIPHER:
48059 + switch (value) {
48060 + case IEEE80211_CIPHER_AES_CCM:
48061 + ar->arPairwiseCrypto = AES_CRYPT;
48062 + profChanged = TRUE;
48063 + break;
48064 + case IEEE80211_CIPHER_TKIP:
48065 + ar->arPairwiseCrypto = TKIP_CRYPT;
48066 + profChanged = TRUE;
48067 + break;
48068 + case IEEE80211_CIPHER_WEP:
48069 + ar->arPairwiseCrypto = WEP_CRYPT;
48070 + profChanged = TRUE;
48071 + break;
48072 + case IEEE80211_CIPHER_NONE:
48073 + ar->arPairwiseCrypto = NONE_CRYPT;
48074 + profChanged = TRUE;
48075 + break;
48076 + }
48077 + break;
48078 + case IEEE80211_PARAM_UCASTKEYLEN:
48079 + if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
48080 + ret = -EIO;
48081 + } else {
48082 + ar->arPairwiseCryptoLen = value;
48083 + }
48084 + break;
48085 + case IEEE80211_PARAM_MCASTCIPHER:
48086 + switch (value) {
48087 + case IEEE80211_CIPHER_AES_CCM:
48088 + ar->arGroupCrypto = AES_CRYPT;
48089 + profChanged = TRUE;
48090 + break;
48091 + case IEEE80211_CIPHER_TKIP:
48092 + ar->arGroupCrypto = TKIP_CRYPT;
48093 + profChanged = TRUE;
48094 + break;
48095 + case IEEE80211_CIPHER_WEP:
48096 + ar->arGroupCrypto = WEP_CRYPT;
48097 + profChanged = TRUE;
48098 + break;
48099 + case IEEE80211_CIPHER_NONE:
48100 + ar->arGroupCrypto = NONE_CRYPT;
48101 + profChanged = TRUE;
48102 + break;
48103 + }
48104 + break;
48105 + case IEEE80211_PARAM_MCASTKEYLEN:
48106 + if (!IEEE80211_IS_VALID_WEP_CIPHER_LEN(value)) {
48107 + ret = -EIO;
48108 + } else {
48109 + ar->arGroupCryptoLen = value;
48110 + }
48111 + break;
48112 + case IEEE80211_PARAM_COUNTERMEASURES:
48113 + if (ar->arWmiReady == FALSE) {
48114 + return -EIO;
48115 + }
48116 + wmi_set_tkip_countermeasures_cmd(ar->arWmi, value);
48117 + break;
48118 + default:
48119 + break;
48120 + }
48121 +
48122 + if (profChanged == TRUE) {
48123 + /*
48124 + * profile has changed. Erase ssid to signal change
48125 + */
48126 + A_MEMZERO(ar->arSsid, sizeof(ar->arSsid));
48127 + ar->arSsidLen = 0;
48128 + }
48129 +
48130 + return ret;
48131 +}
48132 +
48133 +int
48134 +ar6000_ioctl_getparam(struct net_device *dev, struct iw_request_info *info,
48135 + void *w, char *extra)
48136 +{
48137 + return -EIO; /* for now */
48138 +}
48139 +
48140 +int
48141 +ar6000_ioctl_setkey(struct net_device *dev, struct iw_request_info *info,
48142 + void *w, char *extra)
48143 +{
48144 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48145 + struct ieee80211req_key *ik = (struct ieee80211req_key *)extra;
48146 + KEY_USAGE keyUsage;
48147 + A_STATUS status;
48148 + CRYPTO_TYPE keyType = NONE_CRYPT;
48149 +
48150 + if (ar->arWlanState == WLAN_DISABLED) {
48151 + return -EIO;
48152 + }
48153 +
48154 + ar->user_saved_keys.keyOk = FALSE;
48155 +
48156 + if ( 0 == memcmp(ik->ik_macaddr, "\x00\x00\x00\x00\x00\x00",
48157 + IEEE80211_ADDR_LEN)) {
48158 + keyUsage = GROUP_USAGE;
48159 + A_MEMCPY(&ar->user_saved_keys.bcast_ik, ik,
48160 + sizeof(struct ieee80211req_key));
48161 + } else {
48162 + keyUsage = PAIRWISE_USAGE;
48163 + A_MEMCPY(&ar->user_saved_keys.ucast_ik, ik,
48164 + sizeof(struct ieee80211req_key));
48165 + }
48166 +
48167 + switch (ik->ik_type) {
48168 + case IEEE80211_CIPHER_WEP:
48169 + keyType = WEP_CRYPT;
48170 + break;
48171 + case IEEE80211_CIPHER_TKIP:
48172 + keyType = TKIP_CRYPT;
48173 + break;
48174 + case IEEE80211_CIPHER_AES_CCM:
48175 + keyType = AES_CRYPT;
48176 + break;
48177 + default:
48178 + break;
48179 + }
48180 + ar->user_saved_keys.keyType = keyType;
48181 +
48182 + if (IEEE80211_CIPHER_CCKM_KRK != ik->ik_type) {
48183 + if (NONE_CRYPT == keyType) {
48184 + return -EIO;
48185 + }
48186 +
48187 + status = wmi_addKey_cmd(ar->arWmi, ik->ik_keyix, keyType, keyUsage,
48188 + ik->ik_keylen, (A_UINT8 *)&ik->ik_keyrsc,
48189 + ik->ik_keydata, KEY_OP_INIT_VAL,
48190 + SYNC_BEFORE_WMIFLAG);
48191 +
48192 + if (status != A_OK) {
48193 + return -EIO;
48194 + }
48195 + } else {
48196 + status = wmi_add_krk_cmd(ar->arWmi, ik->ik_keydata);
48197 + }
48198 +
48199 + ar->user_saved_keys.keyOk = TRUE;
48200 +
48201 + return 0;
48202 +}
48203 +
48204 +
48205 +/*
48206 + * SIOCGIWNAME
48207 + */
48208 +int
48209 +ar6000_ioctl_giwname(struct net_device *dev,
48210 + struct iw_request_info *info,
48211 + char *name, char *extra)
48212 +{
48213 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48214 +
48215 + if (ar->arWlanState == WLAN_DISABLED) {
48216 + return -EIO;
48217 + }
48218 +
48219 + switch (ar->arPhyCapability) {
48220 + case (WMI_11A_CAPABILITY):
48221 + strncpy(name, "AR6000 802.11a", IFNAMSIZ);
48222 + break;
48223 + case (WMI_11G_CAPABILITY):
48224 + strncpy(name, "AR6000 802.11g", IFNAMSIZ);
48225 + break;
48226 + case (WMI_11AG_CAPABILITY):
48227 + strncpy(name, "AR6000 802.11ag", IFNAMSIZ);
48228 + break;
48229 + default:
48230 + strncpy(name, "AR6000 802.11", IFNAMSIZ);
48231 + break;
48232 + }
48233 +
48234 + return 0;
48235 +}
48236 +
48237 +/*
48238 + * SIOCSIWFREQ
48239 + */
48240 +int
48241 +ar6000_ioctl_siwfreq(struct net_device *dev,
48242 + struct iw_request_info *info,
48243 + struct iw_freq *freq, char *extra)
48244 +{
48245 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48246 +
48247 + if (ar->arWlanState == WLAN_DISABLED) {
48248 + return -EIO;
48249 + }
48250 +
48251 + /*
48252 + * We support limiting the channels via wmiconfig.
48253 + *
48254 + * We use this command to configure the channel hint for the connect cmd
48255 + * so it is possible the target will end up connecting to a different
48256 + * channel.
48257 + */
48258 + if (freq->e > 1) {
48259 + return -EINVAL;
48260 + } else if (freq->e == 1) {
48261 + ar->arChannelHint = freq->m / 100000;
48262 + } else {
48263 + ar->arChannelHint = wlan_ieee2freq(freq->m);
48264 + }
48265 +
48266 + A_PRINTF("channel hint set to %d\n", ar->arChannelHint);
48267 + return 0;
48268 +}
48269 +
48270 +/*
48271 + * SIOCGIWFREQ
48272 + */
48273 +int
48274 +ar6000_ioctl_giwfreq(struct net_device *dev,
48275 + struct iw_request_info *info,
48276 + struct iw_freq *freq, char *extra)
48277 +{
48278 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48279 +
48280 + if (ar->arWlanState == WLAN_DISABLED) {
48281 + return -EIO;
48282 + }
48283 +
48284 + if (ar->arConnected != TRUE) {
48285 + return -EINVAL;
48286 + }
48287 +
48288 + freq->m = ar->arBssChannel * 100000;
48289 + freq->e = 1;
48290 +
48291 + return 0;
48292 +}
48293 +
48294 +/*
48295 + * SIOCSIWMODE
48296 + */
48297 +int
48298 +ar6000_ioctl_siwmode(struct net_device *dev,
48299 + struct iw_request_info *info,
48300 + __u32 *mode, char *extra)
48301 +{
48302 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48303 +
48304 + if (ar->arWlanState == WLAN_DISABLED) {
48305 + return -EIO;
48306 + }
48307 +
48308 + switch (*mode) {
48309 + case IW_MODE_INFRA:
48310 + ar->arNetworkType = INFRA_NETWORK;
48311 + break;
48312 + case IW_MODE_ADHOC:
48313 + ar->arNetworkType = ADHOC_NETWORK;
48314 + break;
48315 + default:
48316 + return -EINVAL;
48317 + }
48318 +
48319 + return 0;
48320 +}
48321 +
48322 +/*
48323 + * SIOCGIWMODE
48324 + */
48325 +int
48326 +ar6000_ioctl_giwmode(struct net_device *dev,
48327 + struct iw_request_info *info,
48328 + __u32 *mode, char *extra)
48329 +{
48330 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48331 +
48332 + if (ar->arWlanState == WLAN_DISABLED) {
48333 + return -EIO;
48334 + }
48335 +
48336 + switch (ar->arNetworkType) {
48337 + case INFRA_NETWORK:
48338 + *mode = IW_MODE_INFRA;
48339 + break;
48340 + case ADHOC_NETWORK:
48341 + *mode = IW_MODE_ADHOC;
48342 + break;
48343 + default:
48344 + return -EIO;
48345 + }
48346 + return 0;
48347 +}
48348 +
48349 +/*
48350 + * SIOCSIWSENS
48351 + */
48352 +int
48353 +ar6000_ioctl_siwsens(struct net_device *dev,
48354 + struct iw_request_info *info,
48355 + struct iw_param *sens, char *extra)
48356 +{
48357 + return 0;
48358 +}
48359 +
48360 +/*
48361 + * SIOCGIWSENS
48362 + */
48363 +int
48364 +ar6000_ioctl_giwsens(struct net_device *dev,
48365 + struct iw_request_info *info,
48366 + struct iw_param *sens, char *extra)
48367 +{
48368 + sens->value = 0;
48369 + sens->fixed = 1;
48370 +
48371 + return 0;
48372 +}
48373 +
48374 +/*
48375 + * SIOCGIWRANGE
48376 + */
48377 +int
48378 +ar6000_ioctl_giwrange(struct net_device *dev,
48379 + struct iw_request_info *info,
48380 + struct iw_point *data, char *extra)
48381 +{
48382 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48383 + struct iw_range *range = (struct iw_range *) extra;
48384 + int i, ret = 0;
48385 +
48386 + if (ar->arWmiReady == FALSE) {
48387 + return -EIO;
48388 + }
48389 +
48390 + if (ar->arWlanState == WLAN_DISABLED) {
48391 + return -EIO;
48392 + }
48393 +
48394 + if (down_interruptible(&ar->arSem)) {
48395 + return -ERESTARTSYS;
48396 + }
48397 + ar->arNumChannels = -1;
48398 + A_MEMZERO(ar->arChannelList, sizeof (ar->arChannelList));
48399 +
48400 + if (wmi_get_channelList_cmd(ar->arWmi) != A_OK) {
48401 + up(&ar->arSem);
48402 + return -EIO;
48403 + }
48404 +
48405 + wait_event_interruptible_timeout(arEvent, ar->arNumChannels != -1, wmitimeout * HZ);
48406 +
48407 + if (signal_pending(current)) {
48408 + up(&ar->arSem);
48409 + return -EINTR;
48410 + }
48411 +
48412 + data->length = sizeof(struct iw_range);
48413 + A_MEMZERO(range, sizeof(struct iw_range));
48414 +
48415 + range->txpower_capa = IW_TXPOW_DBM;
48416 +
48417 + range->min_pmp = 1 * 1024;
48418 + range->max_pmp = 65535 * 1024;
48419 + range->min_pmt = 1 * 1024;
48420 + range->max_pmt = 1000 * 1024;
48421 + range->pmp_flags = IW_POWER_PERIOD;
48422 + range->pmt_flags = IW_POWER_TIMEOUT;
48423 + range->pm_capa = 0;
48424 +
48425 + range->we_version_compiled = WIRELESS_EXT;
48426 + range->we_version_source = 13;
48427 +
48428 + range->retry_capa = IW_RETRY_LIMIT;
48429 + range->retry_flags = IW_RETRY_LIMIT;
48430 + range->min_retry = 0;
48431 + range->max_retry = 255;
48432 +
48433 + range->num_frequency = range->num_channels = ar->arNumChannels;
48434 + for (i = 0; i < ar->arNumChannels; i++) {
48435 + range->freq[i].i = wlan_freq2ieee(ar->arChannelList[i]);
48436 + range->freq[i].m = ar->arChannelList[i] * 100000;
48437 + range->freq[i].e = 1;
48438 + /*
48439 + * Linux supports max of 32 channels, bail out once you
48440 + * reach the max.
48441 + */
48442 + if (i == IW_MAX_FREQUENCIES) {
48443 + break;
48444 + }
48445 + }
48446 +
48447 + /* Max quality is max field value minus noise floor */
48448 + range->max_qual.qual = 0xff - 161;
48449 +
48450 + /*
48451 + * In order to use dBm measurements, 'level' must be lower
48452 + * than any possible measurement (see iw_print_stats() in
48453 + * wireless tools). It's unclear how this is meant to be
48454 + * done, but setting zero in these values forces dBm and
48455 + * the actual numbers are not used.
48456 + */
48457 + range->max_qual.level = 0;
48458 + range->max_qual.noise = 0;
48459 +
48460 + range->sensitivity = 3;
48461 +
48462 + range->max_encoding_tokens = 4;
48463 + /* XXX query driver to find out supported key sizes */
48464 + range->num_encoding_sizes = 3;
48465 + range->encoding_size[0] = 5; /* 40-bit */
48466 + range->encoding_size[1] = 13; /* 104-bit */
48467 + range->encoding_size[2] = 16; /* 128-bit */
48468 +
48469 + range->num_bitrates = 0;
48470 +
48471 + /* estimated maximum TCP throughput values (bps) */
48472 + range->throughput = 22000000;
48473 +
48474 + range->min_rts = 0;
48475 + range->max_rts = 2347;
48476 + range->min_frag = 256;
48477 + range->max_frag = 2346;
48478 +
48479 + up(&ar->arSem);
48480 +
48481 + return ret;
48482 +}
48483 +
48484 +
48485 +/*
48486 + * SIOCSIWAP
48487 + * This ioctl is used to set the desired bssid for the connect command.
48488 + */
48489 +int
48490 +ar6000_ioctl_siwap(struct net_device *dev,
48491 + struct iw_request_info *info,
48492 + struct sockaddr *ap_addr, char *extra)
48493 +{
48494 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48495 +
48496 + if (ar->arWlanState == WLAN_DISABLED) {
48497 + return -EIO;
48498 + }
48499 +
48500 + if (ap_addr->sa_family != ARPHRD_ETHER) {
48501 + return -EIO;
48502 + }
48503 +
48504 + if (A_MEMCMP(&ap_addr->sa_data, bcast_mac, AR6000_ETH_ADDR_LEN) == 0) {
48505 + A_MEMZERO(ar->arReqBssid, sizeof(ar->arReqBssid));
48506 + } else {
48507 + A_MEMCPY(ar->arReqBssid, &ap_addr->sa_data, sizeof(ar->arReqBssid));
48508 + }
48509 +
48510 + return 0;
48511 +}
48512 +
48513 +/*
48514 + * SIOCGIWAP
48515 + */
48516 +int
48517 +ar6000_ioctl_giwap(struct net_device *dev,
48518 + struct iw_request_info *info,
48519 + struct sockaddr *ap_addr, char *extra)
48520 +{
48521 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48522 +
48523 + if (ar->arWlanState == WLAN_DISABLED) {
48524 + return -EIO;
48525 + }
48526 +
48527 + if (ar->arConnected != TRUE) {
48528 + return -EINVAL;
48529 + }
48530 +
48531 + A_MEMCPY(&ap_addr->sa_data, ar->arBssid, sizeof(ar->arBssid));
48532 + ap_addr->sa_family = ARPHRD_ETHER;
48533 +
48534 + return 0;
48535 +}
48536 +
48537 +/*
48538 + * SIOCGIWAPLIST
48539 + */
48540 +int
48541 +ar6000_ioctl_iwaplist(struct net_device *dev,
48542 + struct iw_request_info *info,
48543 + struct iw_point *data, char *extra)
48544 +{
48545 + return -EIO; /* for now */
48546 +}
48547 +
48548 +/*
48549 + * SIOCSIWSCAN
48550 + */
48551 +int
48552 +ar6000_ioctl_siwscan(struct net_device *dev,
48553 + struct iw_request_info *info,
48554 + struct iw_point *data, char *extra)
48555 +{
48556 +#define ACT_DWELLTIME_DEFAULT 105
48557 +#define HOME_TXDRAIN_TIME 100
48558 +#define SCAN_INT HOME_TXDRAIN_TIME + ACT_DWELLTIME_DEFAULT
48559 + AR_SOFTC_T *ar = (AR_SOFTC_T *)dev->priv;
48560 + int ret = 0;
48561 +
48562 + if (ar->arWmiReady == FALSE) {
48563 + return -EIO;
48564 + }
48565 +
48566 + if (ar->arWlanState == WLAN_DISABLED) {
48567 + return -EIO;
48568 + }
48569 +
48570 + /* We ask for everything from the target */
48571 + if (wmi_bssfilter_cmd(ar->arWmi, ALL_BSS_FILTER, 0) != A_OK) {
48572 + printk("Couldn't set filtering\n");
48573 + ret = -EIO;
48574 + }
48575 +
48576 + if (wmi_startscan_cmd(ar->arWmi, WMI_LONG_SCAN, FALSE, FALSE, \
48577 + HOME_TXDRAIN_TIME, SCAN_INT) != A_OK) {
48578 + ret = -EIO;
48579 + }
48580 +
48581 + ar->scan_complete = 0;
48582 + wait_event_interruptible_timeout(ar6000_scan_queue, ar->scan_complete,
48583 + 5 * HZ);
48584 +
48585 + if (wmi_bssfilter_cmd(ar->arWmi, NONE_BSS_FILTER, 0) != A_OK) {
48586 + printk("Couldn't set filtering\n");
48587 + ret = -EIO;
48588 + }
48589 +
48590 + return ret;
48591 +#undef ACT_DWELLTIME_DEFAULT
48592 +#undef HOME_TXDRAIN_TIME
48593 +#undef SCAN_INT
48594 +}
48595 +
48596 +
48597 +/*
48598 + * Units are in db above the noise floor. That means the
48599 + * rssi values reported in the tx/rx descriptors in the
48600 + * driver are the SNR expressed in db.
48601 + *
48602 + * If you assume that the noise floor is -95, which is an
48603 + * excellent assumption 99.5 % of the time, then you can
48604 + * derive the absolute signal level (i.e. -95 + rssi).
48605 + * There are some other slight factors to take into account
48606 + * depending on whether the rssi measurement is from 11b,
48607 + * 11g, or 11a. These differences are at most 2db and
48608 + * can be documented.
48609 + *
48610 + * NB: various calculations are based on the orinoco/wavelan
48611 + * drivers for compatibility
48612 + */
48613 +static void
48614 +ar6000_set_quality(struct iw_quality *iq, A_INT8 rssi)
48615 +{
48616 + if (rssi < 0) {
48617 + iq->qual = 0;
48618 + } else {
48619 + iq->qual = rssi;
48620 + }
48621 +
48622 + /* NB: max is 94 because noise is hardcoded to 161 */
48623 + if (iq->qual > 94)
48624 + iq->qual = 94;
48625 +
48626 + iq->noise = 161; /* -95dBm */
48627 + iq->level = iq->noise + iq->qual;
48628 + iq->updated = 7;
48629 +}
48630 +
48631 +
48632 +/* Structures to export the Wireless Handlers */
48633 +static const iw_handler ath_handlers[] = {
48634 + (iw_handler) NULL, /* SIOCSIWCOMMIT */
48635 + (iw_handler) ar6000_ioctl_giwname, /* SIOCGIWNAME */
48636 + (iw_handler) NULL, /* SIOCSIWNWID */
48637 + (iw_handler) NULL, /* SIOCGIWNWID */
48638 + (iw_handler) ar6000_ioctl_siwfreq, /* SIOCSIWFREQ */
48639 + (iw_handler) ar6000_ioctl_giwfreq, /* SIOCGIWFREQ */
48640 + (iw_handler) ar6000_ioctl_siwmode, /* SIOCSIWMODE */
48641 + (iw_handler) ar6000_ioctl_giwmode, /* SIOCGIWMODE */
48642 + (iw_handler) ar6000_ioctl_siwsens, /* SIOCSIWSENS */
48643 + (iw_handler) ar6000_ioctl_giwsens, /* SIOCGIWSENS */
48644 + (iw_handler) NULL /* not _used */, /* SIOCSIWRANGE */
48645 + (iw_handler) ar6000_ioctl_giwrange, /* SIOCGIWRANGE */
48646 + (iw_handler) NULL /* not used */, /* SIOCSIWPRIV */
48647 + (iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */
48648 + (iw_handler) NULL /* not used */, /* SIOCSIWSTATS */
48649 + (iw_handler) NULL /* kernel code */, /* SIOCGIWSTATS */
48650 + (iw_handler) NULL, /* SIOCSIWSPY */
48651 + (iw_handler) NULL, /* SIOCGIWSPY */
48652 + (iw_handler) NULL, /* SIOCSIWTHRSPY */
48653 + (iw_handler) NULL, /* SIOCGIWTHRSPY */
48654 + (iw_handler) ar6000_ioctl_siwap, /* SIOCSIWAP */
48655 + (iw_handler) ar6000_ioctl_giwap, /* SIOCGIWAP */
48656 + (iw_handler) NULL, /* -- hole -- */
48657 + (iw_handler) ar6000_ioctl_iwaplist, /* SIOCGIWAPLIST */
48658 + (iw_handler) ar6000_ioctl_siwscan, /* SIOCSIWSCAN */
48659 + (iw_handler) ar6000_ioctl_giwscan, /* SIOCGIWSCAN */
48660 + (iw_handler) ar6000_ioctl_siwessid, /* SIOCSIWESSID */
48661 + (iw_handler) ar6000_ioctl_giwessid, /* SIOCGIWESSID */
48662 + (iw_handler) NULL, /* SIOCSIWNICKN */
48663 + (iw_handler) NULL, /* SIOCGIWNICKN */
48664 + (iw_handler) NULL, /* -- hole -- */
48665 + (iw_handler) NULL, /* -- hole -- */
48666 + (iw_handler) ar6000_ioctl_siwrate, /* SIOCSIWRATE */
48667 + (iw_handler) ar6000_ioctl_giwrate, /* SIOCGIWRATE */
48668 + (iw_handler) NULL, /* SIOCSIWRTS */
48669 + (iw_handler) NULL, /* SIOCGIWRTS */
48670 + (iw_handler) NULL, /* SIOCSIWFRAG */
48671 + (iw_handler) NULL, /* SIOCGIWFRAG */
48672 + (iw_handler) ar6000_ioctl_siwtxpow, /* SIOCSIWTXPOW */
48673 + (iw_handler) ar6000_ioctl_giwtxpow, /* SIOCGIWTXPOW */
48674 + (iw_handler) ar6000_ioctl_siwretry, /* SIOCSIWRETRY */
48675 + (iw_handler) ar6000_ioctl_giwretry, /* SIOCGIWRETRY */
48676 + (iw_handler) ar6000_ioctl_siwencode, /* SIOCSIWENCODE */
48677 + (iw_handler) ar6000_ioctl_giwencode, /* SIOCGIWENCODE */
48678 + (iw_handler) ar6000_ioctl_siwpower, /* SIOCSIWPOWER */
48679 + (iw_handler) ar6000_ioctl_giwpower, /* SIOCGIWPOWER */
48680 + (iw_handler) NULL, /* -- hole -- */
48681 + (iw_handler) NULL, /* -- hole -- */
48682 + (iw_handler) ar6000_ioctl_siwgenie, /* SIOCSIWGENIE */
48683 + (iw_handler) ar6000_ioctl_giwgenie, /* SIOCGIWGENIE */
48684 + (iw_handler) ar6000_ioctl_siwauth, /* SIOCSIWAUTH */
48685 + (iw_handler) ar6000_ioctl_giwauth, /* SIOCGIWAUTH */
48686 + (iw_handler) ar6000_ioctl_siwencodeext,/* SIOCSIWENCODEEXT */
48687 + (iw_handler) ar6000_ioctl_giwencodeext,/* SIOCGIWENCODEEXT */
48688 + (iw_handler) NULL, /* SIOCSIWPMKSA */
48689 +};
48690 +
48691 +static const iw_handler ath_priv_handlers[] = {
48692 + (iw_handler) ar6000_ioctl_setparam, /* SIOCWFIRSTPRIV+0 */
48693 + (iw_handler) ar6000_ioctl_getparam, /* SIOCWFIRSTPRIV+1 */
48694 + (iw_handler) ar6000_ioctl_setkey, /* SIOCWFIRSTPRIV+2 */
48695 + (iw_handler) ar6000_ioctl_setwmmparams, /* SIOCWFIRSTPRIV+3 */
48696 + (iw_handler) ar6000_ioctl_delkey, /* SIOCWFIRSTPRIV+4 */
48697 + (iw_handler) ar6000_ioctl_getwmmparams, /* SIOCWFIRSTPRIV+5 */
48698 + (iw_handler) ar6000_ioctl_setoptie, /* SIOCWFIRSTPRIV+6 */
48699 + (iw_handler) ar6000_ioctl_setmlme, /* SIOCWFIRSTPRIV+7 */
48700 + (iw_handler) ar6000_ioctl_addpmkid, /* SIOCWFIRSTPRIV+8 */
48701 +};
48702 +
48703 +#define IW_PRIV_TYPE_KEY \
48704 + (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_key))
48705 +#define IW_PRIV_TYPE_DELKEY \
48706 + (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_del_key))
48707 +#define IW_PRIV_TYPE_MLME \
48708 + (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_mlme))
48709 +#define IW_PRIV_TYPE_ADDPMKID \
48710 + (IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_addpmkid))
48711 +
48712 +static const struct iw_priv_args ar6000_priv_args[] = {
48713 + { IEEE80211_IOCTL_SETKEY,
48714 + IW_PRIV_TYPE_KEY | IW_PRIV_SIZE_FIXED, 0, "setkey"},
48715 + { IEEE80211_IOCTL_DELKEY,
48716 + IW_PRIV_TYPE_DELKEY | IW_PRIV_SIZE_FIXED, 0, "delkey"},
48717 + { IEEE80211_IOCTL_SETPARAM,
48718 + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 2, 0, "setparam"},
48719 + { IEEE80211_IOCTL_GETPARAM,
48720 + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
48721 + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam"},
48722 + { IEEE80211_IOCTL_SETWMMPARAMS,
48723 + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 4, 0, "setwmmparams"},
48724 + { IEEE80211_IOCTL_GETWMMPARAMS,
48725 + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3,
48726 + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getwmmparams"},
48727 + { IEEE80211_IOCTL_SETOPTIE,
48728 + IW_PRIV_TYPE_BYTE, 0, "setie"},
48729 + { IEEE80211_IOCTL_SETMLME,
48730 + IW_PRIV_TYPE_MLME, 0, "setmlme"},
48731 + { IEEE80211_IOCTL_ADDPMKID,
48732 + IW_PRIV_TYPE_ADDPMKID | IW_PRIV_SIZE_FIXED, 0, "addpmkid"},
48733 +};
48734 +
48735 +void ar6000_ioctl_iwsetup(struct iw_handler_def *def)
48736 +{
48737 + def->private_args = (struct iw_priv_args *)ar6000_priv_args;
48738 + def->num_private_args = ARRAY_SIZE(ar6000_priv_args);
48739 +}
48740 +
48741 +struct iw_handler_def ath_iw_handler_def = {
48742 + .standard = (iw_handler *)ath_handlers,
48743 + .num_standard = ARRAY_SIZE(ath_handlers),
48744 + .private = (iw_handler *)ath_priv_handlers,
48745 + .num_private = ARRAY_SIZE(ath_priv_handlers),
48746 +};
48747 +
48748 +
48749 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/bmi/bmi.c
48750 ===================================================================
48751 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
48752 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/bmi/bmi.c 2008-12-11 22:46:49.000000000 +0100
48753 @@ -0,0 +1,657 @@
48754 +/*
48755 + * Copyright (c) 2004-2007 Atheros Communications Inc.
48756 + * All rights reserved.
48757 + *
48758 + *
48759 + * This program is free software; you can redistribute it and/or modify
48760 + * it under the terms of the GNU General Public License version 2 as
48761 + * published by the Free Software Foundation;
48762 + *
48763 + * Software distributed under the License is distributed on an "AS
48764 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
48765 + * implied. See the License for the specific language governing
48766 + * rights and limitations under the License.
48767 + *
48768 + *
48769 + *
48770 + */
48771 +
48772 +#include "hif.h"
48773 +#include "bmi.h"
48774 +#include "htc_api.h"
48775 +#include "bmi_internal.h"
48776 +
48777 +/*
48778 +Although we had envisioned BMI to run on top of HTC, this is not what the
48779 +final implementation boiled down to on dragon. Its a part of BSP and does
48780 +not use the HTC protocol either. On the host side, however, we were still
48781 +living with the original idea. I think the time has come to accept the truth
48782 +and separate it from HTC which has been carrying BMI's burden all this while.
48783 +It shall make HTC state machine relatively simpler
48784 +*/
48785 +
48786 +/* APIs visible to the driver */
48787 +void
48788 +BMIInit(void)
48789 +{
48790 + bmiDone = FALSE;
48791 +}
48792 +
48793 +A_STATUS
48794 +BMIDone(HIF_DEVICE *device)
48795 +{
48796 + A_STATUS status;
48797 + A_UINT32 cid;
48798 +
48799 + if (bmiDone) {
48800 + AR_DEBUG_PRINTF (ATH_DEBUG_BMI, ("BMIDone skipped\n"));
48801 + return A_OK;
48802 + }
48803 +
48804 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Done: Enter (device: 0x%p)\n", device));
48805 + bmiDone = TRUE;
48806 + cid = BMI_DONE;
48807 +
48808 + status = bmiBufferSend(device, (A_UCHAR *)&cid, sizeof(cid));
48809 + if (status != A_OK) {
48810 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
48811 + return A_ERROR;
48812 + }
48813 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Done: Exit\n"));
48814 +
48815 + return A_OK;
48816 +}
48817 +
48818 +A_STATUS
48819 +BMIGetTargetInfo(HIF_DEVICE *device, struct bmi_target_info *targ_info)
48820 +{
48821 + A_STATUS status;
48822 + A_UINT32 cid;
48823 +
48824 + if (bmiDone) {
48825 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
48826 + return A_ERROR;
48827 + }
48828 +
48829 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Get Target Info: Enter (device: 0x%p)\n", device));
48830 + cid = BMI_GET_TARGET_INFO;
48831 +
48832 + status = bmiBufferSend(device, (A_UCHAR *)&cid, sizeof(cid));
48833 + if (status != A_OK) {
48834 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
48835 + return A_ERROR;
48836 + }
48837 +
48838 + status = bmiBufferReceive(device, (A_UCHAR *)&targ_info->target_ver,
48839 + sizeof(targ_info->target_ver));
48840 + if (status != A_OK) {
48841 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Version from the device\n"));
48842 + return A_ERROR;
48843 + }
48844 +
48845 + if (targ_info->target_ver == TARGET_VERSION_SENTINAL) {
48846 + /* Determine how many bytes are in the Target's targ_info */
48847 + status = bmiBufferReceive(device, (A_UCHAR *)&targ_info->target_info_byte_count,
48848 + sizeof(targ_info->target_info_byte_count));
48849 + if (status != A_OK) {
48850 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Info Byte Count from the device\n"));
48851 + return A_ERROR;
48852 + }
48853 +
48854 + /*
48855 + * The Target's targ_info doesn't match the Host's targ_info.
48856 + * We need to do some backwards compatibility work to make this OK.
48857 + */
48858 + A_ASSERT(targ_info->target_info_byte_count == sizeof(*targ_info));
48859 +
48860 + /* Read the remainder of the targ_info */
48861 + status = bmiBufferReceive(device,
48862 + ((A_UCHAR *)targ_info)+sizeof(targ_info->target_info_byte_count),
48863 + sizeof(*targ_info)-sizeof(targ_info->target_info_byte_count));
48864 + if (status != A_OK) {
48865 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read Target Info (%d bytes) from the device\n",
48866 + targ_info->target_info_byte_count));
48867 + return A_ERROR;
48868 + }
48869 + } else {
48870 + /*
48871 + * Target must be an AR6001 whose firmware does not
48872 + * support BMI_GET_TARGET_INFO. Construct the data
48873 + * that it would have sent.
48874 + */
48875 + targ_info->target_info_byte_count = sizeof(targ_info);
48876 + targ_info->target_type = TARGET_TYPE_AR6001;
48877 + }
48878 +
48879 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Get Target Info: Exit (ver: 0x%x type: 0x%x)\n",
48880 + targ_info->target_ver, targ_info->target_type));
48881 + printk("BMI Get Target Info: Exit (ver: 0x%x type: 0x%x)\n",
48882 + targ_info->target_ver, targ_info->target_type);
48883 +
48884 + return A_OK;
48885 +}
48886 +
48887 +A_STATUS
48888 +BMIReadMemory(HIF_DEVICE *device,
48889 + A_UINT32 address,
48890 + A_UCHAR *buffer,
48891 + A_UINT32 length)
48892 +{
48893 + A_UINT32 cid;
48894 + A_STATUS status;
48895 + A_UINT32 offset;
48896 + A_UINT32 remaining, rxlen;
48897 + static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length)];
48898 + memset (&data, 0, BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length));
48899 +
48900 + if (bmiDone) {
48901 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
48902 + return A_ERROR;
48903 + }
48904 +
48905 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
48906 + ("BMI Read Memory: Enter (device: 0x%p, address: 0x%x, length: %d)\n",
48907 + device, address, length));
48908 +
48909 + cid = BMI_READ_MEMORY;
48910 +
48911 + remaining = length;
48912 +
48913 + while (remaining)
48914 + {
48915 + rxlen = (remaining < BMI_DATASZ_MAX) ? remaining : BMI_DATASZ_MAX;
48916 + offset = 0;
48917 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
48918 + offset += sizeof(cid);
48919 + A_MEMCPY(&data[offset], &address, sizeof(address));
48920 + offset += sizeof(address);
48921 + A_MEMCPY(&data[offset], &rxlen, sizeof(rxlen));
48922 + offset += sizeof(length);
48923 +
48924 + status = bmiBufferSend(device, data, offset);
48925 + if (status != A_OK) {
48926 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
48927 + return A_ERROR;
48928 + }
48929 + status = bmiBufferReceive(device, data, rxlen);
48930 + if (status != A_OK) {
48931 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
48932 + return A_ERROR;
48933 + }
48934 + A_MEMCPY(&buffer[length - remaining], data, rxlen);
48935 + remaining -= rxlen; address += rxlen;
48936 + }
48937 +
48938 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read Memory: Exit\n"));
48939 + return A_OK;
48940 +}
48941 +
48942 +A_STATUS
48943 +BMIWriteMemory(HIF_DEVICE *device,
48944 + A_UINT32 address,
48945 + A_UCHAR *buffer,
48946 + A_UINT32 length)
48947 +{
48948 + A_UINT32 cid;
48949 + A_STATUS status;
48950 + A_UINT32 offset;
48951 + A_UINT32 remaining, txlen;
48952 + const A_UINT32 header = sizeof(cid) + sizeof(address) + sizeof(length);
48953 + static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(address) + sizeof(length)];
48954 + memset (&data, 0, header);
48955 +
48956 + if (bmiDone) {
48957 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
48958 + return A_ERROR;
48959 + }
48960 +
48961 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
48962 + ("BMI Write Memory: Enter (device: 0x%p, address: 0x%x, length: %d)\n",
48963 + device, address, length));
48964 +
48965 + cid = BMI_WRITE_MEMORY;
48966 +
48967 + remaining = length;
48968 + while (remaining)
48969 + {
48970 + txlen = (remaining < (BMI_DATASZ_MAX - header)) ?
48971 + remaining : (BMI_DATASZ_MAX - header);
48972 + offset = 0;
48973 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
48974 + offset += sizeof(cid);
48975 + A_MEMCPY(&data[offset], &address, sizeof(address));
48976 + offset += sizeof(address);
48977 + A_MEMCPY(&data[offset], &txlen, sizeof(txlen));
48978 + offset += sizeof(txlen);
48979 + A_MEMCPY(&data[offset], &buffer[length - remaining], txlen);
48980 + offset += txlen;
48981 + status = bmiBufferSend(device, data, offset);
48982 + if (status != A_OK) {
48983 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
48984 + return A_ERROR;
48985 + }
48986 + remaining -= txlen; address += txlen;
48987 + }
48988 +
48989 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Write Memory: Exit\n"));
48990 +
48991 + return A_OK;
48992 +}
48993 +
48994 +A_STATUS
48995 +BMIExecute(HIF_DEVICE *device,
48996 + A_UINT32 address,
48997 + A_UINT32 *param)
48998 +{
48999 + A_UINT32 cid;
49000 + A_STATUS status;
49001 + A_UINT32 offset;
49002 + static A_UCHAR data[sizeof(cid) + sizeof(address) + sizeof(*param)];
49003 + memset (&data, 0, sizeof(cid) + sizeof(address) + sizeof(*param));
49004 +
49005 + if (bmiDone) {
49006 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
49007 + return A_ERROR;
49008 + }
49009 +
49010 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
49011 + ("BMI Execute: Enter (device: 0x%p, address: 0x%x, param: %d)\n",
49012 + device, address, *param));
49013 +
49014 + cid = BMI_EXECUTE;
49015 +
49016 + offset = 0;
49017 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
49018 + offset += sizeof(cid);
49019 + A_MEMCPY(&data[offset], &address, sizeof(address));
49020 + offset += sizeof(address);
49021 + A_MEMCPY(&data[offset], param, sizeof(*param));
49022 + offset += sizeof(*param);
49023 + status = bmiBufferSend(device, data, offset);
49024 + if (status != A_OK) {
49025 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
49026 + return A_ERROR;
49027 + }
49028 +
49029 + status = bmiBufferReceive(device, data, sizeof(*param));
49030 + if (status != A_OK) {
49031 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
49032 + return A_ERROR;
49033 + }
49034 +
49035 + A_MEMCPY(param, data, sizeof(*param));
49036 +
49037 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Execute: Exit (param: %d)\n", *param));
49038 + return A_OK;
49039 +}
49040 +
49041 +A_STATUS
49042 +BMISetAppStart(HIF_DEVICE *device,
49043 + A_UINT32 address)
49044 +{
49045 + A_UINT32 cid;
49046 + A_STATUS status;
49047 + A_UINT32 offset;
49048 + static A_UCHAR data[sizeof(cid) + sizeof(address)];
49049 + memset (&data, 0, sizeof(cid) + sizeof(address));
49050 +
49051 + if (bmiDone) {
49052 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
49053 + return A_ERROR;
49054 + }
49055 +
49056 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
49057 + ("BMI Set App Start: Enter (device: 0x%p, address: 0x%x)\n",
49058 + device, address));
49059 +
49060 + cid = BMI_SET_APP_START;
49061 +
49062 + offset = 0;
49063 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
49064 + offset += sizeof(cid);
49065 + A_MEMCPY(&data[offset], &address, sizeof(address));
49066 + offset += sizeof(address);
49067 + status = bmiBufferSend(device, data, offset);
49068 + if (status != A_OK) {
49069 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
49070 + return A_ERROR;
49071 + }
49072 +
49073 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Set App Start: Exit\n"));
49074 + return A_OK;
49075 +}
49076 +
49077 +A_STATUS
49078 +BMIReadSOCRegister(HIF_DEVICE *device,
49079 + A_UINT32 address,
49080 + A_UINT32 *param)
49081 +{
49082 + A_UINT32 cid;
49083 + A_STATUS status;
49084 + A_UINT32 offset;
49085 + static A_UCHAR data[sizeof(cid) + sizeof(address)];
49086 + memset (&data, 0, sizeof(cid) + sizeof(address));
49087 +
49088 + if (bmiDone) {
49089 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
49090 + return A_ERROR;
49091 + }
49092 +
49093 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
49094 + ("BMI Read SOC Register: Enter (device: 0x%p, address: 0x%x)\n",
49095 + device, address));
49096 +
49097 + cid = BMI_READ_SOC_REGISTER;
49098 +
49099 + offset = 0;
49100 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
49101 + offset += sizeof(cid);
49102 + A_MEMCPY(&data[offset], &address, sizeof(address));
49103 + offset += sizeof(address);
49104 +
49105 + status = bmiBufferSend(device, data, offset);
49106 + if (status != A_OK) {
49107 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
49108 + return A_ERROR;
49109 + }
49110 +
49111 + status = bmiBufferReceive(device, data, sizeof(*param));
49112 + if (status != A_OK) {
49113 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
49114 + return A_ERROR;
49115 + }
49116 + A_MEMCPY(param, data, sizeof(*param));
49117 +
49118 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read SOC Register: Exit (value: %d)\n", *param));
49119 + return A_OK;
49120 +}
49121 +
49122 +A_STATUS
49123 +BMIWriteSOCRegister(HIF_DEVICE *device,
49124 + A_UINT32 address,
49125 + A_UINT32 param)
49126 +{
49127 + A_UINT32 cid;
49128 + A_STATUS status;
49129 + A_UINT32 offset;
49130 + static A_UCHAR data[sizeof(cid) + sizeof(address) + sizeof(param)];
49131 +
49132 + memset (&data, 0, sizeof(cid) + sizeof(address) + sizeof(param));
49133 +
49134 + if (bmiDone) {
49135 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
49136 + return A_ERROR;
49137 + }
49138 +
49139 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
49140 + ("BMI Write SOC Register: Enter (device: 0x%p, address: 0x%x, param: %d)\n",
49141 + device, address, param));
49142 +
49143 + cid = BMI_WRITE_SOC_REGISTER;
49144 +
49145 + offset = 0;
49146 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
49147 + offset += sizeof(cid);
49148 + A_MEMCPY(&data[offset], &address, sizeof(address));
49149 + offset += sizeof(address);
49150 + A_MEMCPY(&data[offset], &param, sizeof(param));
49151 + offset += sizeof(param);
49152 + status = bmiBufferSend(device, data, offset);
49153 + if (status != A_OK) {
49154 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
49155 + return A_ERROR;
49156 + }
49157 +
49158 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Read SOC Register: Exit\n"));
49159 + return A_OK;
49160 +}
49161 +
49162 +A_STATUS
49163 +BMIrompatchInstall(HIF_DEVICE *device,
49164 + A_UINT32 ROM_addr,
49165 + A_UINT32 RAM_addr,
49166 + A_UINT32 nbytes,
49167 + A_UINT32 do_activate,
49168 + A_UINT32 *rompatch_id)
49169 +{
49170 + A_UINT32 cid;
49171 + A_STATUS status;
49172 + A_UINT32 offset;
49173 + static A_UCHAR data[sizeof(cid) + sizeof(ROM_addr) + sizeof(RAM_addr) +
49174 + sizeof(nbytes) + sizeof(do_activate)];
49175 +
49176 + memset (&data, 0, sizeof(cid) + sizeof(ROM_addr) + sizeof(RAM_addr) +
49177 + sizeof(nbytes) + sizeof(do_activate));
49178 +
49179 + if (bmiDone) {
49180 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
49181 + return A_ERROR;
49182 + }
49183 +
49184 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
49185 + ("BMI rompatch Install: Enter (device: 0x%p, ROMaddr: 0x%x, RAMaddr: 0x%x length: %d activate: %d)\n",
49186 + device, ROM_addr, RAM_addr, nbytes, do_activate));
49187 +
49188 + cid = BMI_ROMPATCH_INSTALL;
49189 +
49190 + offset = 0;
49191 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
49192 + offset += sizeof(cid);
49193 + A_MEMCPY(&data[offset], &ROM_addr, sizeof(ROM_addr));
49194 + offset += sizeof(ROM_addr);
49195 + A_MEMCPY(&data[offset], &RAM_addr, sizeof(RAM_addr));
49196 + offset += sizeof(RAM_addr);
49197 + A_MEMCPY(&data[offset], &nbytes, sizeof(nbytes));
49198 + offset += sizeof(nbytes);
49199 + A_MEMCPY(&data[offset], &do_activate, sizeof(do_activate));
49200 + offset += sizeof(do_activate);
49201 + status = bmiBufferSend(device, data, offset);
49202 + if (status != A_OK) {
49203 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
49204 + return A_ERROR;
49205 + }
49206 +
49207 + status = bmiBufferReceive(device, (A_UCHAR *)rompatch_id, sizeof(*rompatch_id));
49208 + if (status != A_OK) {
49209 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read from the device\n"));
49210 + return A_ERROR;
49211 + }
49212 +
49213 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI rompatch Install: (rompatch_id=%d)\n", *rompatch_id));
49214 + return A_OK;
49215 +}
49216 +
49217 +A_STATUS
49218 +BMIrompatchUninstall(HIF_DEVICE *device,
49219 + A_UINT32 rompatch_id)
49220 +{
49221 + A_UINT32 cid;
49222 + A_STATUS status;
49223 + A_UINT32 offset;
49224 + static A_UCHAR data[sizeof(cid) + sizeof(rompatch_id)];
49225 + memset (&data, 0, sizeof(cid) + sizeof(rompatch_id));
49226 +
49227 + if (bmiDone) {
49228 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
49229 + return A_ERROR;
49230 + }
49231 +
49232 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
49233 + ("BMI rompatch Uninstall: Enter (device: 0x%p, rompatch_id: %d)\n",
49234 + device, rompatch_id));
49235 +
49236 + cid = BMI_ROMPATCH_UNINSTALL;
49237 +
49238 + offset = 0;
49239 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
49240 + offset += sizeof(cid);
49241 + A_MEMCPY(&data[offset], &rompatch_id, sizeof(rompatch_id));
49242 + offset += sizeof(rompatch_id);
49243 + status = bmiBufferSend(device, data, offset);
49244 + if (status != A_OK) {
49245 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
49246 + return A_ERROR;
49247 + }
49248 +
49249 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI rompatch UNinstall: (rompatch_id=0x%x)\n", rompatch_id));
49250 + return A_OK;
49251 +}
49252 +
49253 +static A_STATUS
49254 +_BMIrompatchChangeActivation(HIF_DEVICE *device,
49255 + A_UINT32 rompatch_count,
49256 + A_UINT32 *rompatch_list,
49257 + A_UINT32 do_activate)
49258 +{
49259 + A_UINT32 cid;
49260 + A_STATUS status;
49261 + A_UINT32 offset;
49262 + static A_UCHAR data[BMI_DATASZ_MAX + sizeof(cid) + sizeof(rompatch_count)];
49263 + A_UINT32 length;
49264 +
49265 + memset (&data, 0, BMI_DATASZ_MAX + sizeof(cid) + sizeof(rompatch_count));
49266 +
49267 + if (bmiDone) {
49268 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Command disallowed\n"));
49269 + return A_ERROR;
49270 + }
49271 +
49272 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI,
49273 + ("BMI Change rompatch Activation: Enter (device: 0x%p, count: %d)\n",
49274 + device, rompatch_count));
49275 +
49276 + cid = do_activate ? BMI_ROMPATCH_ACTIVATE : BMI_ROMPATCH_DEACTIVATE;
49277 +
49278 + offset = 0;
49279 + A_MEMCPY(&data[offset], &cid, sizeof(cid));
49280 + offset += sizeof(cid);
49281 + A_MEMCPY(&data[offset], &rompatch_count, sizeof(rompatch_count));
49282 + offset += sizeof(rompatch_count);
49283 + length = rompatch_count * sizeof(*rompatch_list);
49284 + A_MEMCPY(&data[offset], rompatch_list, length);
49285 + offset += length;
49286 + status = bmiBufferSend(device, data, offset);
49287 + if (status != A_OK) {
49288 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to write to the device\n"));
49289 + return A_ERROR;
49290 + }
49291 +
49292 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Change rompatch Activation: Exit\n"));
49293 +
49294 + return A_OK;
49295 +}
49296 +
49297 +A_STATUS
49298 +BMIrompatchActivate(HIF_DEVICE *device,
49299 + A_UINT32 rompatch_count,
49300 + A_UINT32 *rompatch_list)
49301 +{
49302 + return _BMIrompatchChangeActivation(device, rompatch_count, rompatch_list, 1);
49303 +}
49304 +
49305 +A_STATUS
49306 +BMIrompatchDeactivate(HIF_DEVICE *device,
49307 + A_UINT32 rompatch_count,
49308 + A_UINT32 *rompatch_list)
49309 +{
49310 + return _BMIrompatchChangeActivation(device, rompatch_count, rompatch_list, 0);
49311 +}
49312 +
49313 +/* BMI Access routines */
49314 +A_STATUS
49315 +bmiBufferSend(HIF_DEVICE *device,
49316 + A_UCHAR *buffer,
49317 + A_UINT32 length)
49318 +{
49319 + A_STATUS status;
49320 + A_UINT32 timeout;
49321 + A_UINT32 address;
49322 + static A_UINT32 cmdCredits;
49323 + A_UINT32 mboxAddress[HTC_MAILBOX_NUM_MAX];
49324 +
49325 + HIFConfigureDevice(device, HIF_DEVICE_GET_MBOX_ADDR,
49326 + &mboxAddress, sizeof(mboxAddress));
49327 +
49328 + cmdCredits = 0;
49329 + timeout = BMI_COMMUNICATION_TIMEOUT;
49330 +
49331 + while(timeout-- && !cmdCredits) {
49332 + /* Read the counter register to get the command credits */
49333 + address = COUNT_DEC_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 4;
49334 + /* hit the credit counter with a 4-byte access, the first byte read will hit the counter and cause
49335 + * a decrement, while the remaining 3 bytes has no effect. The rationale behind this is to
49336 + * make all HIF accesses 4-byte aligned */
49337 + status = HIFReadWrite(device, address, (A_UINT8 *)&cmdCredits, 4,
49338 + HIF_RD_SYNC_BYTE_INC, NULL);
49339 + if (status != A_OK) {
49340 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to decrement the command credit count register\n"));
49341 + return A_ERROR;
49342 + }
49343 + /* the counter is only 8=bits, ignore anything in the upper 3 bytes */
49344 + cmdCredits &= 0xFF;
49345 + }
49346 +
49347 + if (cmdCredits) {
49348 + address = mboxAddress[ENDPOINT1];
49349 + status = HIFReadWrite(device, address, buffer, length,
49350 + HIF_WR_SYNC_BYTE_INC, NULL);
49351 + if (status != A_OK) {
49352 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to send the BMI data to the device\n"));
49353 + return A_ERROR;
49354 + }
49355 + } else {
49356 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("BMI Communication timeout\n"));
49357 + return A_ERROR;
49358 + }
49359 +
49360 + return status;
49361 +}
49362 +
49363 +A_STATUS
49364 +bmiBufferReceive(HIF_DEVICE *device,
49365 + A_UCHAR *buffer,
49366 + A_UINT32 length)
49367 +{
49368 + A_STATUS status;
49369 + A_UINT32 address;
49370 + A_UINT32 timeout;
49371 + static A_UINT32 cmdCredits;
49372 + A_UINT32 mboxAddress[HTC_MAILBOX_NUM_MAX];
49373 +
49374 + HIFConfigureDevice(device, HIF_DEVICE_GET_MBOX_ADDR,
49375 + &mboxAddress, sizeof(mboxAddress));
49376 +
49377 + cmdCredits = 0;
49378 + timeout = BMI_COMMUNICATION_TIMEOUT;
49379 + while(timeout-- && !cmdCredits) {
49380 + /* Read the counter register to get the command credits */
49381 + address = COUNT_ADDRESS + (HTC_MAILBOX_NUM_MAX + ENDPOINT1) * 1;
49382 + /* read the counter using a 4-byte read. Since the counter is NOT auto-decrementing,
49383 + * we can read this counter multiple times using a non-incrementing address mode.
49384 + * The rationale here is to make all HIF accesses a multiple of 4 bytes */
49385 + status = HIFReadWrite(device, address, (A_UINT8 *)&cmdCredits, sizeof(cmdCredits),
49386 + HIF_RD_SYNC_BYTE_FIX, NULL);
49387 + if (status != A_OK) {
49388 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read the command credit count register\n"));
49389 + return A_ERROR;
49390 + }
49391 + /* we did a 4-byte read to the same count register so mask off upper bytes */
49392 + cmdCredits &= 0xFF;
49393 + status = A_ERROR;
49394 + }
49395 +
49396 + if (cmdCredits) {
49397 + address = mboxAddress[ENDPOINT1];
49398 + status = HIFReadWrite(device, address, buffer, length,
49399 + HIF_RD_SYNC_BYTE_INC, NULL);
49400 + if (status != A_OK) {
49401 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to read the BMI data from the device\n"));
49402 + return A_ERROR;
49403 + }
49404 + } else {
49405 + AR_DEBUG_PRINTF(ATH_DEBUG_BMI, ("BMI Communication timeout\n"));
49406 + return A_ERROR;
49407 + }
49408 +
49409 + return status;
49410 +}
49411 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/bmi/bmi_internal.h
49412 ===================================================================
49413 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
49414 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/bmi/bmi_internal.h 2008-12-11 22:46:49.000000000 +0100
49415 @@ -0,0 +1,45 @@
49416 +#ifndef BMI_INTERNAL_H
49417 +#define BMI_INTERNAL_H
49418 +/*
49419 + *
49420 + * Copyright (c) 2004-2007 Atheros Communications Inc.
49421 + * All rights reserved.
49422 + *
49423 + *
49424 + * This program is free software; you can redistribute it and/or modify
49425 + * it under the terms of the GNU General Public License version 2 as
49426 + * published by the Free Software Foundation;
49427 + *
49428 + * Software distributed under the License is distributed on an "AS
49429 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
49430 + * implied. See the License for the specific language governing
49431 + * rights and limitations under the License.
49432 + *
49433 + *
49434 + *
49435 + */
49436 +
49437 +#include "a_config.h"
49438 +#include "athdefs.h"
49439 +#include "a_types.h"
49440 +#include "a_osapi.h"
49441 +#include "a_debug.h"
49442 +#include "AR6Khwreg.h"
49443 +#include "bmi_msg.h"
49444 +
49445 +#define BMI_COMMUNICATION_TIMEOUT 100000
49446 +
49447 +/* ------ Global Variable Declarations ------- */
49448 +A_BOOL bmiDone;
49449 +
49450 +A_STATUS
49451 +bmiBufferSend(HIF_DEVICE *device,
49452 + A_UCHAR *buffer,
49453 + A_UINT32 length);
49454 +
49455 +A_STATUS
49456 +bmiBufferReceive(HIF_DEVICE *device,
49457 + A_UCHAR *buffer,
49458 + A_UINT32 length);
49459 +
49460 +#endif
49461 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/hif/hif.c
49462 ===================================================================
49463 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
49464 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/hif/hif.c 2008-12-11 22:46:49.000000000 +0100
49465 @@ -0,0 +1,824 @@
49466 +/*
49467 + * @file: hif.c
49468 + *
49469 + * @abstract: HIF layer reference implementation for Atheros SDIO stack
49470 + *
49471 + * @notice: Copyright (c) 2004-2006 Atheros Communications Inc.
49472 + *
49473 + *
49474 + * This program is free software; you can redistribute it and/or modify
49475 + * it under the terms of the GNU General Public License version 2 as
49476 + * published by the Free Software Foundation;
49477 + *
49478 + * Software distributed under the License is distributed on an "AS
49479 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
49480 + * implied. See the License for the specific language governing
49481 + * rights and limitations under the License.
49482 + *
49483 + *
49484 + *
49485 + */
49486 +
49487 +#include "hif_internal.h"
49488 +
49489 +/* ------ Static Variables ------ */
49490 +
49491 +/* ------ Global Variable Declarations ------- */
49492 +SD_PNP_INFO Ids[] = {
49493 + {
49494 + .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0xB,
49495 + .SDIO_ManufacturerCode = MANUFACTURER_CODE,
49496 + .SDIO_FunctionClass = FUNCTION_CLASS,
49497 + .SDIO_FunctionNo = 1
49498 + },
49499 + {
49500 + .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0xA,
49501 + .SDIO_ManufacturerCode = MANUFACTURER_CODE,
49502 + .SDIO_FunctionClass = FUNCTION_CLASS,
49503 + .SDIO_FunctionNo = 1
49504 + },
49505 + {
49506 + .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0x9,
49507 + .SDIO_ManufacturerCode = MANUFACTURER_CODE,
49508 + .SDIO_FunctionClass = FUNCTION_CLASS,
49509 + .SDIO_FunctionNo = 1
49510 + },
49511 + {
49512 + .SDIO_ManufacturerID = MANUFACTURER_ID_AR6001_BASE | 0x8,
49513 + .SDIO_ManufacturerCode = MANUFACTURER_CODE,
49514 + .SDIO_FunctionClass = FUNCTION_CLASS,
49515 + .SDIO_FunctionNo = 1
49516 + },
49517 + {
49518 + .SDIO_ManufacturerID = MANUFACTURER_ID_AR6002_BASE | 0x0,
49519 + .SDIO_ManufacturerCode = MANUFACTURER_CODE,
49520 + .SDIO_FunctionClass = FUNCTION_CLASS,
49521 + .SDIO_FunctionNo = 1
49522 + },
49523 + {
49524 + .SDIO_ManufacturerID = MANUFACTURER_ID_AR6002_BASE | 0x1,
49525 + .SDIO_ManufacturerCode = MANUFACTURER_CODE,
49526 + .SDIO_FunctionClass = FUNCTION_CLASS,
49527 + .SDIO_FunctionNo = 1
49528 + },
49529 + {
49530 + } //list is null termintaed
49531 +};
49532 +
49533 +TARGET_FUNCTION_CONTEXT FunctionContext = {
49534 + .function.Version = CT_SDIO_STACK_VERSION_CODE,
49535 + .function.pName = "sdio_wlan",
49536 + .function.MaxDevices = 1,
49537 + .function.NumDevices = 0,
49538 + .function.pIds = Ids,
49539 + .function.pProbe = hifDeviceInserted,
49540 + .function.pRemove = hifDeviceRemoved,
49541 + .function.pSuspend = NULL,
49542 + .function.pResume = NULL,
49543 + .function.pWake = NULL,
49544 + .function.pContext = &FunctionContext,
49545 +};
49546 +
49547 +HIF_DEVICE hifDevice[HIF_MAX_DEVICES];
49548 +HTC_CALLBACKS htcCallbacks;
49549 +BUS_REQUEST busRequest[BUS_REQUEST_MAX_NUM];
49550 +static BUS_REQUEST *s_busRequestFreeQueue = NULL;
49551 +OS_CRITICALSECTION lock;
49552 +extern A_UINT32 onebitmode;
49553 +extern A_UINT32 busspeedlow;
49554 +
49555 +#ifdef DEBUG
49556 +extern A_UINT32 debughif;
49557 +#define ATH_DEBUG_ERROR 1
49558 +#define ATH_DEBUG_WARN 2
49559 +#define ATH_DEBUG_TRACE 3
49560 +#define _AR_DEBUG_PRINTX_ARG(arg...) arg
49561 +#define AR_DEBUG_PRINTF(lvl, args)\
49562 + {if (lvl <= debughif)\
49563 + A_PRINTF(KERN_ALERT _AR_DEBUG_PRINTX_ARG args);\
49564 + }
49565 +#else
49566 +#define AR_DEBUG_PRINTF(lvl, args)
49567 +#endif
49568 +
49569 +static BUS_REQUEST *hifAllocateBusRequest(void);
49570 +static void hifFreeBusRequest(BUS_REQUEST *busrequest);
49571 +static THREAD_RETURN insert_helper_func(POSKERNEL_HELPER pHelper);
49572 +static void ResetAllCards(void);
49573 +
49574 +/* ------ Functions ------ */
49575 +int HIFInit(HTC_CALLBACKS *callbacks)
49576 +{
49577 + SDIO_STATUS status;
49578 + DBG_ASSERT(callbacks != NULL);
49579 +
49580 + /* Store the callback and event handlers */
49581 + htcCallbacks.deviceInsertedHandler = callbacks->deviceInsertedHandler;
49582 + htcCallbacks.deviceRemovedHandler = callbacks->deviceRemovedHandler;
49583 + htcCallbacks.deviceSuspendHandler = callbacks->deviceSuspendHandler;
49584 + htcCallbacks.deviceResumeHandler = callbacks->deviceResumeHandler;
49585 + htcCallbacks.deviceWakeupHandler = callbacks->deviceWakeupHandler;
49586 + htcCallbacks.rwCompletionHandler = callbacks->rwCompletionHandler;
49587 + htcCallbacks.dsrHandler = callbacks->dsrHandler;
49588 +
49589 + CriticalSectionInit(&lock);
49590 +
49591 + /* Register with bus driver core */
49592 + status = SDIO_RegisterFunction(&FunctionContext.function);
49593 + DBG_ASSERT(SDIO_SUCCESS(status));
49594 +
49595 + return(0);
49596 +}
49597 +
49598 +A_STATUS
49599 +HIFReadWrite(HIF_DEVICE *device,
49600 + A_UINT32 address,
49601 + A_UCHAR *buffer,
49602 + A_UINT32 length,
49603 + A_UINT32 request,
49604 + void *context)
49605 +{
49606 + A_UINT8 rw;
49607 + A_UINT8 mode;
49608 + A_UINT8 funcNo;
49609 + A_UINT8 opcode;
49610 + A_UINT16 count;
49611 + SDREQUEST *sdrequest;
49612 + SDIO_STATUS sdiostatus;
49613 + BUS_REQUEST *busrequest;
49614 + A_STATUS status = A_OK;
49615 +
49616 + DBG_ASSERT(device != NULL);
49617 + DBG_ASSERT(device->handle != NULL);
49618 +
49619 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
49620 +
49621 + do {
49622 + busrequest = hifAllocateBusRequest();
49623 + if (busrequest == NULL) {
49624 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("HIF Unable to allocate bus request\n"));
49625 + status = A_NO_RESOURCE;
49626 + break;
49627 + }
49628 +
49629 + sdrequest = busrequest->request;
49630 + busrequest->context = context;
49631 +
49632 + sdrequest->pDataBuffer = buffer;
49633 + if (request & HIF_SYNCHRONOUS) {
49634 + sdrequest->Flags = SDREQ_FLAGS_RESP_SDIO_R5 | SDREQ_FLAGS_DATA_TRANS;
49635 + sdrequest->pCompleteContext = NULL;
49636 + sdrequest->pCompletion = NULL;
49637 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Execution mode: Synchronous\n"));
49638 + } else if (request & HIF_ASYNCHRONOUS) {
49639 + sdrequest->Flags = SDREQ_FLAGS_RESP_SDIO_R5 | SDREQ_FLAGS_DATA_TRANS |
49640 + SDREQ_FLAGS_TRANS_ASYNC;
49641 + sdrequest->pCompleteContext = busrequest;
49642 + sdrequest->pCompletion = hifRWCompletionHandler;
49643 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Execution mode: Asynchronous\n"));
49644 + } else {
49645 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
49646 + ("Invalid execution mode: 0x%08x\n", request));
49647 + status = A_EINVAL;
49648 + break;
49649 + }
49650 +
49651 + if (request & HIF_EXTENDED_IO) {
49652 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Command type: CMD53\n"));
49653 + sdrequest->Command = CMD53;
49654 + } else {
49655 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
49656 + ("Invalid command type: 0x%08x\n", request));
49657 + status = A_EINVAL;
49658 + break;
49659 + }
49660 +
49661 + if (request & HIF_BLOCK_BASIS) {
49662 + mode = CMD53_BLOCK_BASIS;
49663 + sdrequest->BlockLen = HIF_MBOX_BLOCK_SIZE;
49664 + sdrequest->BlockCount = length / HIF_MBOX_BLOCK_SIZE;
49665 + count = sdrequest->BlockCount;
49666 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
49667 + ("Block mode (BlockLen: %d, BlockCount: %d)\n",
49668 + sdrequest->BlockLen, sdrequest->BlockCount));
49669 + } else if (request & HIF_BYTE_BASIS) {
49670 + mode = CMD53_BYTE_BASIS;
49671 + sdrequest->BlockLen = length;
49672 + sdrequest->BlockCount = 1;
49673 + count = sdrequest->BlockLen;
49674 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
49675 + ("Byte mode (BlockLen: %d, BlockCount: %d)\n",
49676 + sdrequest->BlockLen, sdrequest->BlockCount));
49677 + } else {
49678 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
49679 + ("Invalid data mode: 0x%08x\n", request));
49680 + status = A_EINVAL;
49681 + break;
49682 + }
49683 +
49684 +#if 0
49685 + /* useful for checking register accesses */
49686 + if (length & 0x3) {
49687 + A_PRINTF(KERN_ALERT"HIF (%s) is not a multiple of 4 bytes, addr:0x%X, len:%d\n",
49688 + request & HIF_WRITE ? "write":"read", address, length);
49689 + }
49690 +#endif
49691 +
49692 + if ((address >= HIF_MBOX_START_ADDR(0)) &&
49693 + (address <= HIF_MBOX_END_ADDR(3)))
49694 + {
49695 +
49696 + DBG_ASSERT(length <= HIF_MBOX_WIDTH);
49697 +
49698 + /*
49699 + * Mailbox write. Adjust the address so that the last byte
49700 + * falls on the EOM address.
49701 + */
49702 + address += (HIF_MBOX_WIDTH - length);
49703 + }
49704 +
49705 +
49706 +
49707 + if (request & HIF_WRITE) {
49708 + rw = CMD53_WRITE;
49709 + sdrequest->Flags |= SDREQ_FLAGS_DATA_WRITE;
49710 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Direction: Write\n"));
49711 + } else if (request & HIF_READ) {
49712 + rw = CMD53_READ;
49713 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Direction: Read\n"));
49714 + } else {
49715 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
49716 + ("Invalid direction: 0x%08x\n", request));
49717 + status = A_EINVAL;
49718 + break;
49719 + }
49720 +
49721 + if (request & HIF_FIXED_ADDRESS) {
49722 + opcode = CMD53_FIXED_ADDRESS;
49723 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Address mode: Fixed\n"));
49724 + } else if (request & HIF_INCREMENTAL_ADDRESS) {
49725 + opcode = CMD53_INCR_ADDRESS;
49726 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Address mode: Incremental\n"));
49727 + } else {
49728 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
49729 + ("Invalid address mode: 0x%08x\n", request));
49730 + status = A_EINVAL;
49731 + break;
49732 + }
49733 +
49734 + funcNo = SDDEVICE_GET_SDIO_FUNCNO(device->handle);
49735 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Function number: %d\n", funcNo));
49736 + SDIO_SET_CMD53_ARG(sdrequest->Argument, rw, funcNo,
49737 + mode, opcode, address, count);
49738 +
49739 + /* Send the command out */
49740 + sdiostatus = SDDEVICE_CALL_REQUEST_FUNC(device->handle, sdrequest);
49741 +
49742 + if (!SDIO_SUCCESS(sdiostatus)) {
49743 + status = A_ERROR;
49744 + }
49745 +
49746 + } while (FALSE);
49747 +
49748 + if (A_FAILED(status) || (request & HIF_SYNCHRONOUS)) {
49749 + if (busrequest != NULL) {
49750 + hifFreeBusRequest(busrequest);
49751 + }
49752 + }
49753 +
49754 + if (A_FAILED(status) && (request & HIF_ASYNCHRONOUS)) {
49755 + /* call back async handler on failure */
49756 + htcCallbacks.rwCompletionHandler(context, status);
49757 + }
49758 +
49759 + return status;
49760 +}
49761 +
49762 +A_STATUS
49763 +HIFConfigureDevice(HIF_DEVICE *device, HIF_DEVICE_CONFIG_OPCODE opcode,
49764 + void *config, A_UINT32 configLen)
49765 +{
49766 + A_UINT32 count;
49767 +
49768 + switch(opcode) {
49769 + case HIF_DEVICE_GET_MBOX_BLOCK_SIZE:
49770 + ((A_UINT32 *)config)[0] = HIF_MBOX0_BLOCK_SIZE;
49771 + ((A_UINT32 *)config)[1] = HIF_MBOX1_BLOCK_SIZE;
49772 + ((A_UINT32 *)config)[2] = HIF_MBOX2_BLOCK_SIZE;
49773 + ((A_UINT32 *)config)[3] = HIF_MBOX3_BLOCK_SIZE;
49774 + break;
49775 +
49776 + case HIF_DEVICE_GET_MBOX_ADDR:
49777 + for (count = 0; count < 4; count ++) {
49778 + ((A_UINT32 *)config)[count] = HIF_MBOX_START_ADDR(count);
49779 + }
49780 + break;
49781 + case HIF_DEVICE_GET_IRQ_PROC_MODE:
49782 + /* the SDIO stack allows the interrupts to be processed either way, ASYNC or SYNC */
49783 + *((HIF_DEVICE_IRQ_PROCESSING_MODE *)config) = HIF_DEVICE_IRQ_ASYNC_SYNC;
49784 + break;
49785 + default:
49786 + AR_DEBUG_PRINTF(ATH_DEBUG_WARN,
49787 + ("Unsupported configuration opcode: %d\n", opcode));
49788 + return A_ERROR;
49789 + }
49790 +
49791 + return A_OK;
49792 +}
49793 +
49794 +void
49795 +HIFShutDownDevice(HIF_DEVICE *device)
49796 +{
49797 + A_UINT8 data;
49798 + A_UINT32 count;
49799 + SDIO_STATUS status;
49800 + SDCONFIG_BUS_MODE_DATA busSettings;
49801 + SDCONFIG_FUNC_ENABLE_DISABLE_DATA fData;
49802 +
49803 + if (device != NULL) {
49804 + DBG_ASSERT(device->handle != NULL);
49805 +
49806 + /* Remove the allocated current if any */
49807 + status = SDLIB_IssueConfig(device->handle,
49808 + SDCONFIG_FUNC_FREE_SLOT_CURRENT, NULL, 0);
49809 + DBG_ASSERT(SDIO_SUCCESS(status));
49810 +
49811 + /* Disable the card */
49812 + fData.EnableFlags = SDCONFIG_DISABLE_FUNC;
49813 + fData.TimeOut = 1;
49814 + status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_ENABLE_DISABLE,
49815 + &fData, sizeof(fData));
49816 + DBG_ASSERT(SDIO_SUCCESS(status));
49817 +
49818 + /* Perform a soft I/O reset */
49819 + data = SDIO_IO_RESET;
49820 + status = SDLIB_IssueCMD52(device->handle, 0, SDIO_IO_ABORT_REG,
49821 + &data, 1, 1);
49822 + DBG_ASSERT(SDIO_SUCCESS(status));
49823 +
49824 + /*
49825 + * WAR - Codetelligence driver does not seem to shutdown correctly in 1
49826 + * bit mode. By default it configures the HC in the 4 bit. Its later in
49827 + * our driver that we switch to 1 bit mode. If we try to shutdown, the
49828 + * driver hangs so we revert to 4 bit mode, to be transparent to the
49829 + * underlying bus driver.
49830 + */
49831 + if (onebitmode) {
49832 + ZERO_OBJECT(busSettings);
49833 + busSettings.BusModeFlags = SDDEVICE_GET_BUSMODE_FLAGS(device->handle);
49834 + SDCONFIG_SET_BUS_WIDTH(busSettings.BusModeFlags,
49835 + SDCONFIG_BUS_WIDTH_4_BIT);
49836 +
49837 + /* Issue config request to change the bus width to 4 bit */
49838 + status = SDLIB_IssueConfig(device->handle, SDCONFIG_BUS_MODE_CTRL,
49839 + &busSettings,
49840 + sizeof(SDCONFIG_BUS_MODE_DATA));
49841 + DBG_ASSERT(SDIO_SUCCESS(status));
49842 + }
49843 +
49844 + /* Free the bus requests */
49845 + for (count = 0; count < BUS_REQUEST_MAX_NUM; count ++) {
49846 + SDDeviceFreeRequest(device->handle, busRequest[count].request);
49847 + }
49848 + /* Clean up the queue */
49849 + s_busRequestFreeQueue = NULL;
49850 + } else {
49851 + /* since we are unloading the driver anyways, reset all cards in case the SDIO card
49852 + * is externally powered and we are unloading the SDIO stack. This avoids the problem when
49853 + * the SDIO stack is reloaded and attempts are made to re-enumerate a card that is already
49854 + * enumerated */
49855 + ResetAllCards();
49856 + /* Unregister with bus driver core */
49857 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
49858 + ("Unregistering with the bus driver\n"));
49859 + status = SDIO_UnregisterFunction(&FunctionContext.function);
49860 + DBG_ASSERT(SDIO_SUCCESS(status));
49861 + }
49862 +}
49863 +
49864 +void
49865 +hifRWCompletionHandler(SDREQUEST *request)
49866 +{
49867 + A_STATUS status;
49868 + void *context;
49869 + BUS_REQUEST *busrequest;
49870 +
49871 + if (SDIO_SUCCESS(request->Status)) {
49872 + status = A_OK;
49873 + } else {
49874 + status = A_ERROR;
49875 + }
49876 +
49877 + DBG_ASSERT(status == A_OK);
49878 + busrequest = (BUS_REQUEST *) request->pCompleteContext;
49879 + context = (void *) busrequest->context;
49880 + /* free the request before calling the callback, in case the
49881 + * callback submits another request, this guarantees that
49882 + * there is at least 1 free request available everytime the callback
49883 + * is invoked */
49884 + hifFreeBusRequest(busrequest);
49885 + htcCallbacks.rwCompletionHandler(context, status);
49886 +}
49887 +
49888 +void
49889 +hifIRQHandler(void *context)
49890 +{
49891 + A_STATUS status;
49892 + HIF_DEVICE *device;
49893 +
49894 + device = (HIF_DEVICE *)context;
49895 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
49896 + status = htcCallbacks.dsrHandler(device->htc_handle);
49897 + DBG_ASSERT(status == A_OK);
49898 +}
49899 +
49900 +BOOL
49901 +hifDeviceInserted(SDFUNCTION *function, SDDEVICE *handle)
49902 +{
49903 + BOOL enabled;
49904 + A_UINT8 data;
49905 + A_UINT32 count;
49906 + HIF_DEVICE *device;
49907 + SDIO_STATUS status;
49908 + A_UINT16 maxBlocks;
49909 + A_UINT16 maxBlockSize;
49910 + SDCONFIG_BUS_MODE_DATA busSettings;
49911 + SDCONFIG_FUNC_ENABLE_DISABLE_DATA fData;
49912 + TARGET_FUNCTION_CONTEXT *functionContext;
49913 + SDCONFIG_FUNC_SLOT_CURRENT_DATA slotCurrent;
49914 + SD_BUSCLOCK_RATE currentBusClock;
49915 +
49916 + DBG_ASSERT(function != NULL);
49917 + DBG_ASSERT(handle != NULL);
49918 +
49919 + device = addHifDevice(handle);
49920 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device: %p\n", device));
49921 + functionContext = (TARGET_FUNCTION_CONTEXT *)function->pContext;
49922 +
49923 + /*
49924 + * Issue commands to get the manufacturer ID and stuff and compare it
49925 + * against the rev Id derived from the ID registered during the
49926 + * initialization process. Report the device only in the case there
49927 + * is a match. In the case od SDIO, the bus driver has already queried
49928 + * these details so we just need to use their data structures to get the
49929 + * relevant values. Infact, the driver has already matched it against
49930 + * the Ids that we registered with it so we dont need to the step here.
49931 + */
49932 +
49933 + /* Configure the SDIO Bus Width */
49934 + if (onebitmode) {
49935 + data = SDIO_BUS_WIDTH_1_BIT;
49936 + status = SDLIB_IssueCMD52(handle, 0, SDIO_BUS_IF_REG, &data, 1, 1);
49937 + if (!SDIO_SUCCESS(status)) {
49938 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
49939 + ("Unable to set the bus width to 1 bit\n"));
49940 + return FALSE;
49941 + }
49942 + }
49943 +
49944 + /* Get current bus flags */
49945 + ZERO_OBJECT(busSettings);
49946 +
49947 + busSettings.BusModeFlags = SDDEVICE_GET_BUSMODE_FLAGS(handle);
49948 + if (onebitmode) {
49949 + SDCONFIG_SET_BUS_WIDTH(busSettings.BusModeFlags,
49950 + SDCONFIG_BUS_WIDTH_1_BIT);
49951 + }
49952 +
49953 + /* get the current operating clock, the bus driver sets us up based
49954 + * on what our CIS reports and what the host controller can handle
49955 + * we can use this to determine whether we want to drop our clock rate
49956 + * down */
49957 + currentBusClock = SDDEVICE_GET_OPER_CLOCK(handle);
49958 + busSettings.ClockRate = currentBusClock;
49959 +
49960 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
49961 + ("HIF currently running at: %d \n",currentBusClock));
49962 +
49963 + /* see if HIF wants to run at a lower clock speed, we may already be
49964 + * at that lower clock speed */
49965 + if (currentBusClock > (SDIO_CLOCK_FREQUENCY_DEFAULT >> busspeedlow)) {
49966 + busSettings.ClockRate = SDIO_CLOCK_FREQUENCY_DEFAULT >> busspeedlow;
49967 + AR_DEBUG_PRINTF(ATH_DEBUG_WARN,
49968 + ("HIF overriding clock to %d \n",busSettings.ClockRate));
49969 + }
49970 +
49971 + /* Issue config request to override clock rate */
49972 + status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_CHANGE_BUS_MODE, &busSettings,
49973 + sizeof(SDCONFIG_BUS_MODE_DATA));
49974 + if (!SDIO_SUCCESS(status)) {
49975 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
49976 + ("Unable to configure the host clock\n"));
49977 + return FALSE;
49978 + } else {
49979 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
49980 + ("Configured clock: %d, Maximum clock: %d\n",
49981 + busSettings.ActualClockRate,
49982 + SDDEVICE_GET_MAX_CLOCK(handle)));
49983 + }
49984 +
49985 + /*
49986 + * Check if the target supports block mode. This result of this check
49987 + * can be used to implement the HIFReadWrite API.
49988 + */
49989 + if (SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(handle)) {
49990 + /* Limit block size to operational block limit or card function
49991 + capability */
49992 + maxBlockSize = min(SDDEVICE_GET_OPER_BLOCK_LEN(handle),
49993 + SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(handle));
49994 +
49995 + /* check if the card support multi-block transfers */
49996 + if (!(SDDEVICE_GET_SDIOCARD_CAPS(handle) & SDIO_CAPS_MULTI_BLOCK)) {
49997 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Byte basis only\n"));
49998 +
49999 + /* Limit block size to max byte basis */
50000 + maxBlockSize = min(maxBlockSize,
50001 + (A_UINT16)SDIO_MAX_LENGTH_BYTE_BASIS);
50002 + maxBlocks = 1;
50003 + } else {
50004 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Multi-block capable\n"));
50005 + maxBlocks = SDDEVICE_GET_OPER_BLOCKS(handle);
50006 + status = SDLIB_SetFunctionBlockSize(handle, HIF_MBOX_BLOCK_SIZE);
50007 + if (!SDIO_SUCCESS(status)) {
50008 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
50009 + ("Failed to set block size. Err:%d\n", status));
50010 + return FALSE;
50011 + }
50012 + }
50013 +
50014 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
50015 + ("Bytes Per Block: %d bytes, Block Count:%d \n",
50016 + maxBlockSize, maxBlocks));
50017 + } else {
50018 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
50019 + ("Function does not support Block Mode!\n"));
50020 + return FALSE;
50021 + }
50022 +
50023 + /* Allocate the slot current */
50024 + status = SDLIB_GetDefaultOpCurrent(handle, &slotCurrent.SlotCurrent);
50025 + if (SDIO_SUCCESS(status)) {
50026 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Allocating Slot current: %d mA\n",
50027 + slotCurrent.SlotCurrent));
50028 + status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_ALLOC_SLOT_CURRENT,
50029 + &slotCurrent, sizeof(slotCurrent));
50030 + if (!SDIO_SUCCESS(status)) {
50031 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
50032 + ("Failed to allocate slot current %d\n", status));
50033 + return FALSE;
50034 + }
50035 + }
50036 +
50037 + /* Enable the dragon function */
50038 + count = 0;
50039 + enabled = FALSE;
50040 + fData.TimeOut = 1;
50041 + fData.EnableFlags = SDCONFIG_ENABLE_FUNC;
50042 + while ((count++ < SDWLAN_ENABLE_DISABLE_TIMEOUT) && !enabled)
50043 + {
50044 + /* Enable dragon */
50045 + status = SDLIB_IssueConfig(handle, SDCONFIG_FUNC_ENABLE_DISABLE,
50046 + &fData, sizeof(fData));
50047 + if (!SDIO_SUCCESS(status)) {
50048 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
50049 + ("Attempting to enable the card again\n"));
50050 + continue;
50051 + }
50052 +
50053 + /* Mark the status as enabled */
50054 + enabled = TRUE;
50055 + }
50056 +
50057 + /* Check if we were succesful in enabling the target */
50058 + if (!enabled) {
50059 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR,
50060 + ("Failed to communicate with the target\n"));
50061 + return FALSE;
50062 + }
50063 +
50064 + /* Allocate the bus requests to be used later */
50065 + A_MEMZERO(busRequest, sizeof(busRequest));
50066 + for (count = 0; count < BUS_REQUEST_MAX_NUM; count ++) {
50067 + if ((busRequest[count].request = SDDeviceAllocRequest(handle)) == NULL){
50068 + AR_DEBUG_PRINTF(ATH_DEBUG_ERROR, ("Unable to allocate memory\n"));
50069 + /* TODO: Free the memory that has already been allocated */
50070 + return FALSE;
50071 + }
50072 + hifFreeBusRequest(&busRequest[count]);
50073 +
50074 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
50075 + ("0x%08x = busRequest[%d].request = 0x%08x\n",
50076 + (unsigned int) &busRequest[count], count,
50077 + (unsigned int) busRequest[count].request));
50078 + }
50079 +
50080 + /* Schedule a worker to handle device inserted, this is a temporary workaround
50081 + * to fix a deadlock if the device fails to intialize in the insertion handler
50082 + * The failure causes the instance to shutdown the HIF layer and unregister the
50083 + * function driver within the busdriver probe context which can deadlock
50084 + *
50085 + * NOTE: we cannot use the default work queue because that would block
50086 + * SD bus request processing for all synchronous I/O. We must use a kernel
50087 + * thread that is creating using the helper library.
50088 + * */
50089 +
50090 + if (SDIO_SUCCESS(SDLIB_OSCreateHelper(&device->insert_helper,
50091 + insert_helper_func,
50092 + device))) {
50093 + device->helper_started = TRUE;
50094 + }
50095 +
50096 + return TRUE;
50097 +}
50098 +
50099 +static THREAD_RETURN insert_helper_func(POSKERNEL_HELPER pHelper)
50100 +{
50101 +
50102 + /*
50103 + * Adding a wait of around a second before we issue the very first
50104 + * command to dragon. During the process of loading/unloading the
50105 + * driver repeatedly it was observed that we get a data timeout
50106 + * while accessing function 1 registers in the chip. The theory at
50107 + * this point is that some initialization delay in dragon is
50108 + * causing the SDIO state in dragon core to be not ready even after
50109 + * the ready bit indicates that function 1 is ready. Accomodating
50110 + * for this behavior by adding some delay in the driver before it
50111 + * issues the first command after switching on dragon. Need to
50112 + * investigate this a bit more - TODO
50113 + */
50114 +
50115 + A_MDELAY(1000);
50116 + /* Inform HTC */
50117 + if ((htcCallbacks.deviceInsertedHandler(SD_GET_OS_HELPER_CONTEXT(pHelper))) != A_OK) {
50118 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device rejected\n"));
50119 + }
50120 +
50121 + return 0;
50122 +}
50123 +
50124 +void
50125 +HIFAckInterrupt(HIF_DEVICE *device)
50126 +{
50127 + SDIO_STATUS status;
50128 + DBG_ASSERT(device != NULL);
50129 + DBG_ASSERT(device->handle != NULL);
50130 +
50131 + /* Acknowledge our function IRQ */
50132 + status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_ACK_IRQ,
50133 + NULL, 0);
50134 + DBG_ASSERT(SDIO_SUCCESS(status));
50135 +}
50136 +
50137 +void
50138 +HIFUnMaskInterrupt(HIF_DEVICE *device)
50139 +{
50140 + SDIO_STATUS status;
50141 +
50142 + DBG_ASSERT(device != NULL);
50143 + DBG_ASSERT(device->handle != NULL);
50144 +
50145 + /* Register the IRQ Handler */
50146 + SDDEVICE_SET_IRQ_HANDLER(device->handle, hifIRQHandler, device);
50147 +
50148 + /* Unmask our function IRQ */
50149 + status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_UNMASK_IRQ,
50150 + NULL, 0);
50151 + DBG_ASSERT(SDIO_SUCCESS(status));
50152 +}
50153 +
50154 +void HIFMaskInterrupt(HIF_DEVICE *device)
50155 +{
50156 + SDIO_STATUS status;
50157 + DBG_ASSERT(device != NULL);
50158 + DBG_ASSERT(device->handle != NULL);
50159 +
50160 + /* Mask our function IRQ */
50161 + status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_MASK_IRQ,
50162 + NULL, 0);
50163 + DBG_ASSERT(SDIO_SUCCESS(status));
50164 +
50165 + /* Unregister the IRQ Handler */
50166 + SDDEVICE_SET_IRQ_HANDLER(device->handle, NULL, NULL);
50167 +}
50168 +
50169 +static BUS_REQUEST *hifAllocateBusRequest(void)
50170 +{
50171 + BUS_REQUEST *busrequest;
50172 +
50173 + /* Acquire lock */
50174 + CriticalSectionAcquire(&lock);
50175 +
50176 + /* Remove first in list */
50177 + if((busrequest = s_busRequestFreeQueue) != NULL)
50178 + {
50179 + s_busRequestFreeQueue = busrequest->next;
50180 + }
50181 +
50182 + /* Release lock */
50183 + CriticalSectionRelease(&lock);
50184 +
50185 + return busrequest;
50186 +}
50187 +
50188 +static void
50189 +hifFreeBusRequest(BUS_REQUEST *busrequest)
50190 +{
50191 + DBG_ASSERT(busrequest != NULL);
50192 +
50193 + /* Acquire lock */
50194 + CriticalSectionAcquire(&lock);
50195 +
50196 + /* Insert first in list */
50197 + busrequest->next = s_busRequestFreeQueue;
50198 + s_busRequestFreeQueue = busrequest;
50199 +
50200 + /* Release lock */
50201 + CriticalSectionRelease(&lock);
50202 +}
50203 +
50204 +void
50205 +hifDeviceRemoved(SDFUNCTION *function, SDDEVICE *handle)
50206 +{
50207 + A_STATUS status;
50208 + HIF_DEVICE *device;
50209 + DBG_ASSERT(function != NULL);
50210 + DBG_ASSERT(handle != NULL);
50211 +
50212 + device = getHifDevice(handle);
50213 + status = htcCallbacks.deviceRemovedHandler(device->htc_handle, A_OK);
50214 +
50215 + /* cleanup the helper thread */
50216 + if (device->helper_started) {
50217 + SDLIB_OSDeleteHelper(&device->insert_helper);
50218 + device->helper_started = FALSE;
50219 + }
50220 +
50221 + delHifDevice(handle);
50222 + DBG_ASSERT(status == A_OK);
50223 +}
50224 +
50225 +HIF_DEVICE *
50226 +addHifDevice(SDDEVICE *handle)
50227 +{
50228 + DBG_ASSERT(handle != NULL);
50229 + hifDevice[0].handle = handle;
50230 + return &hifDevice[0];
50231 +}
50232 +
50233 +HIF_DEVICE *
50234 +getHifDevice(SDDEVICE *handle)
50235 +{
50236 + DBG_ASSERT(handle != NULL);
50237 + return &hifDevice[0];
50238 +}
50239 +
50240 +void
50241 +delHifDevice(SDDEVICE *handle)
50242 +{
50243 + DBG_ASSERT(handle != NULL);
50244 + hifDevice[0].handle = NULL;
50245 +}
50246 +
50247 +struct device*
50248 +HIFGetOSDevice(HIF_DEVICE *device)
50249 +{
50250 + return &device->handle->Device.dev;
50251 +}
50252 +
50253 +static void ResetAllCards(void)
50254 +{
50255 + UINT8 data;
50256 + SDIO_STATUS status;
50257 + int i;
50258 +
50259 + data = SDIO_IO_RESET;
50260 +
50261 + /* set the I/O CARD reset bit:
50262 + * NOTE: we are exploiting a "feature" of the SDIO core that resets the core when you
50263 + * set the RES bit in the SDIO_IO_ABORT register. This bit however "normally" resets the
50264 + * I/O functions leaving the SDIO core in the same state (as per SDIO spec).
50265 + * In this design, this reset can be used to reset the SDIO core itself */
50266 + for (i = 0; i < HIF_MAX_DEVICES; i++) {
50267 + if (hifDevice[i].handle != NULL) {
50268 + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE,
50269 + ("Issuing I/O Card reset for instance: %d \n",i));
50270 + /* set the I/O Card reset bit */
50271 + status = SDLIB_IssueCMD52(hifDevice[i].handle,
50272 + 0, /* function 0 space */
50273 + SDIO_IO_ABORT_REG,
50274 + &data,
50275 + 1, /* 1 byte */
50276 + TRUE); /* write */
50277 + }
50278 + }
50279 +
50280 +}
50281 +
50282 +void HIFSetHandle(void *hif_handle, void *handle)
50283 +{
50284 + HIF_DEVICE *device = (HIF_DEVICE *) hif_handle;
50285 +
50286 + device->htc_handle = handle;
50287 +
50288 + return;
50289 +}
50290 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/hif/hif_internal.h
50291 ===================================================================
50292 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
50293 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/hif/hif_internal.h 2008-12-11 22:46:49.000000000 +0100
50294 @@ -0,0 +1,102 @@
50295 +/*
50296 + * @file: hif_internal.h
50297 + *
50298 + * @abstract: internal header file for hif layer
50299 + *
50300 + * @notice: Copyright (c) 2004-2006 Atheros Communications Inc.
50301 + *
50302 + *
50303 + * This program is free software; you can redistribute it and/or modify
50304 + * it under the terms of the GNU General Public License version 2 as
50305 + * published by the Free Software Foundation;
50306 + *
50307 + * Software distributed under the License is distributed on an "AS
50308 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
50309 + * implied. See the License for the specific language governing
50310 + * rights and limitations under the License.
50311 + *
50312 + *
50313 + *
50314 + */
50315 +
50316 +#include <linux/sdio/ctsystem.h>
50317 +#include <linux/sdio/sdio_busdriver.h>
50318 +#include <linux/sdio/_sdio_defs.h>
50319 +#include <linux/sdio/sdio_lib.h>
50320 +#include "a_config.h"
50321 +#include "athdefs.h"
50322 +#include "a_types.h"
50323 +#include "a_osapi.h"
50324 +#include "hif.h"
50325 +
50326 +#define MANUFACTURER_ID_AR6001_BASE 0x100
50327 +#define MANUFACTURER_ID_AR6002_BASE 0x200
50328 +#define FUNCTION_CLASS 0x0
50329 +#define MANUFACTURER_CODE 0x271
50330 +
50331 +#define BUS_REQUEST_MAX_NUM 64
50332 +
50333 +#define SDIO_CLOCK_FREQUENCY_DEFAULT 25000000
50334 +#define SDWLAN_ENABLE_DISABLE_TIMEOUT 20
50335 +#define FLAGS_CARD_ENAB 0x02
50336 +#define FLAGS_CARD_IRQ_UNMSK 0x04
50337 +
50338 +#define HIF_MBOX_BLOCK_SIZE 128
50339 +#define HIF_MBOX_BASE_ADDR 0x800
50340 +#define HIF_MBOX_WIDTH 0x800
50341 +#define HIF_MBOX0_BLOCK_SIZE 1
50342 +#define HIF_MBOX1_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
50343 +#define HIF_MBOX2_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
50344 +#define HIF_MBOX3_BLOCK_SIZE HIF_MBOX_BLOCK_SIZE
50345 +
50346 +#define HIF_MBOX_START_ADDR(mbox) \
50347 + HIF_MBOX_BASE_ADDR + mbox * HIF_MBOX_WIDTH
50348 +
50349 +#define HIF_MBOX_END_ADDR(mbox) \
50350 + HIF_MBOX_START_ADDR(mbox) + HIF_MBOX_WIDTH - 1
50351 +
50352 +struct hif_device {
50353 + SDDEVICE *handle;
50354 + void *htc_handle;
50355 + OSKERNEL_HELPER insert_helper;
50356 + BOOL helper_started;
50357 +};
50358 +
50359 +typedef struct target_function_context {
50360 + SDFUNCTION function; /* function description of the bus driver */
50361 + OS_SEMAPHORE instanceSem; /* instance lock. Unused */
50362 + SDLIST instanceList; /* list of instances. Unused */
50363 +} TARGET_FUNCTION_CONTEXT;
50364 +
50365 +typedef struct bus_request {
50366 + struct bus_request *next;
50367 + SDREQUEST *request;
50368 + void *context;
50369 +} BUS_REQUEST;
50370 +
50371 +BOOL
50372 +hifDeviceInserted(SDFUNCTION *function, SDDEVICE *device);
50373 +
50374 +void
50375 +hifDeviceRemoved(SDFUNCTION *function, SDDEVICE *device);
50376 +
50377 +SDREQUEST *
50378 +hifAllocateDeviceRequest(SDDEVICE *device);
50379 +
50380 +void
50381 +hifFreeDeviceRequest(SDREQUEST *request);
50382 +
50383 +void
50384 +hifRWCompletionHandler(SDREQUEST *request);
50385 +
50386 +void
50387 +hifIRQHandler(void *context);
50388 +
50389 +HIF_DEVICE *
50390 +addHifDevice(SDDEVICE *handle);
50391 +
50392 +HIF_DEVICE *
50393 +getHifDevice(SDDEVICE *handle);
50394 +
50395 +void
50396 +delHifDevice(SDDEVICE *handle);
50397 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/ar6k.c
50398 ===================================================================
50399 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
50400 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/ar6k.c 2008-12-11 22:46:49.000000000 +0100
50401 @@ -0,0 +1,991 @@
50402 +/*
50403 + * AR6K device layer that handles register level I/O
50404 + *
50405 + * Copyright (c) 2007 Atheros Communications Inc.
50406 + * All rights reserved.
50407 + *
50408 + *
50409 + * This program is free software; you can redistribute it and/or modify
50410 + * it under the terms of the GNU General Public License version 2 as
50411 + * published by the Free Software Foundation;
50412 + *
50413 + * Software distributed under the License is distributed on an "AS
50414 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
50415 + * implied. See the License for the specific language governing
50416 + * rights and limitations under the License.
50417 + *
50418 + *
50419 + *
50420 + */
50421 +#include "a_config.h"
50422 +#include "athdefs.h"
50423 +#include "a_types.h"
50424 +#include "AR6Khwreg.h"
50425 +#include "a_osapi.h"
50426 +#include "a_debug.h"
50427 +#include "hif.h"
50428 +#include "htc_packet.h"
50429 +#include "ar6k.h"
50430 +
50431 +#define MAILBOX_FOR_BLOCK_SIZE 1
50432 +
50433 +extern A_UINT32 resetok;
50434 +
50435 +static A_STATUS DevEnableInterrupts(AR6K_DEVICE *pDev);
50436 +static A_STATUS DevDisableInterrupts(AR6K_DEVICE *pDev);
50437 +
50438 +#define LOCK_AR6K(p) A_MUTEX_LOCK(&(p)->Lock);
50439 +#define UNLOCK_AR6K(p) A_MUTEX_UNLOCK(&(p)->Lock);
50440 +
50441 +void AR6KFreeIOPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket)
50442 +{
50443 + LOCK_AR6K(pDev);
50444 + HTC_PACKET_ENQUEUE(&pDev->RegisterIOList,pPacket);
50445 + UNLOCK_AR6K(pDev);
50446 +}
50447 +
50448 +HTC_PACKET *AR6KAllocIOPacket(AR6K_DEVICE *pDev)
50449 +{
50450 + HTC_PACKET *pPacket;
50451 +
50452 + LOCK_AR6K(pDev);
50453 + pPacket = HTC_PACKET_DEQUEUE(&pDev->RegisterIOList);
50454 + UNLOCK_AR6K(pDev);
50455 +
50456 + return pPacket;
50457 +}
50458 +
50459 +A_STATUS DevSetup(AR6K_DEVICE *pDev)
50460 +{
50461 + A_UINT32 mailboxaddrs[AR6K_MAILBOXES];
50462 + A_UINT32 blocksizes[AR6K_MAILBOXES];
50463 + A_STATUS status = A_OK;
50464 + int i;
50465 +
50466 + AR_DEBUG_ASSERT(AR6K_IRQ_PROC_REGS_SIZE == 16);
50467 + AR_DEBUG_ASSERT(AR6K_IRQ_ENABLE_REGS_SIZE == 4);
50468 +
50469 + do {
50470 + /* give a handle to HIF for this target */
50471 + HIFSetHandle(pDev->HIFDevice, (void *)pDev);
50472 + /* initialize our free list of IO packets */
50473 + INIT_HTC_PACKET_QUEUE(&pDev->RegisterIOList);
50474 + A_MUTEX_INIT(&pDev->Lock);
50475 +
50476 + /* get the addresses for all 4 mailboxes */
50477 + status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_ADDR,
50478 + mailboxaddrs, sizeof(mailboxaddrs));
50479 +
50480 + if (status != A_OK) {
50481 + AR_DEBUG_ASSERT(FALSE);
50482 + break;
50483 + }
50484 +
50485 + /* carve up register I/O packets (these are for ASYNC register I/O ) */
50486 + for (i = 0; i < AR6K_MAX_REG_IO_BUFFERS; i++) {
50487 + HTC_PACKET *pIOPacket;
50488 + pIOPacket = &pDev->RegIOBuffers[i].HtcPacket;
50489 + SET_HTC_PACKET_INFO_RX_REFILL(pIOPacket,
50490 + pDev,
50491 + pDev->RegIOBuffers[i].Buffer,
50492 + AR6K_REG_IO_BUFFER_SIZE,
50493 + 0); /* don't care */
50494 + AR6KFreeIOPacket(pDev,pIOPacket);
50495 + }
50496 +
50497 + /* get the address of the mailbox we are using */
50498 + pDev->MailboxAddress = mailboxaddrs[HTC_MAILBOX];
50499 +
50500 + /* get the block sizes */
50501 + status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
50502 + blocksizes, sizeof(blocksizes));
50503 +
50504 + if (status != A_OK) {
50505 + AR_DEBUG_ASSERT(FALSE);
50506 + break;
50507 + }
50508 +
50509 + /* note: we actually get the block size of a mailbox other than 0, for SDIO the block
50510 + * size on mailbox 0 is artificially set to 1. So we use the block size that is set
50511 + * for the other 3 mailboxes */
50512 + pDev->BlockSize = blocksizes[MAILBOX_FOR_BLOCK_SIZE];
50513 + /* must be a power of 2 */
50514 + AR_DEBUG_ASSERT((pDev->BlockSize & (pDev->BlockSize - 1)) == 0);
50515 +
50516 + /* assemble mask, used for padding to a block */
50517 + pDev->BlockMask = pDev->BlockSize - 1;
50518 +
50519 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("BlockSize: %d, MailboxAddress:0x%X \n",
50520 + pDev->BlockSize, pDev->MailboxAddress));
50521 +
50522 + pDev->GetPendingEventsFunc = NULL;
50523 + /* see if the HIF layer implements the get pending events function */
50524 + HIFConfigureDevice(pDev->HIFDevice,
50525 + HIF_DEVICE_GET_PENDING_EVENTS_FUNC,
50526 + &pDev->GetPendingEventsFunc,
50527 + sizeof(pDev->GetPendingEventsFunc));
50528 +
50529 + /* assume we can process HIF interrupt events asynchronously */
50530 + pDev->HifIRQProcessingMode = HIF_DEVICE_IRQ_ASYNC_SYNC;
50531 +
50532 + /* see if the HIF layer overrides this assumption */
50533 + HIFConfigureDevice(pDev->HIFDevice,
50534 + HIF_DEVICE_GET_IRQ_PROC_MODE,
50535 + &pDev->HifIRQProcessingMode,
50536 + sizeof(pDev->HifIRQProcessingMode));
50537 +
50538 + switch (pDev->HifIRQProcessingMode) {
50539 + case HIF_DEVICE_IRQ_SYNC_ONLY:
50540 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF Interrupt processing is SYNC ONLY\n"));
50541 + break;
50542 + case HIF_DEVICE_IRQ_ASYNC_SYNC:
50543 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF Interrupt processing is ASYNC and SYNC\n"));
50544 + break;
50545 + default:
50546 + AR_DEBUG_ASSERT(FALSE);
50547 + }
50548 +
50549 + pDev->HifMaskUmaskRecvEvent = NULL;
50550 +
50551 + /* see if the HIF layer implements the mask/unmask recv events function */
50552 + HIFConfigureDevice(pDev->HIFDevice,
50553 + HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC,
50554 + &pDev->HifMaskUmaskRecvEvent,
50555 + sizeof(pDev->HifMaskUmaskRecvEvent));
50556 +
50557 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("HIF special overrides : 0x%X , 0x%X\n",
50558 + (A_UINT32)pDev->GetPendingEventsFunc, (A_UINT32)pDev->HifMaskUmaskRecvEvent));
50559 +
50560 + status = DevDisableInterrupts(pDev);
50561 +
50562 + } while (FALSE);
50563 +
50564 + if (A_FAILED(status)) {
50565 + /* make sure handle is cleared */
50566 + HIFSetHandle(pDev->HIFDevice, NULL);
50567 + }
50568 +
50569 + return status;
50570 +
50571 +}
50572 +
50573 +static A_STATUS DevEnableInterrupts(AR6K_DEVICE *pDev)
50574 +{
50575 + A_STATUS status;
50576 + AR6K_IRQ_ENABLE_REGISTERS regs;
50577 +
50578 + LOCK_AR6K(pDev);
50579 +
50580 + /* Enable all the interrupts except for the dragon interrupt */
50581 + pDev->IrqEnableRegisters.int_status_enable = INT_STATUS_ENABLE_ERROR_SET(0x01) |
50582 + INT_STATUS_ENABLE_CPU_SET(0x01) |
50583 + INT_STATUS_ENABLE_COUNTER_SET(0x01);
50584 +
50585 + if (NULL == pDev->GetPendingEventsFunc) {
50586 + pDev->IrqEnableRegisters.int_status_enable |= INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
50587 + } else {
50588 + /* The HIF layer provided us with a pending events function which means that
50589 + * the detection of pending mbox messages is handled in the HIF layer.
50590 + * This is the case for the SPI2 interface.
50591 + * In the normal case we enable MBOX interrupts, for the case
50592 + * with HIFs that offer this mechanism, we keep these interrupts
50593 + * masked */
50594 + pDev->IrqEnableRegisters.int_status_enable &= ~INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
50595 + }
50596 +
50597 +
50598 + /* Set up the CPU Interrupt Status Register */
50599 + pDev->IrqEnableRegisters.cpu_int_status_enable = CPU_INT_STATUS_ENABLE_BIT_SET(0x00);
50600 +
50601 + /* Set up the Error Interrupt Status Register */
50602 + pDev->IrqEnableRegisters.error_status_enable =
50603 + ERROR_STATUS_ENABLE_RX_UNDERFLOW_SET(0x01) |
50604 + ERROR_STATUS_ENABLE_TX_OVERFLOW_SET(0x01);
50605 +
50606 + /* Set up the Counter Interrupt Status Register (only for debug interrupt to catch fatal errors) */
50607 + pDev->IrqEnableRegisters.counter_int_status_enable =
50608 + COUNTER_INT_STATUS_ENABLE_BIT_SET(AR6K_TARGET_DEBUG_INTR_MASK);
50609 +
50610 + /* copy into our temp area */
50611 + A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
50612 +
50613 + UNLOCK_AR6K(pDev);
50614 +
50615 + /* always synchronous */
50616 + status = HIFReadWrite(pDev->HIFDevice,
50617 + INT_STATUS_ENABLE_ADDRESS,
50618 + &regs.int_status_enable,
50619 + AR6K_IRQ_ENABLE_REGS_SIZE,
50620 + HIF_WR_SYNC_BYTE_INC,
50621 + NULL);
50622 +
50623 + if (status != A_OK) {
50624 + /* Can't write it for some reason */
50625 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
50626 + ("Failed to update interrupt control registers err: %d\n", status));
50627 +
50628 + }
50629 +
50630 + return status;
50631 +}
50632 +
50633 +static A_STATUS DevDisableInterrupts(AR6K_DEVICE *pDev)
50634 +{
50635 + AR6K_IRQ_ENABLE_REGISTERS regs;
50636 +
50637 + LOCK_AR6K(pDev);
50638 + /* Disable all interrupts */
50639 + pDev->IrqEnableRegisters.int_status_enable = 0;
50640 + pDev->IrqEnableRegisters.cpu_int_status_enable = 0;
50641 + pDev->IrqEnableRegisters.error_status_enable = 0;
50642 + pDev->IrqEnableRegisters.counter_int_status_enable = 0;
50643 + /* copy into our temp area */
50644 + A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
50645 +
50646 + UNLOCK_AR6K(pDev);
50647 +
50648 + /* always synchronous */
50649 + return HIFReadWrite(pDev->HIFDevice,
50650 + INT_STATUS_ENABLE_ADDRESS,
50651 + &regs.int_status_enable,
50652 + AR6K_IRQ_ENABLE_REGS_SIZE,
50653 + HIF_WR_SYNC_BYTE_INC,
50654 + NULL);
50655 +}
50656 +
50657 +/* enable device interrupts */
50658 +A_STATUS DevUnmaskInterrupts(AR6K_DEVICE *pDev)
50659 +{
50660 + /* Unmask the host controller interrupts */
50661 + HIFUnMaskInterrupt(pDev->HIFDevice);
50662 +
50663 + return DevEnableInterrupts(pDev);
50664 +}
50665 +
50666 +/* disable all device interrupts */
50667 +A_STATUS DevMaskInterrupts(AR6K_DEVICE *pDev)
50668 +{
50669 + A_STATUS status;
50670 +
50671 + status = DevDisableInterrupts(pDev);
50672 +
50673 + if (A_SUCCESS(status)) {
50674 + /* Disable the interrupt at the HIF layer */
50675 + HIFMaskInterrupt(pDev->HIFDevice);
50676 + }
50677 +
50678 + return status;
50679 +}
50680 +
50681 +/* callback when our fetch to enable/disable completes */
50682 +static void DevDoEnableDisableRecvAsyncHandler(void *Context, HTC_PACKET *pPacket)
50683 +{
50684 + AR6K_DEVICE *pDev = (AR6K_DEVICE *)Context;
50685 +
50686 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevDoEnableDisableRecvAsyncHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
50687 +
50688 + if (A_FAILED(pPacket->Status)) {
50689 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
50690 + (" Failed to disable receiver, status:%d \n", pPacket->Status));
50691 + }
50692 + /* free this IO packet */
50693 + AR6KFreeIOPacket(pDev,pPacket);
50694 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevDoEnableDisableRecvAsyncHandler \n"));
50695 +}
50696 +
50697 +/* disable packet reception (used in case the host runs out of buffers)
50698 + * this is the "override" method when the HIF reports another methods to
50699 + * disable recv events */
50700 +static A_STATUS DevDoEnableDisableRecvOverride(AR6K_DEVICE *pDev, A_BOOL EnableRecv, A_BOOL AsyncMode)
50701 +{
50702 + A_STATUS status = A_OK;
50703 + HTC_PACKET *pIOPacket = NULL;
50704 +
50705 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("DevDoEnableDisableRecvOverride: Enable:%d Mode:%d\n",
50706 + EnableRecv,AsyncMode));
50707 +
50708 + do {
50709 +
50710 + if (AsyncMode) {
50711 +
50712 + pIOPacket = AR6KAllocIOPacket(pDev);
50713 +
50714 + if (NULL == pIOPacket) {
50715 + status = A_NO_MEMORY;
50716 + AR_DEBUG_ASSERT(FALSE);
50717 + break;
50718 + }
50719 +
50720 + /* stick in our completion routine when the I/O operation completes */
50721 + pIOPacket->Completion = DevDoEnableDisableRecvAsyncHandler;
50722 + pIOPacket->pContext = pDev;
50723 +
50724 + /* call the HIF layer override and do this asynchronously */
50725 + status = pDev->HifMaskUmaskRecvEvent(pDev->HIFDevice,
50726 + EnableRecv ? HIF_UNMASK_RECV : HIF_MASK_RECV,
50727 + pIOPacket);
50728 + break;
50729 + }
50730 +
50731 + /* if we get here we are doing it synchronously */
50732 + status = pDev->HifMaskUmaskRecvEvent(pDev->HIFDevice,
50733 + EnableRecv ? HIF_UNMASK_RECV : HIF_MASK_RECV,
50734 + NULL);
50735 +
50736 + } while (FALSE);
50737 +
50738 + if (A_FAILED(status) && (pIOPacket != NULL)) {
50739 + AR6KFreeIOPacket(pDev,pIOPacket);
50740 + }
50741 +
50742 + return status;
50743 +}
50744 +
50745 +/* disable packet reception (used in case the host runs out of buffers)
50746 + * this is the "normal" method using the interrupt enable registers through
50747 + * the host I/F */
50748 +static A_STATUS DevDoEnableDisableRecvNormal(AR6K_DEVICE *pDev, A_BOOL EnableRecv, A_BOOL AsyncMode)
50749 +{
50750 + A_STATUS status = A_OK;
50751 + HTC_PACKET *pIOPacket = NULL;
50752 + AR6K_IRQ_ENABLE_REGISTERS regs;
50753 +
50754 + /* take the lock to protect interrupt enable shadows */
50755 + LOCK_AR6K(pDev);
50756 +
50757 + if (EnableRecv) {
50758 + pDev->IrqEnableRegisters.int_status_enable |= INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
50759 + } else {
50760 + pDev->IrqEnableRegisters.int_status_enable &= ~INT_STATUS_ENABLE_MBOX_DATA_SET(0x01);
50761 + }
50762 +
50763 + /* copy into our temp area */
50764 + A_MEMCPY(&regs,&pDev->IrqEnableRegisters,AR6K_IRQ_ENABLE_REGS_SIZE);
50765 + UNLOCK_AR6K(pDev);
50766 +
50767 + do {
50768 +
50769 + if (AsyncMode) {
50770 +
50771 + pIOPacket = AR6KAllocIOPacket(pDev);
50772 +
50773 + if (NULL == pIOPacket) {
50774 + status = A_NO_MEMORY;
50775 + AR_DEBUG_ASSERT(FALSE);
50776 + break;
50777 + }
50778 +
50779 + /* copy values to write to our async I/O buffer */
50780 + A_MEMCPY(pIOPacket->pBuffer,&regs,AR6K_IRQ_ENABLE_REGS_SIZE);
50781 +
50782 + /* stick in our completion routine when the I/O operation completes */
50783 + pIOPacket->Completion = DevDoEnableDisableRecvAsyncHandler;
50784 + pIOPacket->pContext = pDev;
50785 +
50786 + /* write it out asynchronously */
50787 + HIFReadWrite(pDev->HIFDevice,
50788 + INT_STATUS_ENABLE_ADDRESS,
50789 + pIOPacket->pBuffer,
50790 + AR6K_IRQ_ENABLE_REGS_SIZE,
50791 + HIF_WR_ASYNC_BYTE_INC,
50792 + pIOPacket);
50793 + break;
50794 + }
50795 +
50796 + /* if we get here we are doing it synchronously */
50797 +
50798 + status = HIFReadWrite(pDev->HIFDevice,
50799 + INT_STATUS_ENABLE_ADDRESS,
50800 + &regs.int_status_enable,
50801 + AR6K_IRQ_ENABLE_REGS_SIZE,
50802 + HIF_WR_SYNC_BYTE_INC,
50803 + NULL);
50804 +
50805 + } while (FALSE);
50806 +
50807 + if (A_FAILED(status) && (pIOPacket != NULL)) {
50808 + AR6KFreeIOPacket(pDev,pIOPacket);
50809 + }
50810 +
50811 + return status;
50812 +}
50813 +
50814 +
50815 +A_STATUS DevStopRecv(AR6K_DEVICE *pDev, A_BOOL AsyncMode)
50816 +{
50817 + if (NULL == pDev->HifMaskUmaskRecvEvent) {
50818 + return DevDoEnableDisableRecvNormal(pDev,FALSE,AsyncMode);
50819 + } else {
50820 + return DevDoEnableDisableRecvOverride(pDev,FALSE,AsyncMode);
50821 + }
50822 +}
50823 +
50824 +A_STATUS DevEnableRecv(AR6K_DEVICE *pDev, A_BOOL AsyncMode)
50825 +{
50826 + if (NULL == pDev->HifMaskUmaskRecvEvent) {
50827 + return DevDoEnableDisableRecvNormal(pDev,TRUE,AsyncMode);
50828 + } else {
50829 + return DevDoEnableDisableRecvOverride(pDev,TRUE,AsyncMode);
50830 + }
50831 +}
50832 +
50833 +void DevDumpRegisters(AR6K_IRQ_PROC_REGISTERS *pIrqProcRegs,
50834 + AR6K_IRQ_ENABLE_REGISTERS *pIrqEnableRegs)
50835 +{
50836 +
50837 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("\n<------- Register Table -------->\n"));
50838 +
50839 + if (pIrqProcRegs != NULL) {
50840 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50841 + ("Int Status: 0x%x\n",pIrqProcRegs->host_int_status));
50842 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50843 + ("CPU Int Status: 0x%x\n",pIrqProcRegs->cpu_int_status));
50844 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50845 + ("Error Int Status: 0x%x\n",pIrqProcRegs->error_int_status));
50846 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50847 + ("Counter Int Status: 0x%x\n",pIrqProcRegs->counter_int_status));
50848 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50849 + ("Mbox Frame: 0x%x\n",pIrqProcRegs->mbox_frame));
50850 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50851 + ("Rx Lookahead Valid: 0x%x\n",pIrqProcRegs->rx_lookahead_valid));
50852 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50853 + ("Rx Lookahead 0: 0x%x\n",pIrqProcRegs->rx_lookahead[0]));
50854 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50855 + ("Rx Lookahead 1: 0x%x\n",pIrqProcRegs->rx_lookahead[1]));
50856 + }
50857 +
50858 + if (pIrqEnableRegs != NULL) {
50859 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50860 + ("Int Status Enable: 0x%x\n",pIrqEnableRegs->int_status_enable));
50861 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP,
50862 + ("Counter Int Status Enable: 0x%x\n",pIrqEnableRegs->counter_int_status_enable));
50863 + AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("<------------------------------->\n"));
50864 + }
50865 +}
50866 +
50867 +
50868 +#ifdef MBOXHW_UNIT_TEST
50869 +
50870 +
50871 +/* This is a mailbox hardware unit test that must be called in a schedulable context
50872 + * This test is very simple, it will send a list of buffers with a counting pattern
50873 + * and the target will invert the data and send the message back
50874 + *
50875 + * the unit test has the following constraints:
50876 + *
50877 + * The target has at least 8 buffers of 256 bytes each. The host will send
50878 + * the following pattern of buffers in rapid succession :
50879 + *
50880 + * 1 buffer - 128 bytes
50881 + * 1 buffer - 256 bytes
50882 + * 1 buffer - 512 bytes
50883 + * 1 buffer - 1024 bytes
50884 + *
50885 + * The host will send the buffers to one mailbox and wait for buffers to be reflected
50886 + * back from the same mailbox. The target sends the buffers FIFO order.
50887 + * Once the final buffer has been received for a mailbox, the next mailbox is tested.
50888 + *
50889 + *
50890 + * Note: To simplifythe test , we assume that the chosen buffer sizes
50891 + * will fall on a nice block pad
50892 + *
50893 + * It is expected that higher-order tests will be written to stress the mailboxes using
50894 + * a message-based protocol (with some performance timming) that can create more
50895 + * randomness in the packets sent over mailboxes.
50896 + *
50897 + * */
50898 +
50899 +#define A_ROUND_UP_PWR2(x, align) (((int) (x) + ((align)-1)) & ~((align)-1))
50900 +
50901 +#define BUFFER_BLOCK_PAD 128
50902 +
50903 +#if 0
50904 +#define BUFFER1 128
50905 +#define BUFFER2 256
50906 +#define BUFFER3 512
50907 +#define BUFFER4 1024
50908 +#endif
50909 +
50910 +#if 1
50911 +#define BUFFER1 80
50912 +#define BUFFER2 200
50913 +#define BUFFER3 444
50914 +#define BUFFER4 800
50915 +#endif
50916 +
50917 +#define TOTAL_BYTES (A_ROUND_UP_PWR2(BUFFER1,BUFFER_BLOCK_PAD) + \
50918 + A_ROUND_UP_PWR2(BUFFER2,BUFFER_BLOCK_PAD) + \
50919 + A_ROUND_UP_PWR2(BUFFER3,BUFFER_BLOCK_PAD) + \
50920 + A_ROUND_UP_PWR2(BUFFER4,BUFFER_BLOCK_PAD) )
50921 +
50922 +#define TEST_BYTES (BUFFER1 + BUFFER2 + BUFFER3 + BUFFER4)
50923 +
50924 +#define TEST_CREDITS_RECV_TIMEOUT 100
50925 +
50926 +static A_UINT8 g_Buffer[TOTAL_BYTES];
50927 +static A_UINT32 g_MailboxAddrs[AR6K_MAILBOXES];
50928 +static A_UINT32 g_BlockSizes[AR6K_MAILBOXES];
50929 +
50930 +#define BUFFER_PROC_LIST_DEPTH 4
50931 +
50932 +typedef struct _BUFFER_PROC_LIST{
50933 + A_UINT8 *pBuffer;
50934 + A_UINT32 length;
50935 +}BUFFER_PROC_LIST;
50936 +
50937 +
50938 +#define PUSH_BUFF_PROC_ENTRY(pList,len,pCurrpos) \
50939 +{ \
50940 + (pList)->pBuffer = (pCurrpos); \
50941 + (pList)->length = (len); \
50942 + (pCurrpos) += (len); \
50943 + (pList)++; \
50944 +}
50945 +
50946 +/* a simple and crude way to send different "message" sizes */
50947 +static void AssembleBufferList(BUFFER_PROC_LIST *pList)
50948 +{
50949 + A_UINT8 *pBuffer = g_Buffer;
50950 +
50951 +#if BUFFER_PROC_LIST_DEPTH < 4
50952 +#error "Buffer processing list depth is not deep enough!!"
50953 +#endif
50954 +
50955 + PUSH_BUFF_PROC_ENTRY(pList,BUFFER1,pBuffer);
50956 + PUSH_BUFF_PROC_ENTRY(pList,BUFFER2,pBuffer);
50957 + PUSH_BUFF_PROC_ENTRY(pList,BUFFER3,pBuffer);
50958 + PUSH_BUFF_PROC_ENTRY(pList,BUFFER4,pBuffer);
50959 +
50960 +}
50961 +
50962 +#define FILL_ZERO TRUE
50963 +#define FILL_COUNTING FALSE
50964 +static void InitBuffers(A_BOOL Zero)
50965 +{
50966 + A_UINT16 *pBuffer16 = (A_UINT16 *)g_Buffer;
50967 + int i;
50968 +
50969 + /* fill buffer with 16 bit counting pattern or zeros */
50970 + for (i = 0; i < (TOTAL_BYTES / 2) ; i++) {
50971 + if (!Zero) {
50972 + pBuffer16[i] = (A_UINT16)i;
50973 + } else {
50974 + pBuffer16[i] = 0;
50975 + }
50976 + }
50977 +}
50978 +
50979 +
50980 +static A_BOOL CheckOneBuffer(A_UINT16 *pBuffer16, int Length)
50981 +{
50982 + int i;
50983 + A_UINT16 startCount;
50984 + A_BOOL success = TRUE;
50985 +
50986 + /* get the starting count */
50987 + startCount = pBuffer16[0];
50988 + /* invert it, this is the expected value */
50989 + startCount = ~startCount;
50990 + /* scan the buffer and verify */
50991 + for (i = 0; i < (Length / 2) ; i++,startCount++) {
50992 + /* target will invert all the data */
50993 + if ((A_UINT16)pBuffer16[i] != (A_UINT16)~startCount) {
50994 + success = FALSE;
50995 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Invalid Data Got:0x%X, Expecting:0x%X (offset:%d, total:%d) \n",
50996 + pBuffer16[i], ((A_UINT16)~startCount), i, Length));
50997 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("0x%X 0x%X 0x%X 0x%X \n",
50998 + pBuffer16[i], pBuffer16[i + 1], pBuffer16[i + 2],pBuffer16[i+3]));
50999 + break;
51000 + }
51001 + }
51002 +
51003 + return success;
51004 +}
51005 +
51006 +static A_BOOL CheckBuffers(void)
51007 +{
51008 + int i;
51009 + A_BOOL success = TRUE;
51010 + BUFFER_PROC_LIST checkList[BUFFER_PROC_LIST_DEPTH];
51011 +
51012 + /* assemble the list */
51013 + AssembleBufferList(checkList);
51014 +
51015 + /* scan the buffers and verify */
51016 + for (i = 0; i < BUFFER_PROC_LIST_DEPTH ; i++) {
51017 + success = CheckOneBuffer((A_UINT16 *)checkList[i].pBuffer, checkList[i].length);
51018 + if (!success) {
51019 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Buffer : 0x%X, Length:%d failed verify \n",
51020 + (A_UINT32)checkList[i].pBuffer, checkList[i].length));
51021 + break;
51022 + }
51023 + }
51024 +
51025 + return success;
51026 +}
51027 +
51028 + /* find the end marker for the last buffer we will be sending */
51029 +static A_UINT16 GetEndMarker(void)
51030 +{
51031 + A_UINT8 *pBuffer;
51032 + BUFFER_PROC_LIST checkList[BUFFER_PROC_LIST_DEPTH];
51033 +
51034 + /* fill up buffers with the normal counting pattern */
51035 + InitBuffers(FILL_COUNTING);
51036 +
51037 + /* assemble the list we will be sending down */
51038 + AssembleBufferList(checkList);
51039 + /* point to the last 2 bytes of the last buffer */
51040 + pBuffer = &(checkList[BUFFER_PROC_LIST_DEPTH - 1].pBuffer[(checkList[BUFFER_PROC_LIST_DEPTH - 1].length) - 2]);
51041 +
51042 + /* the last count in the last buffer is the marker */
51043 + return (A_UINT16)pBuffer[0] | ((A_UINT16)pBuffer[1] << 8);
51044 +}
51045 +
51046 +#define ATH_PRINT_OUT_ZONE ATH_DEBUG_ERR
51047 +
51048 +/* send the ordered buffers to the target */
51049 +static A_STATUS SendBuffers(AR6K_DEVICE *pDev, int mbox)
51050 +{
51051 + A_STATUS status = A_OK;
51052 + A_UINT32 request = HIF_WR_SYNC_BLOCK_INC;
51053 + BUFFER_PROC_LIST sendList[BUFFER_PROC_LIST_DEPTH];
51054 + int i;
51055 + int totalBytes = 0;
51056 + int paddedLength;
51057 + int totalwPadding = 0;
51058 +
51059 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Sending buffers on mailbox : %d \n",mbox));
51060 +
51061 + /* fill buffer with counting pattern */
51062 + InitBuffers(FILL_COUNTING);
51063 +
51064 + /* assemble the order in which we send */
51065 + AssembleBufferList(sendList);
51066 +
51067 + for (i = 0; i < BUFFER_PROC_LIST_DEPTH; i++) {
51068 +
51069 + /* we are doing block transfers, so we need to pad everything to a block size */
51070 + paddedLength = (sendList[i].length + (g_BlockSizes[mbox] - 1)) &
51071 + (~(g_BlockSizes[mbox] - 1));
51072 +
51073 + /* send each buffer synchronously */
51074 + status = HIFReadWrite(pDev->HIFDevice,
51075 + g_MailboxAddrs[mbox],
51076 + sendList[i].pBuffer,
51077 + paddedLength,
51078 + request,
51079 + NULL);
51080 + if (status != A_OK) {
51081 + break;
51082 + }
51083 + totalBytes += sendList[i].length;
51084 + totalwPadding += paddedLength;
51085 + }
51086 +
51087 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Sent %d bytes (%d padded bytes) to mailbox : %d \n",totalBytes,totalwPadding,mbox));
51088 +
51089 + return status;
51090 +}
51091 +
51092 +/* poll the mailbox credit counter until we get a credit or timeout */
51093 +static A_STATUS GetCredits(AR6K_DEVICE *pDev, int mbox, int *pCredits)
51094 +{
51095 + A_STATUS status = A_OK;
51096 + int timeout = TEST_CREDITS_RECV_TIMEOUT;
51097 + A_UINT8 credits = 0;
51098 + A_UINT32 address;
51099 +
51100 + while (TRUE) {
51101 +
51102 + /* Read the counter register to get credits, this auto-decrements */
51103 + address = COUNT_DEC_ADDRESS + (AR6K_MAILBOXES + mbox) * 4;
51104 + status = HIFReadWrite(pDev->HIFDevice, address, &credits, sizeof(credits),
51105 + HIF_RD_SYNC_BYTE_FIX, NULL);
51106 + if (status != A_OK) {
51107 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
51108 + ("Unable to decrement the command credit count register (mbox=%d)\n",mbox));
51109 + status = A_ERROR;
51110 + break;
51111 + }
51112 +
51113 + if (credits) {
51114 + break;
51115 + }
51116 +
51117 + timeout--;
51118 +
51119 + if (timeout <= 0) {
51120 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
51121 + (" Timeout reading credit registers (mbox=%d, address:0x%X) \n",mbox,address));
51122 + status = A_ERROR;
51123 + break;
51124 + }
51125 +
51126 + /* delay a little, target may not be ready */
51127 + A_MDELAY(1000);
51128 +
51129 + }
51130 +
51131 + if (status == A_OK) {
51132 + *pCredits = credits;
51133 + }
51134 +
51135 + return status;
51136 +}
51137 +
51138 +
51139 +/* wait for the buffers to come back */
51140 +static A_STATUS RecvBuffers(AR6K_DEVICE *pDev, int mbox)
51141 +{
51142 + A_STATUS status = A_OK;
51143 + A_UINT32 request = HIF_RD_SYNC_BLOCK_INC;
51144 + BUFFER_PROC_LIST recvList[BUFFER_PROC_LIST_DEPTH];
51145 + int curBuffer;
51146 + int credits;
51147 + int i;
51148 + int totalBytes = 0;
51149 + int paddedLength;
51150 + int totalwPadding = 0;
51151 +
51152 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Waiting for buffers on mailbox : %d \n",mbox));
51153 +
51154 + /* zero the buffers */
51155 + InitBuffers(FILL_ZERO);
51156 +
51157 + /* assemble the order in which we should receive */
51158 + AssembleBufferList(recvList);
51159 +
51160 + curBuffer = 0;
51161 +
51162 + while (curBuffer < BUFFER_PROC_LIST_DEPTH) {
51163 +
51164 + /* get number of buffers that have been completed, this blocks
51165 + * until we get at least 1 credit or it times out */
51166 + status = GetCredits(pDev, mbox, &credits);
51167 +
51168 + if (status != A_OK) {
51169 + break;
51170 + }
51171 +
51172 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Got %d messages on mailbox : %d \n",credits, mbox));
51173 +
51174 + /* get all the buffers that are sitting on the queue */
51175 + for (i = 0; i < credits; i++) {
51176 + AR_DEBUG_ASSERT(curBuffer < BUFFER_PROC_LIST_DEPTH);
51177 + /* recv the current buffer synchronously, the buffers should come back in
51178 + * order... with padding applied by the target */
51179 + paddedLength = (recvList[curBuffer].length + (g_BlockSizes[mbox] - 1)) &
51180 + (~(g_BlockSizes[mbox] - 1));
51181 +
51182 + status = HIFReadWrite(pDev->HIFDevice,
51183 + g_MailboxAddrs[mbox],
51184 + recvList[curBuffer].pBuffer,
51185 + paddedLength,
51186 + request,
51187 + NULL);
51188 + if (status != A_OK) {
51189 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to read %d bytes on mailbox:%d : address:0x%X \n",
51190 + recvList[curBuffer].length, mbox, g_MailboxAddrs[mbox]));
51191 + break;
51192 + }
51193 +
51194 + totalwPadding += paddedLength;
51195 + totalBytes += recvList[curBuffer].length;
51196 + curBuffer++;
51197 + }
51198 +
51199 + if (status != A_OK) {
51200 + break;
51201 + }
51202 + /* go back and get some more */
51203 + credits = 0;
51204 + }
51205 +
51206 + if (totalBytes != TEST_BYTES) {
51207 + AR_DEBUG_ASSERT(FALSE);
51208 + } else {
51209 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Got all buffers on mbox:%d total recv :%d (w/Padding : %d) \n",
51210 + mbox, totalBytes, totalwPadding));
51211 + }
51212 +
51213 + return status;
51214 +
51215 +
51216 +}
51217 +
51218 +static A_STATUS DoOneMboxHWTest(AR6K_DEVICE *pDev, int mbox)
51219 +{
51220 + A_STATUS status;
51221 +
51222 + do {
51223 + /* send out buffers */
51224 + status = SendBuffers(pDev,mbox);
51225 +
51226 + if (status != A_OK) {
51227 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Sending buffers Failed : %d mbox:%d\n",status,mbox));
51228 + break;
51229 + }
51230 +
51231 + /* go get them, this will block */
51232 + status = RecvBuffers(pDev, mbox);
51233 +
51234 + if (status != A_OK) {
51235 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Recv buffers Failed : %d mbox:%d\n",status,mbox));
51236 + break;
51237 + }
51238 +
51239 + /* check the returned data patterns */
51240 + if (!CheckBuffers()) {
51241 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Buffer Verify Failed : mbox:%d\n",mbox));
51242 + status = A_ERROR;
51243 + break;
51244 + }
51245 +
51246 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" Send/Recv success! mailbox : %d \n",mbox));
51247 +
51248 + } while (FALSE);
51249 +
51250 + return status;
51251 +}
51252 +
51253 +/* here is where the test starts */
51254 +A_STATUS DoMboxHWTest(AR6K_DEVICE *pDev)
51255 +{
51256 + int i;
51257 + A_STATUS status;
51258 + int credits = 0;
51259 + A_UINT8 params[4];
51260 + int numBufs;
51261 + int bufferSize;
51262 + A_UINT16 temp;
51263 +
51264 +
51265 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest START - \n"));
51266 +
51267 + do {
51268 + /* get the addresses for all 4 mailboxes */
51269 + status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_ADDR,
51270 + g_MailboxAddrs, sizeof(g_MailboxAddrs));
51271 +
51272 + if (status != A_OK) {
51273 + AR_DEBUG_ASSERT(FALSE);
51274 + break;
51275 + }
51276 +
51277 + /* get the block sizes */
51278 + status = HIFConfigureDevice(pDev->HIFDevice, HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
51279 + g_BlockSizes, sizeof(g_BlockSizes));
51280 +
51281 + if (status != A_OK) {
51282 + AR_DEBUG_ASSERT(FALSE);
51283 + break;
51284 + }
51285 +
51286 + /* note, the HIF layer usually reports mbox 0 to have a block size of
51287 + * 1, but our test wants to run in block-mode for all mailboxes, so we treat all mailboxes
51288 + * the same. */
51289 + g_BlockSizes[0] = g_BlockSizes[1];
51290 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Block Size to use: %d \n",g_BlockSizes[0]));
51291 +
51292 + if (g_BlockSizes[1] > BUFFER_BLOCK_PAD) {
51293 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("%d Block size is too large for buffer pad %d\n",
51294 + g_BlockSizes[1], BUFFER_BLOCK_PAD));
51295 + break;
51296 + }
51297 +
51298 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Waiting for target.... \n"));
51299 +
51300 + /* the target lets us know it is ready by giving us 1 credit on
51301 + * mailbox 0 */
51302 + status = GetCredits(pDev, 0, &credits);
51303 +
51304 + if (status != A_OK) {
51305 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to wait for target ready \n"));
51306 + break;
51307 + }
51308 +
51309 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Target is ready ...\n"));
51310 +
51311 + /* read the first 4 scratch registers */
51312 + status = HIFReadWrite(pDev->HIFDevice,
51313 + SCRATCH_ADDRESS,
51314 + params,
51315 + 4,
51316 + HIF_RD_SYNC_BYTE_INC,
51317 + NULL);
51318 +
51319 + if (status != A_OK) {
51320 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to wait get parameters \n"));
51321 + break;
51322 + }
51323 +
51324 + numBufs = params[0];
51325 + bufferSize = (int)(((A_UINT16)params[2] << 8) | (A_UINT16)params[1]);
51326 +
51327 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE,
51328 + ("Target parameters: bufs per mailbox:%d, buffer size:%d bytes (total space: %d, minimum required space (w/padding): %d) \n",
51329 + numBufs, bufferSize, (numBufs * bufferSize), TOTAL_BYTES));
51330 +
51331 + if ((numBufs * bufferSize) < TOTAL_BYTES) {
51332 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Not Enough buffer space to run test! need:%d, got:%d \n",
51333 + TOTAL_BYTES, (numBufs*bufferSize)));
51334 + status = A_ERROR;
51335 + break;
51336 + }
51337 +
51338 + temp = GetEndMarker();
51339 +
51340 + status = HIFReadWrite(pDev->HIFDevice,
51341 + SCRATCH_ADDRESS + 4,
51342 + (A_UINT8 *)&temp,
51343 + 2,
51344 + HIF_WR_SYNC_BYTE_INC,
51345 + NULL);
51346 +
51347 + if (status != A_OK) {
51348 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to write end marker \n"));
51349 + break;
51350 + }
51351 +
51352 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("End Marker: 0x%X \n",temp));
51353 +
51354 + temp = (A_UINT16)g_BlockSizes[1];
51355 + /* convert to a mask */
51356 + temp = temp - 1;
51357 + status = HIFReadWrite(pDev->HIFDevice,
51358 + SCRATCH_ADDRESS + 6,
51359 + (A_UINT8 *)&temp,
51360 + 2,
51361 + HIF_WR_SYNC_BYTE_INC,
51362 + NULL);
51363 +
51364 + if (status != A_OK) {
51365 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Failed to write block mask \n"));
51366 + break;
51367 + }
51368 +
51369 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, ("Set Block Mask: 0x%X \n",temp));
51370 +
51371 + /* execute the test on each mailbox */
51372 + for (i = 0; i < AR6K_MAILBOXES; i++) {
51373 + status = DoOneMboxHWTest(pDev, i);
51374 + if (status != A_OK) {
51375 + break;
51376 + }
51377 + }
51378 +
51379 + } while (FALSE);
51380 +
51381 + if (status == A_OK) {
51382 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest DONE - SUCCESS! - \n"));
51383 + } else {
51384 + AR_DEBUG_PRINTF(ATH_PRINT_OUT_ZONE, (" DoMboxHWTest DONE - FAILED! - \n"));
51385 + }
51386 + /* don't let HTC_Start continue, the target is actually not running any HTC code */
51387 + return A_ERROR;
51388 +}
51389 +#endif
51390 +
51391 +
51392 +
51393 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/ar6k_events.c
51394 ===================================================================
51395 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
51396 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/ar6k_events.c 2008-12-11 22:46:49.000000000 +0100
51397 @@ -0,0 +1,638 @@
51398 +/*
51399 + * AR6K Driver layer event handling (i.e. interrupts, message polling)
51400 + *
51401 + * Copyright (c) 2007 Atheros Communications Inc.
51402 + * All rights reserved.
51403 + *
51404 + *
51405 + * This program is free software; you can redistribute it and/or modify
51406 + * it under the terms of the GNU General Public License version 2 as
51407 + * published by the Free Software Foundation;
51408 + *
51409 + * Software distributed under the License is distributed on an "AS
51410 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
51411 + * implied. See the License for the specific language governing
51412 + * rights and limitations under the License.
51413 + *
51414 + *
51415 + *
51416 + */
51417 +#include "a_config.h"
51418 +#include "athdefs.h"
51419 +#include "a_types.h"
51420 +#include "AR6Khwreg.h"
51421 +#include "a_osapi.h"
51422 +#include "a_debug.h"
51423 +#include "hif.h"
51424 +#include "htc_packet.h"
51425 +#include "ar6k.h"
51426 +
51427 +extern void AR6KFreeIOPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket);
51428 +extern HTC_PACKET *AR6KAllocIOPacket(AR6K_DEVICE *pDev);
51429 +
51430 +static A_STATUS DevServiceDebugInterrupt(AR6K_DEVICE *pDev);
51431 +
51432 +#define DELAY_PER_INTERVAL_MS 10 /* 10 MS delay per polling interval */
51433 +
51434 +/* completion routine for ALL HIF layer async I/O */
51435 +A_STATUS DevRWCompletionHandler(void *context, A_STATUS status)
51436 +{
51437 + HTC_PACKET *pPacket = (HTC_PACKET *)context;
51438 +
51439 + COMPLETE_HTC_PACKET(pPacket,status);
51440 +
51441 + return A_OK;
51442 +}
51443 +
51444 +/* mailbox recv message polling */
51445 +A_STATUS DevPollMboxMsgRecv(AR6K_DEVICE *pDev,
51446 + A_UINT32 *pLookAhead,
51447 + int TimeoutMS)
51448 +{
51449 + A_STATUS status = A_OK;
51450 + int timeout = TimeoutMS/DELAY_PER_INTERVAL_MS;
51451 +
51452 + AR_DEBUG_ASSERT(timeout > 0);
51453 +
51454 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+DevPollMboxMsgRecv \n"));
51455 +
51456 + while (TRUE) {
51457 +
51458 + if (pDev->GetPendingEventsFunc != NULL)
51459 + {
51460 +
51461 + HIF_PENDING_EVENTS_INFO events;
51462 +
51463 + /* the HIF layer uses a special mechanism to get events, do this
51464 + * synchronously */
51465 + status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
51466 + &events,
51467 + NULL);
51468 + if (A_FAILED(status))
51469 + {
51470 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to get pending events \n"));
51471 + break;
51472 + }
51473 +
51474 + if (events.Events & HIF_RECV_MSG_AVAIL)
51475 + {
51476 + /* there is a message available, the lookahead should be valid now */
51477 + *pLookAhead = events.LookAhead;
51478 +
51479 + break;
51480 + }
51481 + }
51482 + else
51483 + {
51484 +
51485 + /* this is the standard HIF way.... */
51486 + /* load the register table */
51487 + status = HIFReadWrite(pDev->HIFDevice,
51488 + HOST_INT_STATUS_ADDRESS,
51489 + (A_UINT8 *)&pDev->IrqProcRegisters,
51490 + AR6K_IRQ_PROC_REGS_SIZE,
51491 + HIF_RD_SYNC_BYTE_INC,
51492 + NULL);
51493 +
51494 + if (A_FAILED(status))
51495 + {
51496 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Failed to read register table \n"));
51497 + break;
51498 + }
51499 +
51500 + /* check for MBOX data and valid lookahead */
51501 + if (pDev->IrqProcRegisters.host_int_status & (1 << HTC_MAILBOX))
51502 + {
51503 + if (pDev->IrqProcRegisters.rx_lookahead_valid & (1 << HTC_MAILBOX))
51504 + {
51505 + /* mailbox has a message and the look ahead is valid */
51506 + *pLookAhead = pDev->IrqProcRegisters.rx_lookahead[HTC_MAILBOX];
51507 + break;
51508 + }
51509 + }
51510 +
51511 + }
51512 +
51513 + timeout--;
51514 +
51515 + if (timeout <= 0)
51516 + {
51517 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" Timeout waiting for recv message \n"));
51518 + status = A_ERROR;
51519 +
51520 + /* check if the target asserted */
51521 + if ( pDev->IrqProcRegisters.counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) {
51522 + /* target signaled an assert, process this pending interrupt
51523 + * this will call the target failure handler */
51524 + DevServiceDebugInterrupt(pDev);
51525 + }
51526 +
51527 + break;
51528 + }
51529 +
51530 + /* delay a little */
51531 + A_MDELAY(DELAY_PER_INTERVAL_MS);
51532 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" Retry Mbox Poll : %d \n",timeout));
51533 + }
51534 +
51535 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-DevPollMboxMsgRecv \n"));
51536 +
51537 + return status;
51538 +}
51539 +
51540 +static A_STATUS DevServiceCPUInterrupt(AR6K_DEVICE *pDev)
51541 +{
51542 + A_STATUS status;
51543 + A_UINT8 cpu_int_status;
51544 + A_UINT8 regBuffer[4];
51545 +
51546 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("CPU Interrupt\n"));
51547 + cpu_int_status = pDev->IrqProcRegisters.cpu_int_status &
51548 + pDev->IrqEnableRegisters.cpu_int_status_enable;
51549 + AR_DEBUG_ASSERT(cpu_int_status);
51550 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
51551 + ("Valid interrupt source(s) in CPU_INT_STATUS: 0x%x\n",
51552 + cpu_int_status));
51553 +
51554 + /* Clear the interrupt */
51555 + pDev->IrqProcRegisters.cpu_int_status &= ~cpu_int_status; /* W1C */
51556 +
51557 + /* set up the register transfer buffer to hit the register 4 times , this is done
51558 + * to make the access 4-byte aligned to mitigate issues with host bus interconnects that
51559 + * restrict bus transfer lengths to be a multiple of 4-bytes */
51560 +
51561 + /* set W1C value to clear the interrupt, this hits the register first */
51562 + regBuffer[0] = cpu_int_status;
51563 + /* the remaining 4 values are set to zero which have no-effect */
51564 + regBuffer[1] = 0;
51565 + regBuffer[2] = 0;
51566 + regBuffer[3] = 0;
51567 +
51568 + status = HIFReadWrite(pDev->HIFDevice,
51569 + CPU_INT_STATUS_ADDRESS,
51570 + regBuffer,
51571 + 4,
51572 + HIF_WR_SYNC_BYTE_FIX,
51573 + NULL);
51574 +
51575 + AR_DEBUG_ASSERT(status == A_OK);
51576 + return status;
51577 +}
51578 +
51579 +
51580 +static A_STATUS DevServiceErrorInterrupt(AR6K_DEVICE *pDev)
51581 +{
51582 + A_STATUS status;
51583 + A_UINT8 error_int_status;
51584 + A_UINT8 regBuffer[4];
51585 +
51586 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Error Interrupt\n"));
51587 + error_int_status = pDev->IrqProcRegisters.error_int_status & 0x0F;
51588 + AR_DEBUG_ASSERT(error_int_status);
51589 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
51590 + ("Valid interrupt source(s) in ERROR_INT_STATUS: 0x%x\n",
51591 + error_int_status));
51592 +
51593 + if (ERROR_INT_STATUS_WAKEUP_GET(error_int_status)) {
51594 + /* Wakeup */
51595 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Error : Wakeup\n"));
51596 + }
51597 +
51598 + if (ERROR_INT_STATUS_RX_UNDERFLOW_GET(error_int_status)) {
51599 + /* Rx Underflow */
51600 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Error : Rx Underflow\n"));
51601 + }
51602 +
51603 + if (ERROR_INT_STATUS_TX_OVERFLOW_GET(error_int_status)) {
51604 + /* Tx Overflow */
51605 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Error : Tx Overflow\n"));
51606 + }
51607 +
51608 + /* Clear the interrupt */
51609 + pDev->IrqProcRegisters.error_int_status &= ~error_int_status; /* W1C */
51610 +
51611 + /* set up the register transfer buffer to hit the register 4 times , this is done
51612 + * to make the access 4-byte aligned to mitigate issues with host bus interconnects that
51613 + * restrict bus transfer lengths to be a multiple of 4-bytes */
51614 +
51615 + /* set W1C value to clear the interrupt, this hits the register first */
51616 + regBuffer[0] = error_int_status;
51617 + /* the remaining 4 values are set to zero which have no-effect */
51618 + regBuffer[1] = 0;
51619 + regBuffer[2] = 0;
51620 + regBuffer[3] = 0;
51621 +
51622 + status = HIFReadWrite(pDev->HIFDevice,
51623 + ERROR_INT_STATUS_ADDRESS,
51624 + regBuffer,
51625 + 4,
51626 + HIF_WR_SYNC_BYTE_FIX,
51627 + NULL);
51628 +
51629 + AR_DEBUG_ASSERT(status == A_OK);
51630 + return status;
51631 +}
51632 +
51633 +static A_STATUS DevServiceDebugInterrupt(AR6K_DEVICE *pDev)
51634 +{
51635 + A_UINT32 dummy;
51636 + A_STATUS status;
51637 +
51638 + /* Send a target failure event to the application */
51639 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Target debug interrupt\n"));
51640 +
51641 + if (pDev->TargetFailureCallback != NULL) {
51642 + pDev->TargetFailureCallback(pDev->HTCContext);
51643 + }
51644 +
51645 + /* clear the interrupt , the debug error interrupt is
51646 + * counter 0 */
51647 + /* read counter to clear interrupt */
51648 + status = HIFReadWrite(pDev->HIFDevice,
51649 + COUNT_DEC_ADDRESS,
51650 + (A_UINT8 *)&dummy,
51651 + 4,
51652 + HIF_RD_SYNC_BYTE_INC,
51653 + NULL);
51654 +
51655 + AR_DEBUG_ASSERT(status == A_OK);
51656 + return status;
51657 +}
51658 +
51659 +static A_STATUS DevServiceCounterInterrupt(AR6K_DEVICE *pDev)
51660 +{
51661 + A_UINT8 counter_int_status;
51662 +
51663 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ, ("Counter Interrupt\n"));
51664 +
51665 + counter_int_status = pDev->IrqProcRegisters.counter_int_status &
51666 + pDev->IrqEnableRegisters.counter_int_status_enable;
51667 +
51668 + AR_DEBUG_ASSERT(counter_int_status);
51669 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
51670 + ("Valid interrupt source(s) in COUNTER_INT_STATUS: 0x%x\n",
51671 + counter_int_status));
51672 +
51673 + /* Check if the debug interrupt is pending */
51674 + if (counter_int_status & AR6K_TARGET_DEBUG_INTR_MASK) {
51675 + return DevServiceDebugInterrupt(pDev);
51676 + }
51677 +
51678 + return A_OK;
51679 +}
51680 +
51681 +/* callback when our fetch to get interrupt status registers completes */
51682 +static void DevGetEventAsyncHandler(void *Context, HTC_PACKET *pPacket)
51683 +{
51684 + AR6K_DEVICE *pDev = (AR6K_DEVICE *)Context;
51685 + A_UINT32 lookAhead = 0;
51686 + A_BOOL otherInts = FALSE;
51687 +
51688 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevGetEventAsyncHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
51689 +
51690 + do {
51691 +
51692 + if (A_FAILED(pPacket->Status)) {
51693 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
51694 + (" GetEvents I/O request failed, status:%d \n", pPacket->Status));
51695 + /* bail out, don't unmask HIF interrupt */
51696 + break;
51697 + }
51698 +
51699 + if (pDev->GetPendingEventsFunc != NULL) {
51700 + /* the HIF layer collected the information for us */
51701 + HIF_PENDING_EVENTS_INFO *pEvents = (HIF_PENDING_EVENTS_INFO *)pPacket->pBuffer;
51702 + if (pEvents->Events & HIF_RECV_MSG_AVAIL) {
51703 + lookAhead = pEvents->LookAhead;
51704 + if (0 == lookAhead) {
51705 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" DevGetEventAsyncHandler1, lookAhead is zero! \n"));
51706 + }
51707 + }
51708 + if (pEvents->Events & HIF_OTHER_EVENTS) {
51709 + otherInts = TRUE;
51710 + }
51711 + } else {
51712 + /* standard interrupt table handling.... */
51713 + AR6K_IRQ_PROC_REGISTERS *pReg = (AR6K_IRQ_PROC_REGISTERS *)pPacket->pBuffer;
51714 + A_UINT8 host_int_status;
51715 +
51716 + host_int_status = pReg->host_int_status & pDev->IrqEnableRegisters.int_status_enable;
51717 +
51718 + if (host_int_status & (1 << HTC_MAILBOX)) {
51719 + host_int_status &= ~(1 << HTC_MAILBOX);
51720 + if (pReg->rx_lookahead_valid & (1 << HTC_MAILBOX)) {
51721 + /* mailbox has a message and the look ahead is valid */
51722 + lookAhead = pReg->rx_lookahead[HTC_MAILBOX];
51723 + if (0 == lookAhead) {
51724 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" DevGetEventAsyncHandler2, lookAhead is zero! \n"));
51725 + }
51726 + }
51727 + }
51728 +
51729 + if (host_int_status) {
51730 + /* there are other interrupts to handle */
51731 + otherInts = TRUE;
51732 + }
51733 + }
51734 +
51735 + if (otherInts || (lookAhead == 0)) {
51736 + /* if there are other interrupts to process, we cannot do this in the async handler so
51737 + * ack the interrupt which will cause our sync handler to run again
51738 + * if however there are no more messages, we can now ack the interrupt */
51739 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
51740 + (" Acking interrupt from DevGetEventAsyncHandler (otherints:%d, lookahead:0x%X)\n",
51741 + otherInts, lookAhead));
51742 + HIFAckInterrupt(pDev->HIFDevice);
51743 + } else {
51744 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
51745 + (" DevGetEventAsyncHandler : detected another message, lookahead :0x%X \n",
51746 + lookAhead));
51747 + /* lookahead is non-zero and there are no other interrupts to service,
51748 + * go get the next message */
51749 + pDev->MessagePendingCallback(pDev->HTCContext, lookAhead, NULL);
51750 + }
51751 +
51752 + } while (FALSE);
51753 +
51754 + /* free this IO packet */
51755 + AR6KFreeIOPacket(pDev,pPacket);
51756 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevGetEventAsyncHandler \n"));
51757 +}
51758 +
51759 +/* called by the HTC layer when it wants us to check if the device has any more pending
51760 + * recv messages, this starts off a series of async requests to read interrupt registers */
51761 +A_STATUS DevCheckPendingRecvMsgsAsync(void *context)
51762 +{
51763 + AR6K_DEVICE *pDev = (AR6K_DEVICE *)context;
51764 + A_STATUS status = A_OK;
51765 + HTC_PACKET *pIOPacket;
51766 +
51767 + /* this is called in an ASYNC only context, we may NOT block, sleep or call any apis that can
51768 + * cause us to switch contexts */
51769 +
51770 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevCheckPendingRecvMsgsAsync: (dev: 0x%X)\n", (A_UINT32)pDev));
51771 +
51772 + do {
51773 +
51774 + if (HIF_DEVICE_IRQ_SYNC_ONLY == pDev->HifIRQProcessingMode) {
51775 + /* break the async processing chain right here, no need to continue.
51776 + * The DevDsrHandler() will handle things in a loop when things are driven
51777 + * synchronously */
51778 + break;
51779 + }
51780 + /* first allocate one of our HTC packets we created for async I/O
51781 + * we reuse HTC packet definitions so that we can use the completion mechanism
51782 + * in DevRWCompletionHandler() */
51783 + pIOPacket = AR6KAllocIOPacket(pDev);
51784 +
51785 + if (NULL == pIOPacket) {
51786 + /* there should be only 1 asynchronous request out at a time to read these registers
51787 + * so this should actually never happen */
51788 + status = A_NO_MEMORY;
51789 + AR_DEBUG_ASSERT(FALSE);
51790 + break;
51791 + }
51792 +
51793 + /* stick in our completion routine when the I/O operation completes */
51794 + pIOPacket->Completion = DevGetEventAsyncHandler;
51795 + pIOPacket->pContext = pDev;
51796 +
51797 + if (pDev->GetPendingEventsFunc) {
51798 + /* HIF layer has it's own mechanism, pass the IO to it.. */
51799 + status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
51800 + (HIF_PENDING_EVENTS_INFO *)pIOPacket->pBuffer,
51801 + pIOPacket);
51802 +
51803 + } else {
51804 + /* standard way, read the interrupt register table asynchronously again */
51805 + status = HIFReadWrite(pDev->HIFDevice,
51806 + HOST_INT_STATUS_ADDRESS,
51807 + pIOPacket->pBuffer,
51808 + AR6K_IRQ_PROC_REGS_SIZE,
51809 + HIF_RD_ASYNC_BYTE_INC,
51810 + pIOPacket);
51811 + }
51812 +
51813 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,(" Async IO issued to get interrupt status...\n"));
51814 + } while (FALSE);
51815 +
51816 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevCheckPendingRecvMsgsAsync \n"));
51817 +
51818 + return status;
51819 +}
51820 +
51821 +/* process pending interrupts synchronously */
51822 +static A_STATUS ProcessPendingIRQs(AR6K_DEVICE *pDev, A_BOOL *pDone, A_BOOL *pASyncProcessing)
51823 +{
51824 + A_STATUS status = A_OK;
51825 + A_UINT8 host_int_status = 0;
51826 + A_UINT32 lookAhead = 0;
51827 +
51828 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+ProcessPendingIRQs: (dev: 0x%X)\n", (A_UINT32)pDev));
51829 +
51830 + /*** NOTE: the HIF implementation guarantees that the context of this call allows
51831 + * us to perform SYNCHRONOUS I/O, that is we can block, sleep or call any API that
51832 + * can block or switch thread/task ontexts.
51833 + * This is a fully schedulable context.
51834 + * */
51835 + do {
51836 +
51837 + if (pDev->GetPendingEventsFunc != NULL) {
51838 + HIF_PENDING_EVENTS_INFO events;
51839 +
51840 + /* the HIF layer uses a special mechanism to get events
51841 + * get this synchronously */
51842 + status = pDev->GetPendingEventsFunc(pDev->HIFDevice,
51843 + &events,
51844 + NULL);
51845 +
51846 + if (A_FAILED(status)) {
51847 + break;
51848 + }
51849 +
51850 + if (events.Events & HIF_RECV_MSG_AVAIL) {
51851 + lookAhead = events.LookAhead;
51852 + if (0 == lookAhead) {
51853 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" ProcessPendingIRQs1 lookAhead is zero! \n"));
51854 + }
51855 + }
51856 +
51857 + if (!(events.Events & HIF_OTHER_EVENTS) ||
51858 + !(pDev->IrqEnableRegisters.int_status_enable & OTHER_INTS_ENABLED)) {
51859 + /* no need to read the register table, no other interesting interrupts.
51860 + * Some interfaces (like SPI) can shadow interrupt sources without
51861 + * requiring the host to do a full table read */
51862 + break;
51863 + }
51864 +
51865 + /* otherwise fall through and read the register table */
51866 + }
51867 +
51868 + /*
51869 + * Read the first 28 bytes of the HTC register table. This will yield us
51870 + * the value of different int status registers and the lookahead
51871 + * registers.
51872 + * length = sizeof(int_status) + sizeof(cpu_int_status) +
51873 + * sizeof(error_int_status) + sizeof(counter_int_status) +
51874 + * sizeof(mbox_frame) + sizeof(rx_lookahead_valid) +
51875 + * sizeof(hole) + sizeof(rx_lookahead) +
51876 + * sizeof(int_status_enable) + sizeof(cpu_int_status_enable) +
51877 + * sizeof(error_status_enable) +
51878 + * sizeof(counter_int_status_enable);
51879 + *
51880 + */
51881 + status = HIFReadWrite(pDev->HIFDevice,
51882 + HOST_INT_STATUS_ADDRESS,
51883 + (A_UINT8 *)&pDev->IrqProcRegisters,
51884 + AR6K_IRQ_PROC_REGS_SIZE,
51885 + HIF_RD_SYNC_BYTE_INC,
51886 + NULL);
51887 +
51888 + if (A_FAILED(status)) {
51889 + break;
51890 + }
51891 +
51892 + if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_IRQ)) {
51893 + DevDumpRegisters(&pDev->IrqProcRegisters,
51894 + &pDev->IrqEnableRegisters);
51895 + }
51896 +
51897 + /* Update only those registers that are enabled */
51898 + host_int_status = pDev->IrqProcRegisters.host_int_status &
51899 + pDev->IrqEnableRegisters.int_status_enable;
51900 +
51901 + if (NULL == pDev->GetPendingEventsFunc) {
51902 + /* only look at mailbox status if the HIF layer did not provide this function,
51903 + * on some HIF interfaces reading the RX lookahead is not valid to do */
51904 + if (host_int_status & (1 << HTC_MAILBOX)) {
51905 + /* mask out pending mailbox value, we use "lookAhead" as the real flag for
51906 + * mailbox processing below */
51907 + host_int_status &= ~(1 << HTC_MAILBOX);
51908 + if (pDev->IrqProcRegisters.rx_lookahead_valid & (1 << HTC_MAILBOX)) {
51909 + /* mailbox has a message and the look ahead is valid */
51910 + lookAhead = pDev->IrqProcRegisters.rx_lookahead[HTC_MAILBOX];
51911 + if (0 == lookAhead) {
51912 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" ProcessPendingIRQs2, lookAhead is zero! \n"));
51913 + }
51914 + }
51915 + }
51916 + } else {
51917 + /* not valid to check if the HIF has another mechanism for reading mailbox pending status*/
51918 + host_int_status &= ~(1 << HTC_MAILBOX);
51919 + }
51920 +
51921 + } while (FALSE);
51922 +
51923 +
51924 + do {
51925 +
51926 + /* did the interrupt status fetches succeed? */
51927 + if (A_FAILED(status)) {
51928 + break;
51929 + }
51930 +
51931 + if ((0 == host_int_status) && (0 == lookAhead)) {
51932 + /* nothing to process, the caller can use this to break out of a loop */
51933 + *pDone = TRUE;
51934 + break;
51935 + }
51936 +
51937 + if (lookAhead != 0) {
51938 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("Pending mailbox message, LookAhead: 0x%X\n",lookAhead));
51939 + /* Mailbox Interrupt, the HTC layer may issue async requests to empty the
51940 + * mailbox...
51941 + * When emptying the recv mailbox we use the async handler above called from the
51942 + * completion routine of the callers read request. This can improve performance
51943 + * by reducing context switching when we rapidly pull packets */
51944 + status = pDev->MessagePendingCallback(pDev->HTCContext, lookAhead, pASyncProcessing);
51945 + if (A_FAILED(status)) {
51946 + break;
51947 + }
51948 + }
51949 +
51950 + /* now handle the rest of them */
51951 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,
51952 + (" Valid interrupt source(s) for OTHER interrupts: 0x%x\n",
51953 + host_int_status));
51954 +
51955 + if (HOST_INT_STATUS_CPU_GET(host_int_status)) {
51956 + /* CPU Interrupt */
51957 + status = DevServiceCPUInterrupt(pDev);
51958 + if (A_FAILED(status)){
51959 + break;
51960 + }
51961 + }
51962 +
51963 + if (HOST_INT_STATUS_ERROR_GET(host_int_status)) {
51964 + /* Error Interrupt */
51965 + status = DevServiceErrorInterrupt(pDev);
51966 + if (A_FAILED(status)){
51967 + break;
51968 + }
51969 + }
51970 +
51971 + if (HOST_INT_STATUS_COUNTER_GET(host_int_status)) {
51972 + /* Counter Interrupt */
51973 + status = DevServiceCounterInterrupt(pDev);
51974 + if (A_FAILED(status)){
51975 + break;
51976 + }
51977 + }
51978 +
51979 + } while (FALSE);
51980 +
51981 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-ProcessPendingIRQs: (done:%d, async:%d) status=%d \n",
51982 + *pDone, *pASyncProcessing, status));
51983 +
51984 + return status;
51985 +}
51986 +
51987 +
51988 +/* Synchronousinterrupt handler, this handler kicks off all interrupt processing.*/
51989 +A_STATUS DevDsrHandler(void *context)
51990 +{
51991 + AR6K_DEVICE *pDev = (AR6K_DEVICE *)context;
51992 + A_STATUS status = A_OK;
51993 + A_BOOL done = FALSE;
51994 + A_BOOL asyncProc = FALSE;
51995 +
51996 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("+DevDsrHandler: (dev: 0x%X)\n", (A_UINT32)pDev));
51997 +
51998 +
51999 + while (!done) {
52000 + status = ProcessPendingIRQs(pDev, &done, &asyncProc);
52001 + if (A_FAILED(status)) {
52002 + break;
52003 + }
52004 +
52005 + if (HIF_DEVICE_IRQ_SYNC_ONLY == pDev->HifIRQProcessingMode) {
52006 + /* the HIF layer does not allow async IRQ processing, override the asyncProc flag */
52007 + asyncProc = FALSE;
52008 + /* this will cause us to re-enter ProcessPendingIRQ() and re-read interrupt status registers.
52009 + * this has a nice side effect of blocking us until all async read requests are completed.
52010 + * This behavior is required on some HIF implementations that do not allow ASYNC
52011 + * processing in interrupt handlers (like Windows CE) */
52012 + }
52013 +
52014 + if (asyncProc) {
52015 + /* the function performed some async I/O for performance, we
52016 + need to exit the ISR immediately, the check below will prevent the interrupt from being
52017 + Ack'd while we handle it asynchronously */
52018 + break;
52019 + }
52020 +
52021 + }
52022 +
52023 + if (A_SUCCESS(status) && !asyncProc) {
52024 + /* Ack the interrupt only if :
52025 + * 1. we did not get any errors in processing interrupts
52026 + * 2. there are no outstanding async processing requests */
52027 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,(" Acking interrupt from DevDsrHandler \n"));
52028 + HIFAckInterrupt(pDev->HIFDevice);
52029 + }
52030 +
52031 + AR_DEBUG_PRINTF(ATH_DEBUG_IRQ,("-DevDsrHandler \n"));
52032 + return A_OK;
52033 +}
52034 +
52035 +
52036 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/ar6k.h
52037 ===================================================================
52038 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
52039 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/ar6k.h 2008-12-11 22:46:49.000000000 +0100
52040 @@ -0,0 +1,191 @@
52041 +/*
52042 + *
52043 + * Copyright (c) 2007 Atheros Communications Inc.
52044 + * All rights reserved.
52045 + *
52046 + *
52047 + * This program is free software; you can redistribute it and/or modify
52048 + * it under the terms of the GNU General Public License version 2 as
52049 + * published by the Free Software Foundation;
52050 + *
52051 + * Software distributed under the License is distributed on an "AS
52052 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
52053 + * implied. See the License for the specific language governing
52054 + * rights and limitations under the License.
52055 + *
52056 + *
52057 + *
52058 + */
52059 +
52060 +#ifndef AR6K_H_
52061 +#define AR6K_H_
52062 +
52063 +#define AR6K_MAILBOXES 4
52064 +
52065 +/* HTC runs over mailbox 0 */
52066 +#define HTC_MAILBOX 0
52067 +
52068 +#define AR6K_TARGET_DEBUG_INTR_MASK 0x01
52069 +
52070 +#define OTHER_INTS_ENABLED (INT_STATUS_ENABLE_ERROR_MASK | \
52071 + INT_STATUS_ENABLE_CPU_MASK | \
52072 + INT_STATUS_ENABLE_COUNTER_MASK)
52073 +
52074 +//#define MBOXHW_UNIT_TEST 1
52075 +
52076 +#include "athstartpack.h"
52077 +typedef PREPACK struct _AR6K_IRQ_PROC_REGISTERS {
52078 + A_UINT8 host_int_status;
52079 + A_UINT8 cpu_int_status;
52080 + A_UINT8 error_int_status;
52081 + A_UINT8 counter_int_status;
52082 + A_UINT8 mbox_frame;
52083 + A_UINT8 rx_lookahead_valid;
52084 + A_UINT8 hole[2];
52085 + A_UINT32 rx_lookahead[2];
52086 +} POSTPACK AR6K_IRQ_PROC_REGISTERS;
52087 +
52088 +#define AR6K_IRQ_PROC_REGS_SIZE sizeof(AR6K_IRQ_PROC_REGISTERS)
52089 +
52090 +
52091 +
52092 +typedef PREPACK struct _AR6K_IRQ_ENABLE_REGISTERS {
52093 + A_UINT8 int_status_enable;
52094 + A_UINT8 cpu_int_status_enable;
52095 + A_UINT8 error_status_enable;
52096 + A_UINT8 counter_int_status_enable;
52097 +} POSTPACK AR6K_IRQ_ENABLE_REGISTERS;
52098 +
52099 +#include "athendpack.h"
52100 +
52101 +#define AR6K_IRQ_ENABLE_REGS_SIZE sizeof(AR6K_IRQ_ENABLE_REGISTERS)
52102 +
52103 +#define AR6K_REG_IO_BUFFER_SIZE 32
52104 +#define AR6K_MAX_REG_IO_BUFFERS 8
52105 +
52106 +/* buffers for ASYNC I/O */
52107 +typedef struct AR6K_ASYNC_REG_IO_BUFFER {
52108 + HTC_PACKET HtcPacket; /* we use an HTC packet as a wrapper for our async register-based I/O */
52109 + A_UINT8 Buffer[AR6K_REG_IO_BUFFER_SIZE];
52110 +} AR6K_ASYNC_REG_IO_BUFFER;
52111 +
52112 +typedef struct _AR6K_DEVICE {
52113 + A_MUTEX_T Lock;
52114 + AR6K_IRQ_PROC_REGISTERS IrqProcRegisters;
52115 + AR6K_IRQ_ENABLE_REGISTERS IrqEnableRegisters;
52116 + void *HIFDevice;
52117 + A_UINT32 BlockSize;
52118 + A_UINT32 BlockMask;
52119 + A_UINT32 MailboxAddress;
52120 + HIF_PENDING_EVENTS_FUNC GetPendingEventsFunc;
52121 + void *HTCContext;
52122 + HTC_PACKET_QUEUE RegisterIOList;
52123 + AR6K_ASYNC_REG_IO_BUFFER RegIOBuffers[AR6K_MAX_REG_IO_BUFFERS];
52124 + void (*TargetFailureCallback)(void *Context);
52125 + A_STATUS (*MessagePendingCallback)(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc);
52126 + HIF_DEVICE_IRQ_PROCESSING_MODE HifIRQProcessingMode;
52127 + HIF_MASK_UNMASK_RECV_EVENT HifMaskUmaskRecvEvent;
52128 +} AR6K_DEVICE;
52129 +
52130 +#define IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(pDev) ((pDev)->HifIRQProcessingMode != HIF_DEVICE_IRQ_SYNC_ONLY)
52131 +
52132 +A_STATUS DevSetup(AR6K_DEVICE *pDev);
52133 +A_STATUS DevUnmaskInterrupts(AR6K_DEVICE *pDev);
52134 +A_STATUS DevMaskInterrupts(AR6K_DEVICE *pDev);
52135 +A_STATUS DevPollMboxMsgRecv(AR6K_DEVICE *pDev,
52136 + A_UINT32 *pLookAhead,
52137 + int TimeoutMS);
52138 +A_STATUS DevRWCompletionHandler(void *context, A_STATUS status);
52139 +A_STATUS DevDsrHandler(void *context);
52140 +A_STATUS DevCheckPendingRecvMsgsAsync(void *context);
52141 +void DevDumpRegisters(AR6K_IRQ_PROC_REGISTERS *pIrqProcRegs,
52142 + AR6K_IRQ_ENABLE_REGISTERS *pIrqEnableRegs);
52143 +
52144 +#define DEV_STOP_RECV_ASYNC TRUE
52145 +#define DEV_STOP_RECV_SYNC FALSE
52146 +#define DEV_ENABLE_RECV_ASYNC TRUE
52147 +#define DEV_ENABLE_RECV_SYNC FALSE
52148 +A_STATUS DevStopRecv(AR6K_DEVICE *pDev, A_BOOL ASyncMode);
52149 +A_STATUS DevEnableRecv(AR6K_DEVICE *pDev, A_BOOL ASyncMode);
52150 +
52151 +static INLINE A_STATUS DevSendPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket, A_UINT32 SendLength) {
52152 + A_UINT32 paddedLength;
52153 + A_BOOL sync = (pPacket->Completion == NULL) ? TRUE : FALSE;
52154 + A_STATUS status;
52155 +
52156 + /* adjust the length to be a multiple of block size if appropriate */
52157 + paddedLength = (SendLength + (pDev->BlockMask)) &
52158 + (~(pDev->BlockMask));
52159 +#if 0 // BufferLength may not be set in , fix this...
52160 + if (paddedLength > pPacket->BufferLength) {
52161 + AR_DEBUG_ASSERT(FALSE);
52162 + if (pPacket->Completion != NULL) {
52163 + COMPLETE_HTC_PACKET(pPacket,A_EINVAL);
52164 + }
52165 + return A_EINVAL;
52166 + }
52167 +#endif
52168 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
52169 + ("DevSendPacket, Padded Length: %d Mbox:0x%X (mode:%s)\n",
52170 + paddedLength,
52171 + pDev->MailboxAddress,
52172 + sync ? "SYNC" : "ASYNC"));
52173 +
52174 + status = HIFReadWrite(pDev->HIFDevice,
52175 + pDev->MailboxAddress,
52176 + pPacket->pBuffer,
52177 + paddedLength, /* the padded length */
52178 + sync ? HIF_WR_SYNC_BLOCK_INC : HIF_WR_ASYNC_BLOCK_INC,
52179 + sync ? NULL : pPacket); /* pass the packet as the context to the HIF request */
52180 +
52181 + if (sync) {
52182 + pPacket->Status = status;
52183 + }
52184 +
52185 + return status;
52186 +}
52187 +
52188 +static INLINE A_STATUS DevRecvPacket(AR6K_DEVICE *pDev, HTC_PACKET *pPacket, A_UINT32 RecvLength) {
52189 + A_UINT32 paddedLength;
52190 + A_STATUS status;
52191 + A_BOOL sync = (pPacket->Completion == NULL) ? TRUE : FALSE;
52192 +
52193 + /* adjust the length to be a multiple of block size if appropriate */
52194 + paddedLength = (RecvLength + (pDev->BlockMask)) &
52195 + (~(pDev->BlockMask));
52196 + if (paddedLength > pPacket->BufferLength) {
52197 + AR_DEBUG_ASSERT(FALSE);
52198 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
52199 + ("DevRecvPacket, Not enough space for padlen:%d recvlen:%d bufferlen:%d \n",
52200 + paddedLength,RecvLength,pPacket->BufferLength));
52201 + if (pPacket->Completion != NULL) {
52202 + COMPLETE_HTC_PACKET(pPacket,A_EINVAL);
52203 + }
52204 + return A_EINVAL;
52205 + }
52206 +
52207 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
52208 + ("DevRecvPacket, Padded Length: %d Mbox:0x%X (mode:%s)\n",
52209 + paddedLength,
52210 + pDev->MailboxAddress,
52211 + sync ? "SYNC" : "ASYNC"));
52212 +
52213 + status = HIFReadWrite(pDev->HIFDevice,
52214 + pDev->MailboxAddress,
52215 + pPacket->pBuffer,
52216 + paddedLength,
52217 + sync ? HIF_RD_SYNC_BLOCK_INC : HIF_RD_ASYNC_BLOCK_INC,
52218 + sync ? NULL : pPacket); /* pass the packet as the context to the HIF request */
52219 +
52220 + if (sync) {
52221 + pPacket->Status = status;
52222 + }
52223 +
52224 + return status;
52225 +}
52226 +
52227 +#ifdef MBOXHW_UNIT_TEST
52228 +A_STATUS DoMboxHWTest(AR6K_DEVICE *pDev);
52229 +#endif
52230 +
52231 +#endif /*AR6K_H_*/
52232 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc.c
52233 ===================================================================
52234 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
52235 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc.c 2008-12-11 22:46:49.000000000 +0100
52236 @@ -0,0 +1,507 @@
52237 +/*
52238 + *
52239 + * Copyright (c) 2007 Atheros Communications Inc.
52240 + * All rights reserved.
52241 + *
52242 + *
52243 + * This program is free software; you can redistribute it and/or modify
52244 + * it under the terms of the GNU General Public License version 2 as
52245 + * published by the Free Software Foundation;
52246 + *
52247 + * Software distributed under the License is distributed on an "AS
52248 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
52249 + * implied. See the License for the specific language governing
52250 + * rights and limitations under the License.
52251 + *
52252 + *
52253 + *
52254 + */
52255 +
52256 +#include "htc_internal.h"
52257 +
52258 +
52259 +static HTC_INIT_INFO HTCInitInfo = {NULL,NULL,NULL};
52260 +static A_BOOL HTCInitialized = FALSE;
52261 +
52262 +static A_STATUS HTCTargetInsertedHandler(void *hif_handle);
52263 +static A_STATUS HTCTargetRemovedHandler(void *handle, A_STATUS status);
52264 +static void HTCReportFailure(void *Context);
52265 +
52266 +/* Initializes the HTC layer */
52267 +A_STATUS HTCInit(HTC_INIT_INFO *pInitInfo)
52268 +{
52269 + HTC_CALLBACKS htcCallbacks;
52270 +
52271 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Enter\n"));
52272 + if (HTCInitialized) {
52273 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Exit\n"));
52274 + return A_OK;
52275 + }
52276 +
52277 + A_MEMCPY(&HTCInitInfo,pInitInfo,sizeof(HTC_INIT_INFO));
52278 +
52279 + A_MEMZERO(&htcCallbacks, sizeof(HTC_CALLBACKS));
52280 +
52281 + /* setup HIF layer callbacks */
52282 + htcCallbacks.deviceInsertedHandler = HTCTargetInsertedHandler;
52283 + htcCallbacks.deviceRemovedHandler = HTCTargetRemovedHandler;
52284 + /* the device layer handles these */
52285 + htcCallbacks.rwCompletionHandler = DevRWCompletionHandler;
52286 + htcCallbacks.dsrHandler = DevDsrHandler;
52287 + HIFInit(&htcCallbacks);
52288 + HTCInitialized = TRUE;
52289 +
52290 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCInit: Exit\n"));
52291 + return A_OK;
52292 +}
52293 +
52294 +void HTCFreeControlBuffer(HTC_TARGET *target, HTC_PACKET *pPacket, HTC_PACKET_QUEUE *pList)
52295 +{
52296 + LOCK_HTC(target);
52297 + HTC_PACKET_ENQUEUE(pList,pPacket);
52298 + UNLOCK_HTC(target);
52299 +}
52300 +
52301 +HTC_PACKET *HTCAllocControlBuffer(HTC_TARGET *target, HTC_PACKET_QUEUE *pList)
52302 +{
52303 + HTC_PACKET *pPacket;
52304 +
52305 + LOCK_HTC(target);
52306 + pPacket = HTC_PACKET_DEQUEUE(pList);
52307 + UNLOCK_HTC(target);
52308 +
52309 + return pPacket;
52310 +}
52311 +
52312 +/* cleanup the HTC instance */
52313 +static void HTCCleanup(HTC_TARGET *target)
52314 +{
52315 + if (A_IS_MUTEX_VALID(&target->HTCLock)) {
52316 + A_MUTEX_DELETE(&target->HTCLock);
52317 + }
52318 +
52319 + if (A_IS_MUTEX_VALID(&target->HTCRxLock)) {
52320 + A_MUTEX_DELETE(&target->HTCRxLock);
52321 + }
52322 +
52323 + if (A_IS_MUTEX_VALID(&target->HTCTxLock)) {
52324 + A_MUTEX_DELETE(&target->HTCTxLock);
52325 + }
52326 + /* free our instance */
52327 + A_FREE(target);
52328 +}
52329 +
52330 +/* registered target arrival callback from the HIF layer */
52331 +static A_STATUS HTCTargetInsertedHandler(void *hif_handle)
52332 +{
52333 + HTC_TARGET *target = NULL;
52334 + A_STATUS status;
52335 + int i;
52336 +
52337 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("htcTargetInserted - Enter\n"));
52338 +
52339 + do {
52340 +
52341 + /* allocate target memory */
52342 + if ((target = (HTC_TARGET *)A_MALLOC(sizeof(HTC_TARGET))) == NULL) {
52343 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Unable to allocate memory\n"));
52344 + status = A_ERROR;
52345 + break;
52346 + }
52347 +
52348 + A_MEMZERO(target, sizeof(HTC_TARGET));
52349 + A_MUTEX_INIT(&target->HTCLock);
52350 + A_MUTEX_INIT(&target->HTCRxLock);
52351 + A_MUTEX_INIT(&target->HTCTxLock);
52352 + INIT_HTC_PACKET_QUEUE(&target->ControlBufferTXFreeList);
52353 + INIT_HTC_PACKET_QUEUE(&target->ControlBufferRXFreeList);
52354 +
52355 + /* give device layer the hif device handle */
52356 + target->Device.HIFDevice = hif_handle;
52357 + /* give the device layer our context (for event processing)
52358 + * the device layer will register it's own context with HIF
52359 + * so we need to set this so we can fetch it in the target remove handler */
52360 + target->Device.HTCContext = target;
52361 + /* set device layer target failure callback */
52362 + target->Device.TargetFailureCallback = HTCReportFailure;
52363 + /* set device layer recv message pending callback */
52364 + target->Device.MessagePendingCallback = HTCRecvMessagePendingHandler;
52365 + target->EpWaitingForBuffers = ENDPOINT_MAX;
52366 +
52367 + /* setup device layer */
52368 + status = DevSetup(&target->Device);
52369 +
52370 + if (A_FAILED(status)) {
52371 + break;
52372 + }
52373 +
52374 + /* carve up buffers/packets for control messages */
52375 + for (i = 0; i < NUM_CONTROL_RX_BUFFERS; i++) {
52376 + HTC_PACKET *pControlPacket;
52377 + pControlPacket = &target->HTCControlBuffers[i].HtcPacket;
52378 + SET_HTC_PACKET_INFO_RX_REFILL(pControlPacket,
52379 + target,
52380 + target->HTCControlBuffers[i].Buffer,
52381 + HTC_CONTROL_BUFFER_SIZE,
52382 + ENDPOINT_0);
52383 + HTC_FREE_CONTROL_RX(target,pControlPacket);
52384 + }
52385 +
52386 + for (;i < NUM_CONTROL_BUFFERS;i++) {
52387 + HTC_PACKET *pControlPacket;
52388 + pControlPacket = &target->HTCControlBuffers[i].HtcPacket;
52389 + INIT_HTC_PACKET_INFO(pControlPacket,
52390 + target->HTCControlBuffers[i].Buffer,
52391 + HTC_CONTROL_BUFFER_SIZE);
52392 + HTC_FREE_CONTROL_TX(target,pControlPacket);
52393 + }
52394 +
52395 + } while (FALSE);
52396 +
52397 + if (A_SUCCESS(status)) {
52398 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" calling AddInstance callback \n"));
52399 + /* announce ourselves */
52400 + HTCInitInfo.AddInstance((HTC_HANDLE)target);
52401 + } else {
52402 + if (target != NULL) {
52403 + HTCCleanup(target);
52404 + }
52405 + }
52406 +
52407 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("htcTargetInserted - Exit\n"));
52408 +
52409 + return status;
52410 +}
52411 +
52412 +/* registered removal callback from the HIF layer */
52413 +static A_STATUS HTCTargetRemovedHandler(void *handle, A_STATUS status)
52414 +{
52415 + HTC_TARGET *target;
52416 +
52417 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCTargetRemovedHandler handle:0x%X \n",(A_UINT32)handle));
52418 +
52419 + if (NULL == handle) {
52420 + /* this could be NULL in the event that target initialization failed */
52421 + return A_OK;
52422 + }
52423 +
52424 + target = ((AR6K_DEVICE *)handle)->HTCContext;
52425 +
52426 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" removing target:0x%X instance:0x%X ... \n",
52427 + (A_UINT32)target, (A_UINT32)target->pInstanceContext));
52428 +
52429 + if (target->pInstanceContext != NULL) {
52430 + /* let upper layer know, it needs to call HTCStop() */
52431 + HTCInitInfo.DeleteInstance(target->pInstanceContext);
52432 + }
52433 +
52434 + HIFShutDownDevice(target->Device.HIFDevice);
52435 +
52436 + HTCCleanup(target);
52437 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCTargetRemovedHandler \n"));
52438 + return A_OK;
52439 +}
52440 +
52441 +/* get the low level HIF device for the caller , the caller may wish to do low level
52442 + * HIF requests */
52443 +void *HTCGetHifDevice(HTC_HANDLE HTCHandle)
52444 +{
52445 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
52446 + return target->Device.HIFDevice;
52447 +}
52448 +
52449 +/* set the instance block for this HTC handle, so that on removal, the blob can be
52450 + * returned to the caller */
52451 +void HTCSetInstance(HTC_HANDLE HTCHandle, void *Instance)
52452 +{
52453 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
52454 +
52455 + target->pInstanceContext = Instance;
52456 +}
52457 +
52458 +/* wait for the target to arrive (sends HTC Ready message)
52459 + * this operation is fully synchronous and the message is polled for */
52460 +A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle)
52461 +{
52462 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
52463 + A_STATUS status;
52464 + HTC_PACKET *pPacket = NULL;
52465 + HTC_READY_MSG *pRdyMsg;
52466 + HTC_SERVICE_CONNECT_REQ connect;
52467 + HTC_SERVICE_CONNECT_RESP resp;
52468 +
52469 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCWaitTarget - Enter (target:0x%X) \n", (A_UINT32)target));
52470 +
52471 + do {
52472 +
52473 +#ifdef MBOXHW_UNIT_TEST
52474 +
52475 + status = DoMboxHWTest(&target->Device);
52476 +
52477 + if (status != A_OK) {
52478 + break;
52479 + }
52480 +
52481 +#endif
52482 +
52483 + /* we should be getting 1 control message that the target is ready */
52484 + status = HTCWaitforControlMessage(target, &pPacket);
52485 +
52486 + if (A_FAILED(status)) {
52487 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" Target Not Available!!\n"));
52488 + break;
52489 + }
52490 +
52491 + /* we controlled the buffer creation so it has to be properly aligned */
52492 + pRdyMsg = (HTC_READY_MSG *)pPacket->pBuffer;
52493 +
52494 + if ((pRdyMsg->MessageID != HTC_MSG_READY_ID) ||
52495 + (pPacket->ActualLength < sizeof(HTC_READY_MSG))) {
52496 + /* this message is not valid */
52497 + AR_DEBUG_ASSERT(FALSE);
52498 + status = A_EPROTO;
52499 + break;
52500 + }
52501 +
52502 + if (pRdyMsg->CreditCount == 0 || pRdyMsg->CreditSize == 0) {
52503 + /* this message is not valid */
52504 + AR_DEBUG_ASSERT(FALSE);
52505 + status = A_EPROTO;
52506 + break;
52507 + }
52508 +
52509 + target->TargetCredits = pRdyMsg->CreditCount;
52510 + target->TargetCreditSize = pRdyMsg->CreditSize;
52511 +
52512 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" Target Ready: credits: %d credit size: %d\n",
52513 + target->TargetCredits, target->TargetCreditSize));
52514 +
52515 + /* setup our pseudo HTC control endpoint connection */
52516 + A_MEMZERO(&connect,sizeof(connect));
52517 + A_MEMZERO(&resp,sizeof(resp));
52518 + connect.EpCallbacks.pContext = target;
52519 + connect.EpCallbacks.EpTxComplete = HTCControlTxComplete;
52520 + connect.EpCallbacks.EpRecv = HTCControlRecv;
52521 + connect.EpCallbacks.EpRecvRefill = NULL; /* not needed */
52522 + connect.EpCallbacks.EpSendFull = NULL; /* not nedded */
52523 + connect.MaxSendQueueDepth = NUM_CONTROL_BUFFERS;
52524 + connect.ServiceID = HTC_CTRL_RSVD_SVC;
52525 +
52526 + /* connect fake service */
52527 + status = HTCConnectService((HTC_HANDLE)target,
52528 + &connect,
52529 + &resp);
52530 +
52531 + if (!A_FAILED(status)) {
52532 + break;
52533 + }
52534 +
52535 + } while (FALSE);
52536 +
52537 + if (pPacket != NULL) {
52538 + HTC_FREE_CONTROL_RX(target,pPacket);
52539 + }
52540 +
52541 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCWaitTarget - Exit\n"));
52542 +
52543 + return status;
52544 +}
52545 +
52546 +
52547 +
52548 +/* Start HTC, enable interrupts and let the target know host has finished setup */
52549 +A_STATUS HTCStart(HTC_HANDLE HTCHandle)
52550 +{
52551 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
52552 + HTC_PACKET *pPacket;
52553 + A_STATUS status;
52554 +
52555 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCStart Enter\n"));
52556 +
52557 + /* now that we are starting, push control receive buffers into the
52558 + * HTC control endpoint */
52559 +
52560 + while (1) {
52561 + pPacket = HTC_ALLOC_CONTROL_RX(target);
52562 + if (NULL == pPacket) {
52563 + break;
52564 + }
52565 + HTCAddReceivePkt((HTC_HANDLE)target,pPacket);
52566 + }
52567 +
52568 + do {
52569 +
52570 + AR_DEBUG_ASSERT(target->InitCredits != NULL);
52571 + AR_DEBUG_ASSERT(target->EpCreditDistributionListHead != NULL);
52572 + AR_DEBUG_ASSERT(target->EpCreditDistributionListHead->pNext != NULL);
52573 +
52574 + /* call init credits callback to do the distribution ,
52575 + * NOTE: the first entry in the distribution list is ENDPOINT_0, so
52576 + * we pass the start of the list after this one. */
52577 + target->InitCredits(target->pCredDistContext,
52578 + target->EpCreditDistributionListHead->pNext,
52579 + target->TargetCredits);
52580 +
52581 + if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_TRC)) {
52582 + DumpCreditDistStates(target);
52583 + }
52584 +
52585 + /* the caller is done connecting to services, so we can indicate to the
52586 + * target that the setup phase is complete */
52587 + status = HTCSendSetupComplete(target);
52588 +
52589 + if (A_FAILED(status)) {
52590 + break;
52591 + }
52592 +
52593 + /* unmask interrupts */
52594 + status = DevUnmaskInterrupts(&target->Device);
52595 +
52596 + if (A_FAILED(status)) {
52597 + HTCStop(target);
52598 + }
52599 +
52600 + } while (FALSE);
52601 +
52602 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("HTCStart Exit\n"));
52603 + return status;
52604 +}
52605 +
52606 +
52607 +/* stop HTC communications, i.e. stop interrupt reception, and flush all queued buffers */
52608 +void HTCStop(HTC_HANDLE HTCHandle)
52609 +{
52610 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
52611 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCStop \n"));
52612 +
52613 + /* mark that we are shutting down .. */
52614 + target->HTCStateFlags |= HTC_STATE_STOPPING;
52615 +
52616 + /* Masking interrupts is a synchronous operation, when this function returns
52617 + * all pending HIF I/O has completed, we can safely flush the queues */
52618 + DevMaskInterrupts(&target->Device);
52619 +
52620 + /* flush all send packets */
52621 + HTCFlushSendPkts(target);
52622 + /* flush all recv buffers */
52623 + HTCFlushRecvBuffers(target);
52624 +
52625 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCStop \n"));
52626 +}
52627 +
52628 +/* undo what was done in HTCInit() */
52629 +void HTCShutDown(void)
52630 +{
52631 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCShutDown: \n"));
52632 + HTCInitialized = FALSE;
52633 + /* undo HTCInit */
52634 + HIFShutDownDevice(NULL);
52635 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCShutDown: \n"));
52636 +}
52637 +
52638 +void HTCDumpCreditStates(HTC_HANDLE HTCHandle)
52639 +{
52640 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
52641 +
52642 + LOCK_HTC_TX(target);
52643 +
52644 + DumpCreditDistStates(target);
52645 +
52646 + UNLOCK_HTC_TX(target);
52647 +}
52648 +
52649 +/* report a target failure from the device, this is a callback from the device layer
52650 + * which uses a mechanism to report errors from the target (i.e. special interrupts) */
52651 +static void HTCReportFailure(void *Context)
52652 +{
52653 + HTC_TARGET *target = (HTC_TARGET *)Context;
52654 +
52655 + target->TargetFailure = TRUE;
52656 +
52657 + if ((target->pInstanceContext != NULL) && (HTCInitInfo.TargetFailure != NULL)) {
52658 + /* let upper layer know, it needs to call HTCStop() */
52659 + HTCInitInfo.TargetFailure(target->pInstanceContext, A_ERROR);
52660 + }
52661 +}
52662 +
52663 +void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription)
52664 +{
52665 + A_CHAR stream[60];
52666 + A_UINT32 i;
52667 + A_UINT16 offset, count;
52668 +
52669 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("<---------Dumping %d Bytes : %s ------>\n", length, pDescription));
52670 +
52671 + count = 0;
52672 + offset = 0;
52673 + for(i = 0; i < length; i++) {
52674 + sprintf(stream + offset, "%2.2X ", buffer[i]);
52675 + count ++;
52676 + offset += 3;
52677 +
52678 + if(count == 16) {
52679 + count = 0;
52680 + offset = 0;
52681 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("[H]: %s\n", stream));
52682 + A_MEMZERO(stream, 60);
52683 + }
52684 + }
52685 +
52686 + if(offset != 0) {
52687 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("[H]: %s\n", stream));
52688 + }
52689 +
52690 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("<------------------------------------------------->\n"));
52691 +}
52692 +
52693 +A_BOOL HTCGetEndpointStatistics(HTC_HANDLE HTCHandle,
52694 + HTC_ENDPOINT_ID Endpoint,
52695 + HTC_ENDPOINT_STAT_ACTION Action,
52696 + HTC_ENDPOINT_STATS *pStats)
52697 +{
52698 +
52699 +#ifdef HTC_EP_STAT_PROFILING
52700 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
52701 + A_BOOL clearStats = FALSE;
52702 + A_BOOL sample = FALSE;
52703 +
52704 + switch (Action) {
52705 + case HTC_EP_STAT_SAMPLE :
52706 + sample = TRUE;
52707 + break;
52708 + case HTC_EP_STAT_SAMPLE_AND_CLEAR :
52709 + sample = TRUE;
52710 + clearStats = TRUE;
52711 + break;
52712 + case HTC_EP_STAT_CLEAR :
52713 + clearStats = TRUE;
52714 + break;
52715 + default:
52716 + break;
52717 + }
52718 +
52719 + A_ASSERT(Endpoint < ENDPOINT_MAX);
52720 +
52721 + /* lock out TX and RX while we sample and/or clear */
52722 + LOCK_HTC_TX(target);
52723 + LOCK_HTC_RX(target);
52724 +
52725 + if (sample) {
52726 + A_ASSERT(pStats != NULL);
52727 + /* return the stats to the caller */
52728 + A_MEMCPY(pStats, &target->EndPoint[Endpoint].EndPointStats, sizeof(HTC_ENDPOINT_STATS));
52729 + }
52730 +
52731 + if (clearStats) {
52732 + /* reset stats */
52733 + A_MEMZERO(&target->EndPoint[Endpoint].EndPointStats, sizeof(HTC_ENDPOINT_STATS));
52734 + }
52735 +
52736 + UNLOCK_HTC_RX(target);
52737 + UNLOCK_HTC_TX(target);
52738 +
52739 + return TRUE;
52740 +#else
52741 + return FALSE;
52742 +#endif
52743 +}
52744 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_debug.h
52745 ===================================================================
52746 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
52747 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_debug.h 2008-12-11 22:46:49.000000000 +0100
52748 @@ -0,0 +1,65 @@
52749 +#ifndef HTC_DEBUG_H_
52750 +#define HTC_DEBUG_H_
52751 +/*
52752 + *
52753 + * Copyright (c) 2004-2007 Atheros Communications Inc.
52754 + * All rights reserved.
52755 + *
52756 + *
52757 + * This program is free software; you can redistribute it and/or modify
52758 + * it under the terms of the GNU General Public License version 2 as
52759 + * published by the Free Software Foundation;
52760 + *
52761 + * Software distributed under the License is distributed on an "AS
52762 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
52763 + * implied. See the License for the specific language governing
52764 + * rights and limitations under the License.
52765 + *
52766 + *
52767 + *
52768 + */
52769 +
52770 +/* ------- Debug related stuff ------- */
52771 +enum {
52772 + ATH_DEBUG_SEND = 0x0001,
52773 + ATH_DEBUG_RECV = 0x0002,
52774 + ATH_DEBUG_SYNC = 0x0004,
52775 + ATH_DEBUG_DUMP = 0x0008,
52776 + ATH_DEBUG_IRQ = 0x0010,
52777 + ATH_DEBUG_TRC = 0x0020,
52778 + ATH_DEBUG_WARN = 0x0040,
52779 + ATH_DEBUG_ERR = 0x0080,
52780 + ATH_DEBUG_ANY = 0xFFFF,
52781 +};
52782 +
52783 +#ifdef DEBUG
52784 +
52785 +// TODO FIX usage of A_PRINTF!
52786 +#define AR_DEBUG_LVL_CHECK(lvl) (debughtc & (lvl))
52787 +#define AR_DEBUG_PRINTBUF(buffer, length, desc) do { \
52788 + if (debughtc & ATH_DEBUG_DUMP) { \
52789 + DebugDumpBytes(buffer, length,desc); \
52790 + } \
52791 +} while(0)
52792 +#define PRINTX_ARG(arg...) arg
52793 +#define AR_DEBUG_PRINTF(flags, args) do { \
52794 + if (debughtc & (flags)) { \
52795 + A_PRINTF(KERN_ALERT PRINTX_ARG args); \
52796 + } \
52797 +} while (0)
52798 +#define AR_DEBUG_ASSERT(test) do { \
52799 + if (!(test)) { \
52800 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Debug Assert Caught, File %s, Line: %d, Test:%s \n",__FILE__, __LINE__,#test)); \
52801 + } \
52802 +} while(0)
52803 +extern int debughtc;
52804 +#else
52805 +#define AR_DEBUG_PRINTF(flags, args)
52806 +#define AR_DEBUG_PRINTBUF(buffer, length, desc)
52807 +#define AR_DEBUG_ASSERT(test)
52808 +#define AR_DEBUG_LVL_CHECK(lvl) 0
52809 +#endif
52810 +
52811 +void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription);
52812 +
52813 +#endif /*HTC_DEBUG_H_*/
52814 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_internal.h
52815 ===================================================================
52816 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
52817 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_internal.h 2008-12-11 22:46:49.000000000 +0100
52818 @@ -0,0 +1,168 @@
52819 +/*
52820 + *
52821 + * Copyright (c) 2007 Atheros Communications Inc.
52822 + * All rights reserved.
52823 + *
52824 + *
52825 + * This program is free software; you can redistribute it and/or modify
52826 + * it under the terms of the GNU General Public License version 2 as
52827 + * published by the Free Software Foundation;
52828 + *
52829 + * Software distributed under the License is distributed on an "AS
52830 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
52831 + * implied. See the License for the specific language governing
52832 + * rights and limitations under the License.
52833 + *
52834 + *
52835 + *
52836 + */
52837 +
52838 +#ifndef _HTC_INTERNAL_H_
52839 +#define _HTC_INTERNAL_H_
52840 +
52841 +/* for debugging, uncomment this to capture the last frame header, on frame header
52842 + * processing errors, the last frame header is dump for comparison */
52843 +//#define HTC_CAPTURE_LAST_FRAME
52844 +
52845 +//#define HTC_EP_STAT_PROFILING
52846 +
52847 +#ifdef __cplusplus
52848 +extern "C" {
52849 +#endif /* __cplusplus */
52850 +
52851 +/* Header files */
52852 +#include "a_config.h"
52853 +#include "athdefs.h"
52854 +#include "a_types.h"
52855 +#include "a_osapi.h"
52856 +#include "a_debug.h"
52857 +#include "htc.h"
52858 +#include "htc_api.h"
52859 +#include "bmi_msg.h"
52860 +#include "hif.h"
52861 +#include "ar6k.h"
52862 +
52863 +/* HTC operational parameters */
52864 +#define HTC_TARGET_RESPONSE_TIMEOUT 2000 /* in ms */
52865 +#define HTC_TARGET_DEBUG_INTR_MASK 0x01
52866 +#define HTC_TARGET_CREDIT_INTR_MASK 0xF0
52867 +
52868 +typedef struct _HTC_ENDPOINT {
52869 + HTC_SERVICE_ID ServiceID; /* service ID this endpoint is bound to
52870 + non-zero value means this endpoint is in use */
52871 + HTC_PACKET_QUEUE TxQueue; /* HTC frame buffer TX queue */
52872 + HTC_PACKET_QUEUE RxBuffers; /* HTC frame buffer RX list */
52873 + HTC_ENDPOINT_CREDIT_DIST CreditDist; /* credit distribution structure (exposed to driver layer) */
52874 + HTC_EP_CALLBACKS EpCallBacks; /* callbacks associated with this endpoint */
52875 + int MaxTxQueueDepth; /* max depth of the TX queue before we need to
52876 + call driver's full handler */
52877 + int CurrentTxQueueDepth; /* current TX queue depth */
52878 + int MaxMsgLength; /* max length of endpoint message */
52879 +#ifdef HTC_EP_STAT_PROFILING
52880 + HTC_ENDPOINT_STATS EndPointStats; /* endpoint statistics */
52881 +#endif
52882 +} HTC_ENDPOINT;
52883 +
52884 +#ifdef HTC_EP_STAT_PROFILING
52885 +#define INC_HTC_EP_STAT(p,stat,count) (p)->EndPointStats.stat += (count);
52886 +#else
52887 +#define INC_HTC_EP_STAT(p,stat,count)
52888 +#endif
52889 +
52890 +#define HTC_SERVICE_TX_PACKET_TAG HTC_TX_PACKET_TAG_INTERNAL
52891 +
52892 +#define NUM_CONTROL_BUFFERS 8
52893 +#define NUM_CONTROL_TX_BUFFERS 2
52894 +#define NUM_CONTROL_RX_BUFFERS (NUM_CONTROL_BUFFERS - NUM_CONTROL_TX_BUFFERS)
52895 +
52896 +#define HTC_CONTROL_BUFFER_SIZE (HTC_MAX_CONTROL_MESSAGE_LENGTH + HTC_HDR_LENGTH)
52897 +
52898 +typedef struct HTC_CONTROL_BUFFER {
52899 + HTC_PACKET HtcPacket;
52900 + A_UINT8 Buffer[HTC_CONTROL_BUFFER_SIZE];
52901 +} HTC_CONTROL_BUFFER;
52902 +
52903 +/* our HTC target state */
52904 +typedef struct _HTC_TARGET {
52905 + HTC_ENDPOINT EndPoint[ENDPOINT_MAX];
52906 + HTC_CONTROL_BUFFER HTCControlBuffers[NUM_CONTROL_BUFFERS];
52907 + HTC_ENDPOINT_CREDIT_DIST *EpCreditDistributionListHead;
52908 + HTC_PACKET_QUEUE ControlBufferTXFreeList;
52909 + HTC_PACKET_QUEUE ControlBufferRXFreeList;
52910 + HTC_CREDIT_DIST_CALLBACK DistributeCredits;
52911 + HTC_CREDIT_INIT_CALLBACK InitCredits;
52912 + void *pCredDistContext;
52913 + int TargetCredits;
52914 + int TargetCreditSize;
52915 + A_MUTEX_T HTCLock;
52916 + A_MUTEX_T HTCRxLock;
52917 + A_MUTEX_T HTCTxLock;
52918 + AR6K_DEVICE Device; /* AR6K - specific state */
52919 + A_UINT32 HTCStateFlags;
52920 + HTC_ENDPOINT_ID EpWaitingForBuffers;
52921 + A_BOOL TargetFailure;
52922 + void *pInstanceContext;
52923 +#define HTC_STATE_WAIT_BUFFERS (1 << 0)
52924 +#define HTC_STATE_STOPPING (1 << 1)
52925 +#ifdef HTC_CAPTURE_LAST_FRAME
52926 + HTC_FRAME_HDR LastFrameHdr; /* useful for debugging */
52927 + A_UINT8 LastTrailer[256];
52928 + A_UINT8 LastTrailerLength;
52929 +#endif
52930 +} HTC_TARGET;
52931 +
52932 +#define HTC_STOPPING(t) ((t)->HTCStateFlags & HTC_STATE_STOPPING)
52933 +#define LOCK_HTC(t) A_MUTEX_LOCK(&(t)->HTCLock);
52934 +#define UNLOCK_HTC(t) A_MUTEX_UNLOCK(&(t)->HTCLock);
52935 +#define LOCK_HTC_RX(t) A_MUTEX_LOCK(&(t)->HTCRxLock);
52936 +#define UNLOCK_HTC_RX(t) A_MUTEX_UNLOCK(&(t)->HTCRxLock);
52937 +#define LOCK_HTC_TX(t) A_MUTEX_LOCK(&(t)->HTCTxLock);
52938 +#define UNLOCK_HTC_TX(t) A_MUTEX_UNLOCK(&(t)->HTCTxLock);
52939 +
52940 +#define GET_HTC_TARGET_FROM_HANDLE(hnd) ((HTC_TARGET *)(hnd))
52941 +#define HTC_RECYCLE_RX_PKT(target,p) \
52942 +{ \
52943 + HTC_PACKET_RESET_RX(pPacket); \
52944 + HTCAddReceivePkt((HTC_HANDLE)(target),(p)); \
52945 +}
52946 +
52947 +/* internal HTC functions */
52948 +void HTCControlTxComplete(void *Context, HTC_PACKET *pPacket);
52949 +void HTCControlRecv(void *Context, HTC_PACKET *pPacket);
52950 +A_STATUS HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket);
52951 +HTC_PACKET *HTCAllocControlBuffer(HTC_TARGET *target, HTC_PACKET_QUEUE *pList);
52952 +void HTCFreeControlBuffer(HTC_TARGET *target, HTC_PACKET *pPacket, HTC_PACKET_QUEUE *pList);
52953 +A_STATUS HTCIssueSend(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT8 Flags);
52954 +A_STATUS HTCIssueRecv(HTC_TARGET *target, HTC_PACKET *pPacket);
52955 +void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket);
52956 +A_STATUS HTCRecvMessagePendingHandler(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc);
52957 +void HTCProcessCreditRpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt, int NumEntries, HTC_ENDPOINT_ID FromEndpoint);
52958 +A_STATUS HTCSendSetupComplete(HTC_TARGET *target);
52959 +void HTCFlushRecvBuffers(HTC_TARGET *target);
52960 +void HTCFlushSendPkts(HTC_TARGET *target);
52961 +void DumpCreditDist(HTC_ENDPOINT_CREDIT_DIST *pEPDist);
52962 +void DumpCreditDistStates(HTC_TARGET *target);
52963 +void DebugDumpBytes(A_UCHAR *buffer, A_UINT16 length, char *pDescription);
52964 +
52965 +static INLINE HTC_PACKET *HTC_ALLOC_CONTROL_TX(HTC_TARGET *target) {
52966 + HTC_PACKET *pPacket = HTCAllocControlBuffer(target,&target->ControlBufferTXFreeList);
52967 + if (pPacket != NULL) {
52968 + /* set payload pointer area with some headroom */
52969 + pPacket->pBuffer = pPacket->pBufferStart + HTC_HDR_LENGTH;
52970 + }
52971 + return pPacket;
52972 +}
52973 +
52974 +#define HTC_FREE_CONTROL_TX(t,p) HTCFreeControlBuffer((t),(p),&(t)->ControlBufferTXFreeList)
52975 +#define HTC_ALLOC_CONTROL_RX(t) HTCAllocControlBuffer((t),&(t)->ControlBufferRXFreeList)
52976 +#define HTC_FREE_CONTROL_RX(t,p) \
52977 +{ \
52978 + HTC_PACKET_RESET_RX(p); \
52979 + HTCFreeControlBuffer((t),(p),&(t)->ControlBufferRXFreeList); \
52980 +}
52981 +
52982 +#ifdef __cplusplus
52983 +}
52984 +#endif
52985 +
52986 +#endif /* _HTC_INTERNAL_H_ */
52987 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_recv.c
52988 ===================================================================
52989 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
52990 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_recv.c 2008-12-11 22:46:49.000000000 +0100
52991 @@ -0,0 +1,703 @@
52992 +/*
52993 + *
52994 + * Copyright (c) 2007 Atheros Communications Inc.
52995 + * All rights reserved.
52996 + *
52997 + *
52998 + * This program is free software; you can redistribute it and/or modify
52999 + * it under the terms of the GNU General Public License version 2 as
53000 + * published by the Free Software Foundation;
53001 + *
53002 + * Software distributed under the License is distributed on an "AS
53003 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
53004 + * implied. See the License for the specific language governing
53005 + * rights and limitations under the License.
53006 + *
53007 + *
53008 + *
53009 + */
53010 +
53011 +#include "htc_internal.h"
53012 +
53013 +#define HTCIssueRecv(t, p) \
53014 + DevRecvPacket(&(t)->Device, \
53015 + (p), \
53016 + (p)->ActualLength)
53017 +
53018 +#define DO_RCV_COMPLETION(t,p,e) \
53019 +{ \
53020 + if ((p)->ActualLength > 0) { \
53021 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" completing packet 0x%X (%d bytes) on ep : %d \n", \
53022 + (A_UINT32)(p), (p)->ActualLength, (p)->Endpoint)); \
53023 + (e)->EpCallBacks.EpRecv((e)->EpCallBacks.pContext, \
53024 + (p)); \
53025 + } else { \
53026 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" recycling empty packet \n")); \
53027 + HTC_RECYCLE_RX_PKT((t), (p)); \
53028 + } \
53029 +}
53030 +
53031 +#ifdef HTC_EP_STAT_PROFILING
53032 +#define HTC_RX_STAT_PROFILE(t,ep,lookAhead) \
53033 +{ \
53034 + LOCK_HTC_RX((t)); \
53035 + INC_HTC_EP_STAT((ep), RxReceived, 1); \
53036 + if ((lookAhead) != 0) { \
53037 + INC_HTC_EP_STAT((ep), RxLookAheads, 1); \
53038 + } \
53039 + UNLOCK_HTC_RX((t)); \
53040 +}
53041 +#else
53042 +#define HTC_RX_STAT_PROFILE(t,ep,lookAhead)
53043 +#endif
53044 +
53045 +static INLINE A_STATUS HTCProcessTrailer(HTC_TARGET *target,
53046 + A_UINT8 *pBuffer,
53047 + int Length,
53048 + A_UINT32 *pNextLookAhead,
53049 + HTC_ENDPOINT_ID FromEndpoint)
53050 +{
53051 + HTC_RECORD_HDR *pRecord;
53052 + A_UINT8 *pRecordBuf;
53053 + HTC_LOOKAHEAD_REPORT *pLookAhead;
53054 + A_UINT8 *pOrigBuffer;
53055 + int origLength;
53056 + A_STATUS status;
53057 +
53058 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCProcessTrailer (length:%d) \n", Length));
53059 +
53060 + if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
53061 + AR_DEBUG_PRINTBUF(pBuffer,Length,"Recv Trailer");
53062 + }
53063 +
53064 + pOrigBuffer = pBuffer;
53065 + origLength = Length;
53066 + status = A_OK;
53067 +
53068 + while (Length > 0) {
53069 +
53070 + if (Length < sizeof(HTC_RECORD_HDR)) {
53071 + status = A_EPROTO;
53072 + break;
53073 + }
53074 + /* these are byte aligned structs */
53075 + pRecord = (HTC_RECORD_HDR *)pBuffer;
53076 + Length -= sizeof(HTC_RECORD_HDR);
53077 + pBuffer += sizeof(HTC_RECORD_HDR);
53078 +
53079 + if (pRecord->Length > Length) {
53080 + /* no room left in buffer for record */
53081 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53082 + (" invalid record length: %d (id:%d) buffer has: %d bytes left \n",
53083 + pRecord->Length, pRecord->RecordID, Length));
53084 + status = A_EPROTO;
53085 + break;
53086 + }
53087 + /* start of record follows the header */
53088 + pRecordBuf = pBuffer;
53089 +
53090 + switch (pRecord->RecordID) {
53091 + case HTC_RECORD_CREDITS:
53092 + AR_DEBUG_ASSERT(pRecord->Length >= sizeof(HTC_CREDIT_REPORT));
53093 + HTCProcessCreditRpt(target,
53094 + (HTC_CREDIT_REPORT *)pRecordBuf,
53095 + pRecord->Length / (sizeof(HTC_CREDIT_REPORT)),
53096 + FromEndpoint);
53097 + break;
53098 + case HTC_RECORD_LOOKAHEAD:
53099 + AR_DEBUG_ASSERT(pRecord->Length >= sizeof(HTC_LOOKAHEAD_REPORT));
53100 + pLookAhead = (HTC_LOOKAHEAD_REPORT *)pRecordBuf;
53101 + if ((pLookAhead->PreValid == ((~pLookAhead->PostValid) & 0xFF)) &&
53102 + (pNextLookAhead != NULL)) {
53103 +
53104 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
53105 + (" LookAhead Report Found (pre valid:0x%X, post valid:0x%X) \n",
53106 + pLookAhead->PreValid,
53107 + pLookAhead->PostValid));
53108 +
53109 + /* look ahead bytes are valid, copy them over */
53110 + ((A_UINT8 *)pNextLookAhead)[0] = pLookAhead->LookAhead[0];
53111 + ((A_UINT8 *)pNextLookAhead)[1] = pLookAhead->LookAhead[1];
53112 + ((A_UINT8 *)pNextLookAhead)[2] = pLookAhead->LookAhead[2];
53113 + ((A_UINT8 *)pNextLookAhead)[3] = pLookAhead->LookAhead[3];
53114 +
53115 + if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
53116 + DebugDumpBytes((A_UINT8 *)pNextLookAhead,4,"Next Look Ahead");
53117 + }
53118 + }
53119 + break;
53120 + default:
53121 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, (" unhandled record: id:%d length:%d \n",
53122 + pRecord->RecordID, pRecord->Length));
53123 + break;
53124 + }
53125 +
53126 + if (A_FAILED(status)) {
53127 + break;
53128 + }
53129 +
53130 + /* advance buffer past this record for next time around */
53131 + pBuffer += pRecord->Length;
53132 + Length -= pRecord->Length;
53133 + }
53134 +
53135 + if (A_FAILED(status)) {
53136 + DebugDumpBytes(pOrigBuffer,origLength,"BAD Recv Trailer");
53137 + }
53138 +
53139 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCProcessTrailer \n"));
53140 + return status;
53141 +
53142 +}
53143 +
53144 +/* process a received message (i.e. strip off header, process any trailer data)
53145 + * note : locks must be released when this function is called */
53146 +static A_STATUS HTCProcessRecvHeader(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT32 *pNextLookAhead)
53147 +{
53148 + A_UINT8 temp;
53149 + A_UINT8 *pBuf;
53150 + A_STATUS status = A_OK;
53151 + A_UINT16 payloadLen;
53152 + A_UINT32 lookAhead;
53153 +
53154 + pBuf = pPacket->pBuffer;
53155 +
53156 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCProcessRecvHeader \n"));
53157 +
53158 + if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
53159 + AR_DEBUG_PRINTBUF(pBuf,pPacket->ActualLength,"HTC Recv PKT");
53160 + }
53161 +
53162 + do {
53163 + /* note, we cannot assume the alignment of pBuffer, so we use the safe macros to
53164 + * retrieve 16 bit fields */
53165 + payloadLen = A_GET_UINT16_FIELD(pBuf, HTC_FRAME_HDR, PayloadLen);
53166 +
53167 + ((A_UINT8 *)&lookAhead)[0] = pBuf[0];
53168 + ((A_UINT8 *)&lookAhead)[1] = pBuf[1];
53169 + ((A_UINT8 *)&lookAhead)[2] = pBuf[2];
53170 + ((A_UINT8 *)&lookAhead)[3] = pBuf[3];
53171 +
53172 + if (lookAhead != pPacket->HTCReserved) {
53173 + /* somehow the lookahead that gave us the full read length did not
53174 + * reflect the actual header in the pending message */
53175 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53176 + ("HTCProcessRecvHeader, lookahead mismatch! \n"));
53177 + DebugDumpBytes((A_UINT8 *)&pPacket->HTCReserved,4,"Expected Message LookAhead");
53178 + DebugDumpBytes(pBuf,sizeof(HTC_FRAME_HDR),"Current Frame Header");
53179 +#ifdef HTC_CAPTURE_LAST_FRAME
53180 + DebugDumpBytes((A_UINT8 *)&target->LastFrameHdr,sizeof(HTC_FRAME_HDR),"Last Frame Header");
53181 + if (target->LastTrailerLength != 0) {
53182 + DebugDumpBytes(target->LastTrailer,
53183 + target->LastTrailerLength,
53184 + "Last trailer");
53185 + }
53186 +#endif
53187 + status = A_EPROTO;
53188 + break;
53189 + }
53190 +
53191 + /* get flags */
53192 + temp = A_GET_UINT8_FIELD(pBuf, HTC_FRAME_HDR, Flags);
53193 +
53194 + if (temp & HTC_FLAGS_RECV_TRAILER) {
53195 + /* this packet has a trailer */
53196 +
53197 + /* extract the trailer length in control byte 0 */
53198 + temp = A_GET_UINT8_FIELD(pBuf, HTC_FRAME_HDR, ControlBytes[0]);
53199 +
53200 + if ((temp < sizeof(HTC_RECORD_HDR)) || (temp > payloadLen)) {
53201 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53202 + ("HTCProcessRecvHeader, invalid header (payloadlength should be :%d, CB[0] is:%d) \n",
53203 + payloadLen, temp));
53204 + status = A_EPROTO;
53205 + break;
53206 + }
53207 +
53208 + /* process trailer data that follows HDR + application payload */
53209 + status = HTCProcessTrailer(target,
53210 + (pBuf + HTC_HDR_LENGTH + payloadLen - temp),
53211 + temp,
53212 + pNextLookAhead,
53213 + pPacket->Endpoint);
53214 +
53215 + if (A_FAILED(status)) {
53216 + break;
53217 + }
53218 +
53219 +#ifdef HTC_CAPTURE_LAST_FRAME
53220 + A_MEMCPY(target->LastTrailer, (pBuf + HTC_HDR_LENGTH + payloadLen - temp), temp);
53221 + target->LastTrailerLength = temp;
53222 +#endif
53223 + /* trim length by trailer bytes */
53224 + pPacket->ActualLength -= temp;
53225 + }
53226 +#ifdef HTC_CAPTURE_LAST_FRAME
53227 + else {
53228 + target->LastTrailerLength = 0;
53229 + }
53230 +#endif
53231 +
53232 + /* if we get to this point, the packet is good */
53233 + /* remove header and adjust length */
53234 + pPacket->pBuffer += HTC_HDR_LENGTH;
53235 + pPacket->ActualLength -= HTC_HDR_LENGTH;
53236 +
53237 + } while (FALSE);
53238 +
53239 + if (A_FAILED(status)) {
53240 + /* dump the whole packet */
53241 + DebugDumpBytes(pBuf,pPacket->ActualLength,"BAD HTC Recv PKT");
53242 + } else {
53243 +#ifdef HTC_CAPTURE_LAST_FRAME
53244 + A_MEMCPY(&target->LastFrameHdr,pBuf,sizeof(HTC_FRAME_HDR));
53245 +#endif
53246 + if (AR_DEBUG_LVL_CHECK(ATH_DEBUG_RECV)) {
53247 + if (pPacket->ActualLength > 0) {
53248 + AR_DEBUG_PRINTBUF(pPacket->pBuffer,pPacket->ActualLength,"HTC - Application Msg");
53249 + }
53250 + }
53251 + }
53252 +
53253 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCProcessRecvHeader \n"));
53254 + return status;
53255 +}
53256 +
53257 +/* asynchronous completion handler for recv packet fetching, when the device layer
53258 + * completes a read request, it will call this completion handler */
53259 +void HTCRecvCompleteHandler(void *Context, HTC_PACKET *pPacket)
53260 +{
53261 + HTC_TARGET *target = (HTC_TARGET *)Context;
53262 + HTC_ENDPOINT *pEndpoint;
53263 + A_UINT32 nextLookAhead = 0;
53264 + A_STATUS status;
53265 +
53266 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("+HTCRecvCompleteHandler (status:%d, ep:%d) \n",
53267 + pPacket->Status, pPacket->Endpoint));
53268 +
53269 + AR_DEBUG_ASSERT(pPacket->Endpoint < ENDPOINT_MAX);
53270 + pEndpoint = &target->EndPoint[pPacket->Endpoint];
53271 + pPacket->Completion = NULL;
53272 +
53273 + /* get completion status */
53274 + status = pPacket->Status;
53275 +
53276 + do {
53277 + if (A_FAILED(status)) {
53278 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("HTCRecvCompleteHandler: request failed (status:%d, ep:%d) \n",
53279 + pPacket->Status, pPacket->Endpoint));
53280 + break;
53281 + }
53282 + /* process the header for any trailer data */
53283 + status = HTCProcessRecvHeader(target,pPacket,&nextLookAhead);
53284 +
53285 + if (A_FAILED(status)) {
53286 + break;
53287 + }
53288 + /* was there a lookahead for the next packet? */
53289 + if (nextLookAhead != 0) {
53290 + A_STATUS nextStatus;
53291 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
53292 + ("HTCRecvCompleteHandler - next look ahead was non-zero : 0x%X \n",
53293 + nextLookAhead));
53294 + /* we have another packet, get the next packet fetch started (pipelined) before
53295 + * we call into the endpoint's callback, this will start another async request */
53296 + nextStatus = HTCRecvMessagePendingHandler(target,nextLookAhead,NULL);
53297 + if (A_EPROTO == nextStatus) {
53298 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53299 + ("Next look ahead from recv header was INVALID\n"));
53300 + DebugDumpBytes((A_UINT8 *)&nextLookAhead,
53301 + 4,
53302 + "BAD lookahead from lookahead report");
53303 + }
53304 + } else {
53305 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
53306 + ("HTCRecvCompleteHandler - rechecking for more messages...\n"));
53307 + /* if we did not get anything on the look-ahead,
53308 + * call device layer to asynchronously re-check for messages. If we can keep the async
53309 + * processing going we get better performance. If there is a pending message we will keep processing
53310 + * messages asynchronously which should pipeline things nicely */
53311 + DevCheckPendingRecvMsgsAsync(&target->Device);
53312 + }
53313 +
53314 + HTC_RX_STAT_PROFILE(target,pEndpoint,nextLookAhead);
53315 + DO_RCV_COMPLETION(target,pPacket,pEndpoint);
53316 +
53317 + } while (FALSE);
53318 +
53319 + if (A_FAILED(status)) {
53320 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53321 + ("HTCRecvCompleteHandler , message fetch failed (status = %d) \n",
53322 + status));
53323 + /* recyle this packet */
53324 + HTC_RECYCLE_RX_PKT(target, pPacket);
53325 + }
53326 +
53327 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, ("-HTCRecvCompleteHandler\n"));
53328 +}
53329 +
53330 +/* synchronously wait for a control message from the target,
53331 + * This function is used at initialization time ONLY. At init messages
53332 + * on ENDPOINT 0 are expected. */
53333 +A_STATUS HTCWaitforControlMessage(HTC_TARGET *target, HTC_PACKET **ppControlPacket)
53334 +{
53335 + A_STATUS status;
53336 + A_UINT32 lookAhead;
53337 + HTC_PACKET *pPacket = NULL;
53338 + HTC_FRAME_HDR *pHdr;
53339 +
53340 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HTCWaitforControlMessage \n"));
53341 +
53342 + do {
53343 +
53344 + *ppControlPacket = NULL;
53345 +
53346 + /* call the polling function to see if we have a message */
53347 + status = DevPollMboxMsgRecv(&target->Device,
53348 + &lookAhead,
53349 + HTC_TARGET_RESPONSE_TIMEOUT);
53350 +
53351 + if (A_FAILED(status)) {
53352 + break;
53353 + }
53354 +
53355 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,
53356 + ("HTCWaitforControlMessage : lookAhead : 0x%X \n", lookAhead));
53357 +
53358 + /* check the lookahead */
53359 + pHdr = (HTC_FRAME_HDR *)&lookAhead;
53360 +
53361 + if (pHdr->EndpointID != ENDPOINT_0) {
53362 + /* unexpected endpoint number, should be zero */
53363 + AR_DEBUG_ASSERT(FALSE);
53364 + status = A_EPROTO;
53365 + break;
53366 + }
53367 +
53368 + if (A_FAILED(status)) {
53369 + /* bad message */
53370 + AR_DEBUG_ASSERT(FALSE);
53371 + status = A_EPROTO;
53372 + break;
53373 + }
53374 +
53375 + pPacket = HTC_ALLOC_CONTROL_RX(target);
53376 +
53377 + if (pPacket == NULL) {
53378 + AR_DEBUG_ASSERT(FALSE);
53379 + status = A_NO_MEMORY;
53380 + break;
53381 + }
53382 +
53383 + pPacket->HTCReserved = lookAhead;
53384 + pPacket->ActualLength = pHdr->PayloadLen + HTC_HDR_LENGTH;
53385 +
53386 + if (pPacket->ActualLength > pPacket->BufferLength) {
53387 + AR_DEBUG_ASSERT(FALSE);
53388 + status = A_EPROTO;
53389 + break;
53390 + }
53391 +
53392 + /* we want synchronous operation */
53393 + pPacket->Completion = NULL;
53394 +
53395 + /* get the message from the device, this will block */
53396 + status = HTCIssueRecv(target, pPacket);
53397 +
53398 + if (A_FAILED(status)) {
53399 + break;
53400 + }
53401 +
53402 + /* process receive header */
53403 + status = HTCProcessRecvHeader(target,pPacket,NULL);
53404 +
53405 + pPacket->Status = status;
53406 +
53407 + if (A_FAILED(status)) {
53408 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53409 + ("HTCWaitforControlMessage, HTCProcessRecvHeader failed (status = %d) \n",
53410 + status));
53411 + break;
53412 + }
53413 +
53414 + /* give the caller this control message packet, they are responsible to free */
53415 + *ppControlPacket = pPacket;
53416 +
53417 + } while (FALSE);
53418 +
53419 + if (A_FAILED(status)) {
53420 + if (pPacket != NULL) {
53421 + /* cleanup buffer on error */
53422 + HTC_FREE_CONTROL_RX(target,pPacket);
53423 + }
53424 + }
53425 +
53426 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HTCWaitforControlMessage \n"));
53427 +
53428 + return status;
53429 +}
53430 +
53431 +/* callback when device layer or lookahead report parsing detects a pending message */
53432 +A_STATUS HTCRecvMessagePendingHandler(void *Context, A_UINT32 LookAhead, A_BOOL *pAsyncProc)
53433 +{
53434 + HTC_TARGET *target = (HTC_TARGET *)Context;
53435 + A_STATUS status = A_OK;
53436 + HTC_PACKET *pPacket = NULL;
53437 + HTC_FRAME_HDR *pHdr;
53438 + HTC_ENDPOINT *pEndpoint;
53439 + A_BOOL asyncProc = FALSE;
53440 +
53441 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("+HTCRecvMessagePendingHandler LookAhead:0x%X \n",LookAhead));
53442 +
53443 + if (IS_DEV_IRQ_PROCESSING_ASYNC_ALLOWED(&target->Device)) {
53444 + /* We use async mode to get the packets if the device layer supports it.
53445 + * The device layer interfaces with HIF in which HIF may have restrictions on
53446 + * how interrupts are processed */
53447 + asyncProc = TRUE;
53448 + }
53449 +
53450 + if (pAsyncProc != NULL) {
53451 + /* indicate to caller how we decided to process this */
53452 + *pAsyncProc = asyncProc;
53453 + }
53454 +
53455 + while (TRUE) {
53456 +
53457 + pHdr = (HTC_FRAME_HDR *)&LookAhead;
53458 +
53459 + if (pHdr->EndpointID >= ENDPOINT_MAX) {
53460 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Invalid Endpoint in look-ahead: %d \n",pHdr->EndpointID));
53461 + /* invalid endpoint */
53462 + status = A_EPROTO;
53463 + break;
53464 + }
53465 +
53466 + if (pHdr->PayloadLen > HTC_MAX_PAYLOAD_LENGTH) {
53467 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Payload length %d exceeds max HTC : %d !\n",
53468 + pHdr->PayloadLen, HTC_MAX_PAYLOAD_LENGTH));
53469 + status = A_EPROTO;
53470 + break;
53471 + }
53472 +
53473 + pEndpoint = &target->EndPoint[pHdr->EndpointID];
53474 +
53475 + if (0 == pEndpoint->ServiceID) {
53476 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("Endpoint %d is not connected !\n",pHdr->EndpointID));
53477 + /* endpoint isn't even connected */
53478 + status = A_EPROTO;
53479 + break;
53480 + }
53481 +
53482 + /* lock RX to get a buffer */
53483 + LOCK_HTC_RX(target);
53484 +
53485 + /* get a packet from the endpoint recv queue */
53486 + pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
53487 +
53488 + if (NULL == pPacket) {
53489 + /* check for refill handler */
53490 + if (pEndpoint->EpCallBacks.EpRecvRefill != NULL) {
53491 + UNLOCK_HTC_RX(target);
53492 + /* call the re-fill handler */
53493 + pEndpoint->EpCallBacks.EpRecvRefill(pEndpoint->EpCallBacks.pContext,
53494 + pHdr->EndpointID);
53495 + LOCK_HTC_RX(target);
53496 + /* check if we have more buffers */
53497 + pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
53498 + /* fall through */
53499 + }
53500 + }
53501 +
53502 + if (NULL == pPacket) {
53503 + /* this is not an error, we simply need to mark that we are waiting for buffers.*/
53504 + target->HTCStateFlags |= HTC_STATE_WAIT_BUFFERS;
53505 + target->EpWaitingForBuffers = pHdr->EndpointID;
53506 + status = A_NO_MEMORY;
53507 + }
53508 +
53509 + UNLOCK_HTC_RX(target);
53510 +
53511 + if (A_FAILED(status)) {
53512 + /* no buffers */
53513 + break;
53514 + }
53515 +
53516 + AR_DEBUG_ASSERT(pPacket->Endpoint == pHdr->EndpointID);
53517 +
53518 + /* make sure this message can fit in the endpoint buffer */
53519 + if ((pHdr->PayloadLen + HTC_HDR_LENGTH) > pPacket->BufferLength) {
53520 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53521 + ("Payload Length Error : header reports payload of: %d, endpoint buffer size: %d \n",
53522 + pHdr->PayloadLen, pPacket->BufferLength));
53523 + status = A_EPROTO;
53524 + break;
53525 + }
53526 +
53527 + pPacket->HTCReserved = LookAhead; /* set expected look ahead */
53528 + /* set the amount of data to fetch */
53529 + pPacket->ActualLength = pHdr->PayloadLen + HTC_HDR_LENGTH;
53530 +
53531 + if (asyncProc) {
53532 + /* we use async mode to get the packet if the device layer supports it
53533 + * set our callback and context */
53534 + pPacket->Completion = HTCRecvCompleteHandler;
53535 + pPacket->pContext = target;
53536 + } else {
53537 + /* fully synchronous */
53538 + pPacket->Completion = NULL;
53539 + }
53540 +
53541 + /* go fetch the packet */
53542 + status = HTCIssueRecv(target, pPacket);
53543 +
53544 + if (A_FAILED(status)) {
53545 + break;
53546 + }
53547 +
53548 + if (asyncProc) {
53549 + /* we did this asynchronously so we can get out of the loop, the asynch processing
53550 + * creates a chain of requests to continue processing pending messages in the
53551 + * context of callbacks */
53552 + break;
53553 + }
53554 +
53555 + /* in the sync case, we process the packet, check lookaheads and then repeat */
53556 +
53557 + LookAhead = 0;
53558 + status = HTCProcessRecvHeader(target,pPacket,&LookAhead);
53559 +
53560 + if (A_FAILED(status)) {
53561 + break;
53562 + }
53563 +
53564 + HTC_RX_STAT_PROFILE(target,pEndpoint,LookAhead);
53565 + DO_RCV_COMPLETION(target,pPacket,pEndpoint);
53566 +
53567 + pPacket = NULL;
53568 +
53569 + if (0 == LookAhead) {
53570 + break;
53571 + }
53572 +
53573 + }
53574 +
53575 + if (A_NO_MEMORY == status) {
53576 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53577 + (" Endpoint :%d has no buffers, blocking receiver to prevent overrun.. \n",
53578 + pHdr->EndpointID));
53579 + /* try to stop receive at the device layer */
53580 + DevStopRecv(&target->Device, asyncProc ? DEV_STOP_RECV_ASYNC : DEV_STOP_RECV_SYNC);
53581 + status = A_OK;
53582 + } else if (A_FAILED(status)) {
53583 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53584 + ("Failed to get pending message : LookAhead Value: 0x%X (status = %d) \n",
53585 + LookAhead, status));
53586 + if (pPacket != NULL) {
53587 + /* clean up packet on error */
53588 + HTC_RECYCLE_RX_PKT(target, pPacket);
53589 + }
53590 + }
53591 +
53592 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,("-HTCRecvMessagePendingHandler \n"));
53593 +
53594 + return status;
53595 +}
53596 +
53597 +/* Makes a buffer available to the HTC module */
53598 +A_STATUS HTCAddReceivePkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket)
53599 +{
53600 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
53601 + HTC_ENDPOINT *pEndpoint;
53602 + A_BOOL unblockRecv = FALSE;
53603 + A_STATUS status = A_OK;
53604 +
53605 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
53606 + ("+- HTCAddReceivePkt: endPointId: %d, buffer: 0x%X, length: %d\n",
53607 + pPacket->Endpoint, (A_UINT32)pPacket->pBuffer, pPacket->BufferLength));
53608 +
53609 + do {
53610 +
53611 + if (HTC_STOPPING(target)) {
53612 + status = A_ECANCELED;
53613 + break;
53614 + }
53615 +
53616 + AR_DEBUG_ASSERT(pPacket->Endpoint < ENDPOINT_MAX);
53617 +
53618 + pEndpoint = &target->EndPoint[pPacket->Endpoint];
53619 +
53620 + LOCK_HTC_RX(target);
53621 +
53622 + /* store receive packet */
53623 + HTC_PACKET_ENQUEUE(&pEndpoint->RxBuffers, pPacket);
53624 +
53625 + /* check if we are blocked waiting for a new buffer */
53626 + if (target->HTCStateFlags & HTC_STATE_WAIT_BUFFERS) {
53627 + if (target->EpWaitingForBuffers == pPacket->Endpoint) {
53628 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV,(" receiver was blocked on ep:%d, unblocking.. \n",
53629 + target->EpWaitingForBuffers));
53630 + target->HTCStateFlags &= ~HTC_STATE_WAIT_BUFFERS;
53631 + target->EpWaitingForBuffers = ENDPOINT_MAX;
53632 + unblockRecv = TRUE;
53633 + }
53634 + }
53635 +
53636 + UNLOCK_HTC_RX(target);
53637 +
53638 + if (unblockRecv && !HTC_STOPPING(target)) {
53639 + /* TODO : implement a buffer threshold count? */
53640 + DevEnableRecv(&target->Device,DEV_ENABLE_RECV_SYNC);
53641 + }
53642 +
53643 + } while (FALSE);
53644 +
53645 + return status;
53646 +}
53647 +
53648 +static void HTCFlushEndpointRX(HTC_TARGET *target, HTC_ENDPOINT *pEndpoint)
53649 +{
53650 + HTC_PACKET *pPacket;
53651 +
53652 + LOCK_HTC_RX(target);
53653 +
53654 + while (1) {
53655 + pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->RxBuffers);
53656 + if (NULL == pPacket) {
53657 + break;
53658 + }
53659 + UNLOCK_HTC_RX(target);
53660 + pPacket->Status = A_ECANCELED;
53661 + pPacket->ActualLength = 0;
53662 + AR_DEBUG_PRINTF(ATH_DEBUG_RECV, (" Flushing RX packet:0x%X, length:%d, ep:%d \n",
53663 + (A_UINT32)pPacket, pPacket->BufferLength, pPacket->Endpoint));
53664 + /* give the packet back */
53665 + pEndpoint->EpCallBacks.EpRecv(pEndpoint->EpCallBacks.pContext,
53666 + pPacket);
53667 + LOCK_HTC_RX(target);
53668 + }
53669 +
53670 + UNLOCK_HTC_RX(target);
53671 +
53672 +
53673 +}
53674 +
53675 +void HTCFlushRecvBuffers(HTC_TARGET *target)
53676 +{
53677 + HTC_ENDPOINT *pEndpoint;
53678 + int i;
53679 +
53680 + /* NOTE: no need to flush endpoint 0, these buffers were
53681 + * allocated as part of the HTC struct */
53682 + for (i = ENDPOINT_1; i < ENDPOINT_MAX; i++) {
53683 + pEndpoint = &target->EndPoint[i];
53684 + if (pEndpoint->ServiceID == 0) {
53685 + /* not in use.. */
53686 + continue;
53687 + }
53688 + HTCFlushEndpointRX(target,pEndpoint);
53689 + }
53690 +
53691 +
53692 +}
53693 +
53694 +
53695 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_send.c
53696 ===================================================================
53697 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
53698 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_send.c 2008-12-11 22:46:49.000000000 +0100
53699 @@ -0,0 +1,543 @@
53700 +/*
53701 + *
53702 + * Copyright (c) 2007 Atheros Communications Inc.
53703 + * All rights reserved.
53704 + *
53705 + *
53706 + * This program is free software; you can redistribute it and/or modify
53707 + * it under the terms of the GNU General Public License version 2 as
53708 + * published by the Free Software Foundation;
53709 + *
53710 + * Software distributed under the License is distributed on an "AS
53711 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
53712 + * implied. See the License for the specific language governing
53713 + * rights and limitations under the License.
53714 + *
53715 + *
53716 + *
53717 + */
53718 +
53719 +#include "htc_internal.h"
53720 +
53721 +#define DO_EP_TX_COMPLETION(ep,p) \
53722 +{ \
53723 + (p)->Completion = NULL; \
53724 + (ep)->EpCallBacks.EpTxComplete((ep)->EpCallBacks.pContext,(p)); \
53725 +}
53726 +
53727 +
53728 +/* call the distribute credits callback with the distribution */
53729 +#define DO_DISTRIBUTION(t,reason,description,pList) \
53730 +{ \
53731 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, \
53732 + (" calling distribute function (%s) (dfn:0x%X, ctxt:0x%X, dist:0x%X) \n", \
53733 + (description), \
53734 + (A_UINT32)(t)->DistributeCredits, \
53735 + (A_UINT32)(t)->pCredDistContext, \
53736 + (A_UINT32)pList)); \
53737 + (t)->DistributeCredits((t)->pCredDistContext, \
53738 + (pList), \
53739 + (reason)); \
53740 +}
53741 +
53742 +/* our internal send packet completion handler when packets are submited to the AR6K device
53743 + * layer */
53744 +static void HTCSendPktCompletionHandler(void *Context, HTC_PACKET *pPacket)
53745 +{
53746 + HTC_TARGET *target = (HTC_TARGET *)Context;
53747 + HTC_ENDPOINT *pEndpoint = &target->EndPoint[pPacket->Endpoint];
53748 +
53749 +
53750 + if (A_FAILED(pPacket->Status)) {
53751 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
53752 + ("HTCSendPktCompletionHandler: request failed (status:%d, ep:%d) \n",
53753 + pPacket->Status, pPacket->Endpoint));
53754 + }
53755 + /* first, fixup the head room we allocated */
53756 + pPacket->pBuffer += HTC_HDR_LENGTH;
53757 + /* do completion */
53758 + DO_EP_TX_COMPLETION(pEndpoint,pPacket);
53759 +}
53760 +
53761 +A_STATUS HTCIssueSend(HTC_TARGET *target, HTC_PACKET *pPacket, A_UINT8 SendFlags)
53762 +{
53763 + A_STATUS status;
53764 + A_UINT8 *pHdrBuf;
53765 + A_BOOL sync = FALSE;
53766 +
53767 + /* caller always provides headrooom */
53768 + pPacket->pBuffer -= HTC_HDR_LENGTH;
53769 + pHdrBuf = pPacket->pBuffer;
53770 + /* setup frame header */
53771 + A_SET_UINT16_FIELD(pHdrBuf,HTC_FRAME_HDR,PayloadLen,(A_UINT16)pPacket->ActualLength);
53772 + A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,Flags,SendFlags);
53773 + A_SET_UINT8_FIELD(pHdrBuf,HTC_FRAME_HDR,EndpointID, (A_UINT8)pPacket->Endpoint);
53774 +
53775 + if (pPacket->Completion == NULL) {
53776 + /* mark that this request was synchronously issued */
53777 + sync = TRUE;
53778 + }
53779 +
53780 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
53781 + ("+-HTCIssueSend: transmit length : %d (%s) \n",
53782 + pPacket->ActualLength + HTC_HDR_LENGTH,
53783 + sync ? "SYNC" : "ASYNC" ));
53784 +
53785 + /* send message to device */
53786 + status = DevSendPacket(&target->Device,
53787 + pPacket,
53788 + pPacket->ActualLength + HTC_HDR_LENGTH);
53789 +
53790 + if (sync) {
53791 + /* use local sync variable. If this was issued asynchronously, pPacket is no longer
53792 + * safe to access. */
53793 + pPacket->pBuffer += HTC_HDR_LENGTH;
53794 + }
53795 +
53796 + /* if this request was asynchronous, the packet completion routine will be invoked by
53797 + * the device layer when the HIF layer completes the request */
53798 +
53799 + return status;
53800 +}
53801 +
53802 +/* try to send the current packet or a packet at the head of the TX queue,
53803 + * if there are no credits, the packet remains in the queue.
53804 + * this function always succeeds and returns a flag if the TX queue for
53805 + * the endpoint has hit the set limit */
53806 +static A_BOOL HTCTrySend(HTC_TARGET *target,
53807 + HTC_ENDPOINT *pEndpoint,
53808 + HTC_PACKET *pPacketToSend)
53809 +{
53810 + HTC_PACKET *pPacket;
53811 + int creditsRequired;
53812 + int remainder;
53813 + A_UINT8 sendFlags;
53814 + A_BOOL epFull = FALSE;
53815 +
53816 + LOCK_HTC_TX(target);
53817 +
53818 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("+HTCTrySend (pPkt:0x%X)\n",(A_UINT32)pPacketToSend));
53819 +
53820 + if (pPacketToSend != NULL) {
53821 + /* caller supplied us a packet to queue to the tail of the HTC TX queue before
53822 + * we check the tx queue */
53823 + HTC_PACKET_ENQUEUE(&pEndpoint->TxQueue,pPacketToSend);
53824 + pEndpoint->CurrentTxQueueDepth++;
53825 + }
53826 +
53827 + /* now drain the TX queue for transmission as long as we have enough
53828 + * credits */
53829 +
53830 + while (1) {
53831 +
53832 + if (HTC_QUEUE_EMPTY(&pEndpoint->TxQueue)) {
53833 + /* nothing in the queue */
53834 + break;
53835 + }
53836 +
53837 + sendFlags = 0;
53838 +
53839 + /* get packet at head, but don't remove it */
53840 + pPacket = HTC_GET_PKT_AT_HEAD(&pEndpoint->TxQueue);
53841 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Got head packet:0x%X , Queue Depth: %d\n",
53842 + (A_UINT32)pPacket, pEndpoint->CurrentTxQueueDepth));
53843 +
53844 + /* figure out how many credits this message requires */
53845 + creditsRequired = (pPacket->ActualLength + HTC_HDR_LENGTH) / target->TargetCreditSize;
53846 + remainder = (pPacket->ActualLength + HTC_HDR_LENGTH) % target->TargetCreditSize;
53847 +
53848 + if (remainder) {
53849 + creditsRequired++;
53850 + }
53851 +
53852 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Creds Required:%d Got:%d\n",
53853 + creditsRequired, pEndpoint->CreditDist.TxCredits));
53854 +
53855 + if (pEndpoint->CreditDist.TxCredits < creditsRequired) {
53856 +
53857 + /* not enough credits */
53858 +
53859 + if (pPacket->Endpoint == ENDPOINT_0) {
53860 + /* leave it in the queue */
53861 + break;
53862 + }
53863 + /* invoke the registered distribution function only if this is not
53864 + * endpoint 0, we let the driver layer provide more credits if it can.
53865 + * We pass the credit distribution list starting at the endpoint in question
53866 + * */
53867 +
53868 + /* set how many credits we need */
53869 + pEndpoint->CreditDist.TxCreditsSeek =
53870 + creditsRequired - pEndpoint->CreditDist.TxCredits;
53871 + DO_DISTRIBUTION(target,
53872 + HTC_CREDIT_DIST_SEEK_CREDITS,
53873 + "Seek Credits",
53874 + &pEndpoint->CreditDist);
53875 +
53876 + pEndpoint->CreditDist.TxCreditsSeek = 0;
53877 +
53878 + if (pEndpoint->CreditDist.TxCredits < creditsRequired) {
53879 + /* still not enough credits to send, leave packet in the queue */
53880 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
53881 + (" Not enough credits for ep %d leaving packet in queue..\n",
53882 + pPacket->Endpoint));
53883 + break;
53884 + }
53885 +
53886 + }
53887 +
53888 + pEndpoint->CreditDist.TxCredits -= creditsRequired;
53889 + INC_HTC_EP_STAT(pEndpoint, TxCreditsConsummed, creditsRequired);
53890 +
53891 + /* check if we need credits */
53892 + if (pEndpoint->CreditDist.TxCredits < pEndpoint->CreditDist.TxCreditsPerMaxMsg) {
53893 + sendFlags |= HTC_FLAGS_NEED_CREDIT_UPDATE;
53894 + INC_HTC_EP_STAT(pEndpoint, TxCreditLowIndications, 1);
53895 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,(" Host Needs Credits \n"));
53896 + }
53897 +
53898 + /* now we can fully dequeue */
53899 + pPacket = HTC_PACKET_DEQUEUE(&pEndpoint->TxQueue);
53900 + pEndpoint->CurrentTxQueueDepth--;
53901 +
53902 + INC_HTC_EP_STAT(pEndpoint, TxIssued, 1);
53903 +
53904 + UNLOCK_HTC_TX(target);
53905 +
53906 + HTCIssueSend(target, pPacket, sendFlags);
53907 +
53908 + LOCK_HTC_TX(target);
53909 +
53910 + /* go back and check for more messages */
53911 + }
53912 +
53913 + if (pEndpoint->CurrentTxQueueDepth >= pEndpoint->MaxTxQueueDepth) {
53914 + /* let caller know that this endpoint has reached the maximum depth */
53915 + epFull = TRUE;
53916 + }
53917 +
53918 + UNLOCK_HTC_TX(target);
53919 +
53920 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,("-HTCTrySend: \n"));
53921 + return epFull;
53922 +}
53923 +
53924 +/* HTC API - HTCSendPkt */
53925 +A_STATUS HTCSendPkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket)
53926 +{
53927 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
53928 + HTC_ENDPOINT *pEndpoint;
53929 + HTC_ENDPOINT_ID ep;
53930 + A_STATUS status = A_OK;
53931 +
53932 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND,
53933 + ("+HTCSendPkt: Enter endPointId: %d, buffer: 0x%X, length: %d \n",
53934 + pPacket->Endpoint, (A_UINT32)pPacket->pBuffer, pPacket->ActualLength));
53935 +
53936 + ep = pPacket->Endpoint;
53937 + AR_DEBUG_ASSERT(ep < ENDPOINT_MAX);
53938 + pEndpoint = &target->EndPoint[ep];
53939 +
53940 + do {
53941 +
53942 + if (HTC_STOPPING(target)) {
53943 + status = A_ECANCELED;
53944 + pPacket->Status = status;
53945 + DO_EP_TX_COMPLETION(pEndpoint,pPacket);
53946 + break;
53947 + }
53948 + /* everything sent through this interface is asynchronous */
53949 + /* fill in HTC completion routines */
53950 + pPacket->Completion = HTCSendPktCompletionHandler;
53951 + pPacket->pContext = target;
53952 +
53953 + if (HTCTrySend(target, pEndpoint, pPacket)) {
53954 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Endpoint %d, TX queue is full, Depth:%d, Max:%d \n",
53955 + ep, pEndpoint->CurrentTxQueueDepth, pEndpoint->MaxTxQueueDepth));
53956 + /* queue is now full, let caller know */
53957 + if (pEndpoint->EpCallBacks.EpSendFull != NULL) {
53958 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Calling driver's send full callback.... \n"));
53959 + pEndpoint->EpCallBacks.EpSendFull(pEndpoint->EpCallBacks.pContext,
53960 + ep);
53961 + }
53962 + }
53963 +
53964 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCSendPkt \n"));
53965 + } while (FALSE);
53966 +
53967 + return status;
53968 +}
53969 +
53970 +
53971 +/* check TX queues to drain because of credit distribution update */
53972 +static INLINE void HTCCheckEndpointTxQueues(HTC_TARGET *target)
53973 +{
53974 + HTC_ENDPOINT *pEndpoint;
53975 + HTC_ENDPOINT_CREDIT_DIST *pDistItem;
53976 +
53977 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("+HTCCheckEndpointTxQueues \n"));
53978 + pDistItem = target->EpCreditDistributionListHead;
53979 +
53980 + /* run through the credit distribution list to see
53981 + * if there are packets queued
53982 + * NOTE: no locks need to be taken since the distribution list
53983 + * is not dynamic (cannot be re-ordered) and we are not modifying any state */
53984 + while (pDistItem != NULL) {
53985 + pEndpoint = (HTC_ENDPOINT *)pDistItem->pHTCReserved;
53986 +
53987 + if (pEndpoint->CurrentTxQueueDepth > 0) {
53988 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Ep %d has %d credits and %d Packets in TX Queue \n",
53989 + pDistItem->Endpoint, pEndpoint->CreditDist.TxCredits, pEndpoint->CurrentTxQueueDepth));
53990 + /* try to start the stalled queue, this list is ordered by priority.
53991 + * Highest priority queue get's processed first, if there are credits available the
53992 + * highest priority queue will get a chance to reclaim credits from lower priority
53993 + * ones */
53994 + HTCTrySend(target, pEndpoint, NULL);
53995 + }
53996 +
53997 + pDistItem = pDistItem->pNext;
53998 + }
53999 +
54000 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCCheckEndpointTxQueues \n"));
54001 +}
54002 +
54003 +/* process credit reports and call distribution function */
54004 +void HTCProcessCreditRpt(HTC_TARGET *target, HTC_CREDIT_REPORT *pRpt, int NumEntries, HTC_ENDPOINT_ID FromEndpoint)
54005 +{
54006 + int i;
54007 + HTC_ENDPOINT *pEndpoint;
54008 + int totalCredits = 0;
54009 + A_BOOL doDist = FALSE;
54010 +
54011 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("+HTCProcessCreditRpt, Credit Report Entries:%d \n", NumEntries));
54012 +
54013 + /* lock out TX while we update credits */
54014 + LOCK_HTC_TX(target);
54015 +
54016 + for (i = 0; i < NumEntries; i++, pRpt++) {
54017 + if (pRpt->EndpointID >= ENDPOINT_MAX) {
54018 + AR_DEBUG_ASSERT(FALSE);
54019 + break;
54020 + }
54021 +
54022 + pEndpoint = &target->EndPoint[pRpt->EndpointID];
54023 +
54024 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Endpoint %d got %d credits \n",
54025 + pRpt->EndpointID, pRpt->Credits));
54026 +
54027 +
54028 +#ifdef HTC_EP_STAT_PROFILING
54029 +
54030 + INC_HTC_EP_STAT(pEndpoint, TxCreditRpts, 1);
54031 + INC_HTC_EP_STAT(pEndpoint, TxCreditsReturned, pRpt->Credits);
54032 +
54033 + if (FromEndpoint == pRpt->EndpointID) {
54034 + /* this credit report arrived on the same endpoint indicating it arrived in an RX
54035 + * packet */
54036 + INC_HTC_EP_STAT(pEndpoint, TxCreditsFromRx, pRpt->Credits);
54037 + INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromRx, 1);
54038 + } else if (FromEndpoint == ENDPOINT_0) {
54039 + /* this credit arrived on endpoint 0 as a NULL message */
54040 + INC_HTC_EP_STAT(pEndpoint, TxCreditsFromEp0, pRpt->Credits);
54041 + INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromEp0, 1);
54042 + } else {
54043 + /* arrived on another endpoint */
54044 + INC_HTC_EP_STAT(pEndpoint, TxCreditsFromOther, pRpt->Credits);
54045 + INC_HTC_EP_STAT(pEndpoint, TxCreditRptsFromOther, 1);
54046 + }
54047 +
54048 +#endif
54049 +
54050 + if (ENDPOINT_0 == pRpt->EndpointID) {
54051 + /* always give endpoint 0 credits back */
54052 + pEndpoint->CreditDist.TxCredits += pRpt->Credits;
54053 + } else {
54054 + /* for all other endpoints, update credits to distribute, the distribution function
54055 + * will handle giving out credits back to the endpoints */
54056 + pEndpoint->CreditDist.TxCreditsToDist += pRpt->Credits;
54057 + /* flag that we have to do the distribution */
54058 + doDist = TRUE;
54059 + }
54060 +
54061 + totalCredits += pRpt->Credits;
54062 + }
54063 +
54064 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, (" Report indicated %d credits to distribute \n", totalCredits));
54065 +
54066 + if (doDist) {
54067 + /* this was a credit return based on a completed send operations
54068 + * note, this is done with the lock held */
54069 + DO_DISTRIBUTION(target,
54070 + HTC_CREDIT_DIST_SEND_COMPLETE,
54071 + "Send Complete",
54072 + target->EpCreditDistributionListHead->pNext);
54073 + }
54074 +
54075 + UNLOCK_HTC_TX(target);
54076 +
54077 + if (totalCredits) {
54078 + HTCCheckEndpointTxQueues(target);
54079 + }
54080 +
54081 + AR_DEBUG_PRINTF(ATH_DEBUG_SEND, ("-HTCProcessCreditRpt \n"));
54082 +}
54083 +
54084 +/* flush endpoint TX queue */
54085 +static void HTCFlushEndpointTX(HTC_TARGET *target, HTC_ENDPOINT *pEndpoint, HTC_TX_TAG Tag)
54086 +{
54087 + HTC_PACKET *pPacket;
54088 + HTC_PACKET_QUEUE discardQueue;
54089 +
54090 + /* initialize the discard queue */
54091 + INIT_HTC_PACKET_QUEUE(&discardQueue);
54092 +
54093 + LOCK_HTC_TX(target);
54094 +
54095 + /* interate from the front of the TX queue and flush out packets */
54096 + ITERATE_OVER_LIST_ALLOW_REMOVE(&pEndpoint->TxQueue, pPacket, HTC_PACKET, ListLink) {
54097 +
54098 + /* check for removal */
54099 + if ((HTC_TX_PACKET_TAG_ALL == Tag) || (Tag == pPacket->PktInfo.AsTx.Tag)) {
54100 + /* remove from queue */
54101 + HTC_PACKET_REMOVE(pPacket);
54102 + /* add it to the discard pile */
54103 + HTC_PACKET_ENQUEUE(&discardQueue, pPacket);
54104 + pEndpoint->CurrentTxQueueDepth--;
54105 + }
54106 +
54107 + } ITERATE_END;
54108 +
54109 + UNLOCK_HTC_TX(target);
54110 +
54111 + /* empty the discard queue */
54112 + while (1) {
54113 + pPacket = HTC_PACKET_DEQUEUE(&discardQueue);
54114 + if (NULL == pPacket) {
54115 + break;
54116 + }
54117 + pPacket->Status = A_ECANCELED;
54118 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, (" Flushing TX packet:0x%X, length:%d, ep:%d tag:0x%X \n",
54119 + (A_UINT32)pPacket, pPacket->ActualLength, pPacket->Endpoint, pPacket->PktInfo.AsTx.Tag));
54120 + DO_EP_TX_COMPLETION(pEndpoint,pPacket);
54121 + }
54122 +
54123 +}
54124 +
54125 +void DumpCreditDist(HTC_ENDPOINT_CREDIT_DIST *pEPDist)
54126 +{
54127 +#ifdef DEBUG
54128 + HTC_ENDPOINT *pEndpoint = (HTC_ENDPOINT *)pEPDist->pHTCReserved;
54129 +#endif
54130 +
54131 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("--- EP : %d ServiceID: 0x%X --------------\n",
54132 + pEPDist->Endpoint, pEPDist->ServiceID));
54133 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" this:0x%X next:0x%X prev:0x%X\n",
54134 + (A_UINT32)pEPDist, (A_UINT32)pEPDist->pNext, (A_UINT32)pEPDist->pPrev));
54135 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" DistFlags : 0x%X \n", pEPDist->DistFlags));
54136 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsNorm : %d \n", pEPDist->TxCreditsNorm));
54137 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsMin : %d \n", pEPDist->TxCreditsMin));
54138 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCredits : %d \n", pEPDist->TxCredits));
54139 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsAssigned : %d \n", pEPDist->TxCreditsAssigned));
54140 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsSeek : %d \n", pEPDist->TxCreditsSeek));
54141 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditSize : %d \n", pEPDist->TxCreditSize));
54142 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsPerMaxMsg : %d \n", pEPDist->TxCreditsPerMaxMsg));
54143 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxCreditsToDist : %d \n", pEPDist->TxCreditsToDist));
54144 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, (" TxQueueDepth : %d \n", pEndpoint->CurrentTxQueueDepth));
54145 + AR_DEBUG_PRINTF(ATH_DEBUG_ANY, ("----------------------------------------------------\n"));
54146 +}
54147 +
54148 +void DumpCreditDistStates(HTC_TARGET *target)
54149 +{
54150 + HTC_ENDPOINT_CREDIT_DIST *pEPList = target->EpCreditDistributionListHead;
54151 +
54152 + while (pEPList != NULL) {
54153 + DumpCreditDist(pEPList);
54154 + pEPList = pEPList->pNext;
54155 + }
54156 +
54157 + if (target->DistributeCredits != NULL) {
54158 + DO_DISTRIBUTION(target,
54159 + HTC_DUMP_CREDIT_STATE,
54160 + "Dump State",
54161 + NULL);
54162 + }
54163 +}
54164 +
54165 +/* flush all send packets from all endpoint queues */
54166 +void HTCFlushSendPkts(HTC_TARGET *target)
54167 +{
54168 + HTC_ENDPOINT *pEndpoint;
54169 + int i;
54170 +
54171 + DumpCreditDistStates(target);
54172 +
54173 + for (i = ENDPOINT_0; i < ENDPOINT_MAX; i++) {
54174 + pEndpoint = &target->EndPoint[i];
54175 + if (pEndpoint->ServiceID == 0) {
54176 + /* not in use.. */
54177 + continue;
54178 + }
54179 + HTCFlushEndpointTX(target,pEndpoint,HTC_TX_PACKET_TAG_ALL);
54180 + }
54181 +
54182 +
54183 +}
54184 +
54185 +/* HTC API to flush an endpoint's TX queue*/
54186 +void HTCFlushEndpoint(HTC_HANDLE HTCHandle, HTC_ENDPOINT_ID Endpoint, HTC_TX_TAG Tag)
54187 +{
54188 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
54189 + HTC_ENDPOINT *pEndpoint = &target->EndPoint[Endpoint];
54190 +
54191 + if (pEndpoint->ServiceID == 0) {
54192 + AR_DEBUG_ASSERT(FALSE);
54193 + /* not in use.. */
54194 + return;
54195 + }
54196 +
54197 + HTCFlushEndpointTX(target, pEndpoint, Tag);
54198 +}
54199 +
54200 +/* HTC API to indicate activity to the credit distribution function */
54201 +void HTCIndicateActivityChange(HTC_HANDLE HTCHandle,
54202 + HTC_ENDPOINT_ID Endpoint,
54203 + A_BOOL Active)
54204 +{
54205 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
54206 + HTC_ENDPOINT *pEndpoint = &target->EndPoint[Endpoint];
54207 + A_BOOL doDist = FALSE;
54208 +
54209 + if (pEndpoint->ServiceID == 0) {
54210 + AR_DEBUG_ASSERT(FALSE);
54211 + /* not in use.. */
54212 + return;
54213 + }
54214 +
54215 + LOCK_HTC_TX(target);
54216 +
54217 + if (Active) {
54218 + if (!(pEndpoint->CreditDist.DistFlags & HTC_EP_ACTIVE)) {
54219 + /* mark active now */
54220 + pEndpoint->CreditDist.DistFlags |= HTC_EP_ACTIVE;
54221 + doDist = TRUE;
54222 + }
54223 + } else {
54224 + if (pEndpoint->CreditDist.DistFlags & HTC_EP_ACTIVE) {
54225 + /* mark inactive now */
54226 + pEndpoint->CreditDist.DistFlags &= ~HTC_EP_ACTIVE;
54227 + doDist = TRUE;
54228 + }
54229 + }
54230 +
54231 + if (doDist) {
54232 + /* do distribution again based on activity change
54233 + * note, this is done with the lock held */
54234 + DO_DISTRIBUTION(target,
54235 + HTC_CREDIT_DIST_ACTIVITY_CHANGE,
54236 + "Activity Change",
54237 + target->EpCreditDistributionListHead->pNext);
54238 + }
54239 +
54240 + UNLOCK_HTC_TX(target);
54241 +
54242 +}
54243 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_services.c
54244 ===================================================================
54245 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
54246 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/htc/htc_services.c 2008-12-11 22:46:49.000000000 +0100
54247 @@ -0,0 +1,403 @@
54248 +/*
54249 + *
54250 + * Copyright (c) 2007 Atheros Communications Inc.
54251 + * All rights reserved.
54252 + *
54253 + *
54254 + * This program is free software; you can redistribute it and/or modify
54255 + * it under the terms of the GNU General Public License version 2 as
54256 + * published by the Free Software Foundation;
54257 + *
54258 + * Software distributed under the License is distributed on an "AS
54259 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
54260 + * implied. See the License for the specific language governing
54261 + * rights and limitations under the License.
54262 + *
54263 + *
54264 + *
54265 + */
54266 +
54267 +#include "htc_internal.h"
54268 +
54269 +void HTCControlTxComplete(void *Context, HTC_PACKET *pPacket)
54270 +{
54271 + /* not implemented
54272 + * we do not send control TX frames during normal runtime, only during setup */
54273 + AR_DEBUG_ASSERT(FALSE);
54274 +}
54275 +
54276 + /* callback when a control message arrives on this endpoint */
54277 +void HTCControlRecv(void *Context, HTC_PACKET *pPacket)
54278 +{
54279 + AR_DEBUG_ASSERT(pPacket->Endpoint == ENDPOINT_0);
54280 +
54281 + /* the only control messages we are expecting are NULL messages (credit resports), which should
54282 + * never get here */
54283 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
54284 + ("HTCControlRecv, got message with length:%d \n",
54285 + pPacket->ActualLength + HTC_HDR_LENGTH));
54286 +
54287 + /* dump header and message */
54288 + DebugDumpBytes(pPacket->pBuffer - HTC_HDR_LENGTH,
54289 + pPacket->ActualLength + HTC_HDR_LENGTH,
54290 + "Unexpected ENDPOINT 0 Message");
54291 +
54292 + HTC_RECYCLE_RX_PKT((HTC_TARGET*)Context,pPacket);
54293 +}
54294 +
54295 +A_STATUS HTCSendSetupComplete(HTC_TARGET *target)
54296 +{
54297 + HTC_PACKET *pSendPacket = NULL;
54298 + A_STATUS status;
54299 + HTC_SETUP_COMPLETE_MSG *pSetupComplete;
54300 +
54301 + do {
54302 + /* allocate a packet to send to the target */
54303 + pSendPacket = HTC_ALLOC_CONTROL_TX(target);
54304 +
54305 + if (NULL == pSendPacket) {
54306 + status = A_NO_MEMORY;
54307 + break;
54308 + }
54309 +
54310 + /* assemble setup complete message */
54311 + pSetupComplete = (HTC_SETUP_COMPLETE_MSG *)pSendPacket->pBuffer;
54312 + A_MEMZERO(pSetupComplete,sizeof(HTC_SETUP_COMPLETE_MSG));
54313 + pSetupComplete->MessageID = HTC_MSG_SETUP_COMPLETE_ID;
54314 +
54315 + SET_HTC_PACKET_INFO_TX(pSendPacket,
54316 + NULL,
54317 + (A_UINT8 *)pSetupComplete,
54318 + sizeof(HTC_SETUP_COMPLETE_MSG),
54319 + ENDPOINT_0,
54320 + HTC_SERVICE_TX_PACKET_TAG);
54321 +
54322 + /* we want synchronous operation */
54323 + pSendPacket->Completion = NULL;
54324 + /* send the message */
54325 + status = HTCIssueSend(target,pSendPacket,0);
54326 +
54327 + } while (FALSE);
54328 +
54329 + if (pSendPacket != NULL) {
54330 + HTC_FREE_CONTROL_TX(target,pSendPacket);
54331 + }
54332 +
54333 + return status;
54334 +}
54335 +
54336 +
54337 +A_STATUS HTCConnectService(HTC_HANDLE HTCHandle,
54338 + HTC_SERVICE_CONNECT_REQ *pConnectReq,
54339 + HTC_SERVICE_CONNECT_RESP *pConnectResp)
54340 +{
54341 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
54342 + A_STATUS status = A_OK;
54343 + HTC_PACKET *pRecvPacket = NULL;
54344 + HTC_PACKET *pSendPacket = NULL;
54345 + HTC_CONNECT_SERVICE_RESPONSE_MSG *pResponseMsg;
54346 + HTC_CONNECT_SERVICE_MSG *pConnectMsg;
54347 + HTC_ENDPOINT_ID assignedEndpoint = ENDPOINT_MAX;
54348 + HTC_ENDPOINT *pEndpoint;
54349 + int maxMsgSize = 0;
54350 +
54351 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("+HTCConnectService, target:0x%X SvcID:0x%X \n",
54352 + (A_UINT32)target, pConnectReq->ServiceID));
54353 +
54354 + do {
54355 +
54356 + AR_DEBUG_ASSERT(pConnectReq->ServiceID != 0);
54357 +
54358 + if (HTC_CTRL_RSVD_SVC == pConnectReq->ServiceID) {
54359 + /* special case for pseudo control service */
54360 + assignedEndpoint = ENDPOINT_0;
54361 + maxMsgSize = HTC_MAX_CONTROL_MESSAGE_LENGTH;
54362 + } else {
54363 + /* allocate a packet to send to the target */
54364 + pSendPacket = HTC_ALLOC_CONTROL_TX(target);
54365 +
54366 + if (NULL == pSendPacket) {
54367 + AR_DEBUG_ASSERT(FALSE);
54368 + status = A_NO_MEMORY;
54369 + break;
54370 + }
54371 + /* assemble connect service message */
54372 + pConnectMsg = (HTC_CONNECT_SERVICE_MSG *)pSendPacket->pBuffer;
54373 + AR_DEBUG_ASSERT(pConnectMsg != NULL);
54374 + A_MEMZERO(pConnectMsg,sizeof(HTC_CONNECT_SERVICE_MSG));
54375 + pConnectMsg->MessageID = HTC_MSG_CONNECT_SERVICE_ID;
54376 + pConnectMsg->ServiceID = pConnectReq->ServiceID;
54377 + pConnectMsg->ConnectionFlags = pConnectReq->ConnectionFlags;
54378 + /* check caller if it wants to transfer meta data */
54379 + if ((pConnectReq->pMetaData != NULL) &&
54380 + (pConnectReq->MetaDataLength <= HTC_SERVICE_META_DATA_MAX_LENGTH)) {
54381 + /* copy meta data into message buffer (after header ) */
54382 + A_MEMCPY((A_UINT8 *)pConnectMsg + sizeof(HTC_CONNECT_SERVICE_MSG),
54383 + pConnectReq->pMetaData,
54384 + pConnectReq->MetaDataLength);
54385 + pConnectMsg->ServiceMetaLength = pConnectReq->MetaDataLength;
54386 + }
54387 +
54388 + SET_HTC_PACKET_INFO_TX(pSendPacket,
54389 + NULL,
54390 + (A_UINT8 *)pConnectMsg,
54391 + sizeof(HTC_CONNECT_SERVICE_MSG) + pConnectMsg->ServiceMetaLength,
54392 + ENDPOINT_0,
54393 + HTC_SERVICE_TX_PACKET_TAG);
54394 +
54395 + /* we want synchronous operation */
54396 + pSendPacket->Completion = NULL;
54397 +
54398 + status = HTCIssueSend(target,pSendPacket,0);
54399 +
54400 + if (A_FAILED(status)) {
54401 + break;
54402 + }
54403 +
54404 + /* wait for response */
54405 + status = HTCWaitforControlMessage(target, &pRecvPacket);
54406 +
54407 + if (A_FAILED(status)) {
54408 + break;
54409 + }
54410 + /* we controlled the buffer creation so it has to be properly aligned */
54411 + pResponseMsg = (HTC_CONNECT_SERVICE_RESPONSE_MSG *)pRecvPacket->pBuffer;
54412 +
54413 + if ((pResponseMsg->MessageID != HTC_MSG_CONNECT_SERVICE_RESPONSE_ID) ||
54414 + (pRecvPacket->ActualLength < sizeof(HTC_CONNECT_SERVICE_RESPONSE_MSG))) {
54415 + /* this message is not valid */
54416 + AR_DEBUG_ASSERT(FALSE);
54417 + status = A_EPROTO;
54418 + break;
54419 + }
54420 +
54421 + pConnectResp->ConnectRespCode = pResponseMsg->Status;
54422 + /* check response status */
54423 + if (pResponseMsg->Status != HTC_SERVICE_SUCCESS) {
54424 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,
54425 + (" Target failed service 0x%X connect request (status:%d)\n",
54426 + pResponseMsg->ServiceID, pResponseMsg->Status));
54427 + status = A_EPROTO;
54428 + break;
54429 + }
54430 +
54431 + assignedEndpoint = pResponseMsg->EndpointID;
54432 + maxMsgSize = pResponseMsg->MaxMsgSize;
54433 +
54434 + if ((pConnectResp->pMetaData != NULL) &&
54435 + (pResponseMsg->ServiceMetaLength > 0) &&
54436 + (pResponseMsg->ServiceMetaLength <= HTC_SERVICE_META_DATA_MAX_LENGTH)) {
54437 + /* caller supplied a buffer and the target responded with data */
54438 + int copyLength = min((int)pConnectResp->BufferLength, (int)pResponseMsg->ServiceMetaLength);
54439 + /* copy the meta data */
54440 + A_MEMCPY(pConnectResp->pMetaData,
54441 + ((A_UINT8 *)pResponseMsg) + sizeof(HTC_CONNECT_SERVICE_RESPONSE_MSG),
54442 + copyLength);
54443 + pConnectResp->ActualLength = copyLength;
54444 + }
54445 +
54446 + }
54447 +
54448 + /* the rest of these are parameter checks so set the error status */
54449 + status = A_EPROTO;
54450 +
54451 + if (assignedEndpoint >= ENDPOINT_MAX) {
54452 + AR_DEBUG_ASSERT(FALSE);
54453 + break;
54454 + }
54455 +
54456 + if (0 == maxMsgSize) {
54457 + AR_DEBUG_ASSERT(FALSE);
54458 + break;
54459 + }
54460 +
54461 + pEndpoint = &target->EndPoint[assignedEndpoint];
54462 +
54463 + if (pEndpoint->ServiceID != 0) {
54464 + /* endpoint already in use! */
54465 + AR_DEBUG_ASSERT(FALSE);
54466 + break;
54467 + }
54468 +
54469 + /* return assigned endpoint to caller */
54470 + pConnectResp->Endpoint = assignedEndpoint;
54471 + pConnectResp->MaxMsgLength = maxMsgSize;
54472 +
54473 + /* setup the endpoint */
54474 + pEndpoint->ServiceID = pConnectReq->ServiceID; /* this marks the endpoint in use */
54475 + pEndpoint->MaxTxQueueDepth = pConnectReq->MaxSendQueueDepth;
54476 + pEndpoint->MaxMsgLength = maxMsgSize;
54477 + /* copy all the callbacks */
54478 + pEndpoint->EpCallBacks = pConnectReq->EpCallbacks;
54479 + INIT_HTC_PACKET_QUEUE(&pEndpoint->RxBuffers);
54480 + INIT_HTC_PACKET_QUEUE(&pEndpoint->TxQueue);
54481 + /* set the credit distribution info for this endpoint, this information is
54482 + * passed back to the credit distribution callback function */
54483 + pEndpoint->CreditDist.ServiceID = pConnectReq->ServiceID;
54484 + pEndpoint->CreditDist.pHTCReserved = pEndpoint;
54485 + pEndpoint->CreditDist.Endpoint = assignedEndpoint;
54486 + pEndpoint->CreditDist.TxCreditSize = target->TargetCreditSize;
54487 + pEndpoint->CreditDist.TxCreditsPerMaxMsg = maxMsgSize / target->TargetCreditSize;
54488 +
54489 + if (0 == pEndpoint->CreditDist.TxCreditsPerMaxMsg) {
54490 + pEndpoint->CreditDist.TxCreditsPerMaxMsg = 1;
54491 + }
54492 +
54493 + status = A_OK;
54494 +
54495 + } while (FALSE);
54496 +
54497 + if (pSendPacket != NULL) {
54498 + HTC_FREE_CONTROL_TX(target,pSendPacket);
54499 + }
54500 +
54501 + if (pRecvPacket != NULL) {
54502 + HTC_FREE_CONTROL_RX(target,pRecvPacket);
54503 + }
54504 +
54505 + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("-HTCConnectService \n"));
54506 +
54507 + return status;
54508 +}
54509 +
54510 +static void AddToEndpointDistList(HTC_TARGET *target, HTC_ENDPOINT_CREDIT_DIST *pEpDist)
54511 +{
54512 + HTC_ENDPOINT_CREDIT_DIST *pCurEntry,*pLastEntry;
54513 +
54514 + if (NULL == target->EpCreditDistributionListHead) {
54515 + target->EpCreditDistributionListHead = pEpDist;
54516 + pEpDist->pNext = NULL;
54517 + pEpDist->pPrev = NULL;
54518 + return;
54519 + }
54520 +
54521 + /* queue to the end of the list, this does not have to be very
54522 + * fast since this list is built at startup time */
54523 + pCurEntry = target->EpCreditDistributionListHead;
54524 +
54525 + while (pCurEntry) {
54526 + pLastEntry = pCurEntry;
54527 + pCurEntry = pCurEntry->pNext;
54528 + }
54529 +
54530 + pLastEntry->pNext = pEpDist;
54531 + pEpDist->pPrev = pLastEntry;
54532 + pEpDist->pNext = NULL;
54533 +}
54534 +
54535 +
54536 +
54537 +/* default credit init callback */
54538 +static void HTCDefaultCreditInit(void *Context,
54539 + HTC_ENDPOINT_CREDIT_DIST *pEPList,
54540 + int TotalCredits)
54541 +{
54542 + HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
54543 + int totalEps = 0;
54544 + int creditsPerEndpoint;
54545 +
54546 + pCurEpDist = pEPList;
54547 + /* first run through the list and figure out how many endpoints we are dealing with */
54548 + while (pCurEpDist != NULL) {
54549 + pCurEpDist = pCurEpDist->pNext;
54550 + totalEps++;
54551 + }
54552 +
54553 + /* even distribution */
54554 + creditsPerEndpoint = TotalCredits/totalEps;
54555 +
54556 + pCurEpDist = pEPList;
54557 + /* run through the list and set minimum and normal credits and
54558 + * provide the endpoint with some credits to start */
54559 + while (pCurEpDist != NULL) {
54560 +
54561 + if (creditsPerEndpoint < pCurEpDist->TxCreditsPerMaxMsg) {
54562 + /* too many endpoints and not enough credits */
54563 + AR_DEBUG_ASSERT(FALSE);
54564 + break;
54565 + }
54566 + /* our minimum is set for at least 1 max message */
54567 + pCurEpDist->TxCreditsMin = pCurEpDist->TxCreditsPerMaxMsg;
54568 + /* this value is ignored by our credit alg, since we do
54569 + * not dynamically adjust credits, this is the policy of
54570 + * the "default" credit distribution, something simple and easy */
54571 + pCurEpDist->TxCreditsNorm = 0xFFFF;
54572 + /* give the endpoint minimum credits */
54573 + pCurEpDist->TxCredits = creditsPerEndpoint;
54574 + pCurEpDist->TxCreditsAssigned = creditsPerEndpoint;
54575 + pCurEpDist = pCurEpDist->pNext;
54576 + }
54577 +
54578 +}
54579 +
54580 +/* default credit distribution callback, NOTE, this callback holds the TX lock */
54581 +void HTCDefaultCreditDist(void *Context,
54582 + HTC_ENDPOINT_CREDIT_DIST *pEPDistList,
54583 + HTC_CREDIT_DIST_REASON Reason)
54584 +{
54585 + HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
54586 +
54587 + if (Reason == HTC_CREDIT_DIST_SEND_COMPLETE) {
54588 + pCurEpDist = pEPDistList;
54589 + /* simple distribution */
54590 + while (pCurEpDist != NULL) {
54591 + if (pCurEpDist->TxCreditsToDist > 0) {
54592 + /* just give the endpoint back the credits */
54593 + pCurEpDist->TxCredits += pCurEpDist->TxCreditsToDist;
54594 + pCurEpDist->TxCreditsToDist = 0;
54595 + }
54596 + pCurEpDist = pCurEpDist->pNext;
54597 + }
54598 + }
54599 +
54600 + /* note we do not need to handle the other reason codes as this is a very
54601 + * simple distribution scheme, no need to seek for more credits or handle inactivity */
54602 +}
54603 +
54604 +void HTCSetCreditDistribution(HTC_HANDLE HTCHandle,
54605 + void *pCreditDistContext,
54606 + HTC_CREDIT_DIST_CALLBACK CreditDistFunc,
54607 + HTC_CREDIT_INIT_CALLBACK CreditInitFunc,
54608 + HTC_SERVICE_ID ServicePriorityOrder[],
54609 + int ListLength)
54610 +{
54611 + HTC_TARGET *target = GET_HTC_TARGET_FROM_HANDLE(HTCHandle);
54612 + int i;
54613 + int ep;
54614 +
54615 + if (CreditInitFunc != NULL) {
54616 + /* caller has supplied their own distribution functions */
54617 + target->InitCredits = CreditInitFunc;
54618 + AR_DEBUG_ASSERT(CreditDistFunc != NULL);
54619 + target->DistributeCredits = CreditDistFunc;
54620 + target->pCredDistContext = pCreditDistContext;
54621 + } else {
54622 + /* caller wants HTC to do distribution */
54623 + /* if caller wants service to handle distributions then
54624 + * it must set both of these to NULL! */
54625 + AR_DEBUG_ASSERT(CreditDistFunc == NULL);
54626 + target->InitCredits = HTCDefaultCreditInit;
54627 + target->DistributeCredits = HTCDefaultCreditDist;
54628 + target->pCredDistContext = target;
54629 + }
54630 +
54631 + /* always add HTC control endpoint first, we only expose the list after the
54632 + * first one, this is added for TX queue checking */
54633 + AddToEndpointDistList(target, &target->EndPoint[ENDPOINT_0].CreditDist);
54634 +
54635 + /* build the list of credit distribution structures in priority order
54636 + * supplied by the caller, these will follow endpoint 0 */
54637 + for (i = 0; i < ListLength; i++) {
54638 + /* match services with endpoints and add the endpoints to the distribution list
54639 + * in FIFO order */
54640 + for (ep = ENDPOINT_1; ep < ENDPOINT_MAX; ep++) {
54641 + if (target->EndPoint[ep].ServiceID == ServicePriorityOrder[i]) {
54642 + /* queue this one to the list */
54643 + AddToEndpointDistList(target, &target->EndPoint[ep].CreditDist);
54644 + break;
54645 + }
54646 + }
54647 + AR_DEBUG_ASSERT(ep < ENDPOINT_MAX);
54648 + }
54649 +
54650 +}
54651 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_config.h
54652 ===================================================================
54653 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
54654 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_config.h 2008-12-11 22:46:49.000000000 +0100
54655 @@ -0,0 +1,27 @@
54656 +#ifndef _A_CONFIG_H_
54657 +#define _A_CONFIG_H_
54658 +/*
54659 + * Copyright (c) 2004-2005 Atheros Communications Inc.
54660 + * All rights reserved.
54661 + *
54662 + *
54663 + * This program is free software; you can redistribute it and/or modify
54664 + * it under the terms of the GNU General Public License version 2 as
54665 + * published by the Free Software Foundation;
54666 + *
54667 + * Software distributed under the License is distributed on an "AS
54668 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
54669 + * implied. See the License for the specific language governing
54670 + * rights and limitations under the License.
54671 + *
54672 + *
54673 + *
54674 + */
54675 +
54676 +/*
54677 + * This file contains software configuration options that enables
54678 + * specific software "features"
54679 + */
54680 +#include "../ar6000/config_linux.h"
54681 +
54682 +#endif
54683 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_debug.h
54684 ===================================================================
54685 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
54686 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_debug.h 2008-12-11 22:46:49.000000000 +0100
54687 @@ -0,0 +1,41 @@
54688 +#ifndef _A_DEBUG_H_
54689 +#define _A_DEBUG_H_
54690 +/*
54691 + * Copyright (c) 2004-2006 Atheros Communications Inc.
54692 + * All rights reserved.
54693 + *
54694 + * Copyright (c) 2004-2007 Atheros Communications Inc.
54695 + * All rights reserved.
54696 + *
54697 + *
54698 + * This program is free software; you can redistribute it and/or modify
54699 + * it under the terms of the GNU General Public License version 2 as
54700 + * published by the Free Software Foundation;
54701 + *
54702 + * Software distributed under the License is distributed on an "AS
54703 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
54704 + * implied. See the License for the specific language governing
54705 + * rights and limitations under the License.
54706 + *
54707 + *
54708 + *
54709 + */
54710 +
54711 +#include <a_types.h>
54712 +#include <a_osapi.h>
54713 +
54714 +#define DBG_INFO 0x00000001
54715 +#define DBG_ERROR 0x00000002
54716 +#define DBG_WARNING 0x00000004
54717 +#define DBG_SDIO 0x00000008
54718 +#define DBG_HIF 0x00000010
54719 +#define DBG_HTC 0x00000020
54720 +#define DBG_WMI 0x00000040
54721 +#define DBG_WMI2 0x00000080
54722 +#define DBG_DRIVER 0x00000100
54723 +
54724 +#define DBG_DEFAULTS (DBG_ERROR|DBG_WARNING)
54725 +
54726 +#include "../ar6000/debug_linux.h"
54727 +
54728 +#endif
54729 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_drv_api.h
54730 ===================================================================
54731 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
54732 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_drv_api.h 2008-12-11 22:46:49.000000000 +0100
54733 @@ -0,0 +1,185 @@
54734 +#ifndef _A_DRV_API_H_
54735 +#define _A_DRV_API_H_
54736 +/*
54737 + * Copyright (c) 2004-2006 Atheros Communications Inc.
54738 + * All rights reserved.
54739 + *
54740 + *
54741 + * This program is free software; you can redistribute it and/or modify
54742 + * it under the terms of the GNU General Public License version 2 as
54743 + * published by the Free Software Foundation;
54744 + *
54745 + * Software distributed under the License is distributed on an "AS
54746 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
54747 + * implied. See the License for the specific language governing
54748 + * rights and limitations under the License.
54749 + *
54750 + *
54751 + *
54752 + */
54753 +
54754 +#ifdef __cplusplus
54755 +extern "C" {
54756 +#endif
54757 +
54758 +/****************************************************************************/
54759 +/****************************************************************************/
54760 +/** **/
54761 +/** WMI related hooks **/
54762 +/** **/
54763 +/****************************************************************************/
54764 +/****************************************************************************/
54765 +
54766 +#include <ar6000_api.h>
54767 +
54768 +#define A_WMI_CHANNELLIST_RX(devt, numChan, chanList) \
54769 + ar6000_channelList_rx((devt), (numChan), (chanList))
54770 +
54771 +#define A_WMI_SET_NUMDATAENDPTS(devt, num) \
54772 + ar6000_set_numdataendpts((devt), (num))
54773 +
54774 +#define A_WMI_CONTROL_TX(devt, osbuf, streamID) \
54775 + ar6000_control_tx((devt), (osbuf), (streamID))
54776 +
54777 +#define A_WMI_TARGETSTATS_EVENT(devt, pStats) \
54778 + ar6000_targetStats_event((devt), (pStats))
54779 +
54780 +#define A_WMI_SCANCOMPLETE_EVENT(devt, status) \
54781 + ar6000_scanComplete_event((devt), (status))
54782 +
54783 +#ifdef CONFIG_HOST_DSET_SUPPORT
54784 +
54785 +#define A_WMI_DSET_DATA_REQ(devt, access_cookie, offset, length, targ_buf, targ_reply_fn, targ_reply_arg) \
54786 + ar6000_dset_data_req((devt), (access_cookie), (offset), (length), (targ_buf), (targ_reply_fn), (targ_reply_arg))
54787 +
54788 +#define A_WMI_DSET_CLOSE(devt, access_cookie) \
54789 + ar6000_dset_close((devt), (access_cookie))
54790 +
54791 +#endif
54792 +
54793 +#define A_WMI_DSET_OPEN_REQ(devt, id, targ_handle, targ_reply_fn, targ_reply_arg) \
54794 + ar6000_dset_open_req((devt), (id), (targ_handle), (targ_reply_fn), (targ_reply_arg))
54795 +
54796 +#define A_WMI_CONNECT_EVENT(devt, channel, bssid, listenInterval, beaconInterval, networkType, beaconIeLen, assocReqLen, assocRespLen, assocInfo) \
54797 + ar6000_connect_event((devt), (channel), (bssid), (listenInterval), (beaconInterval), (networkType), (beaconIeLen), (assocReqLen), (assocRespLen), (assocInfo))
54798 +
54799 +#define A_WMI_REGDOMAIN_EVENT(devt, regCode) \
54800 + ar6000_regDomain_event((devt), (regCode))
54801 +
54802 +#define A_WMI_NEIGHBORREPORT_EVENT(devt, numAps, info) \
54803 + ar6000_neighborReport_event((devt), (numAps), (info))
54804 +
54805 +#define A_WMI_DISCONNECT_EVENT(devt, reason, bssid, assocRespLen, assocInfo, protocolReasonStatus) \
54806 + ar6000_disconnect_event((devt), (reason), (bssid), (assocRespLen), (assocInfo), (protocolReasonStatus))
54807 +
54808 +#define A_WMI_TKIP_MICERR_EVENT(devt, keyid, ismcast) \
54809 + ar6000_tkip_micerr_event((devt), (keyid), (ismcast))
54810 +
54811 +#define A_WMI_BITRATE_RX(devt, rateKbps) \
54812 + ar6000_bitrate_rx((devt), (rateKbps))
54813 +
54814 +#define A_WMI_TXPWR_RX(devt, txPwr) \
54815 + ar6000_txPwr_rx((devt), (txPwr))
54816 +
54817 +#define A_WMI_READY_EVENT(devt, datap, phyCap) \
54818 + ar6000_ready_event((devt), (datap), (phyCap))
54819 +
54820 +#define A_WMI_DBGLOG_INIT_DONE(ar) \
54821 + ar6000_dbglog_init_done(ar);
54822 +
54823 +#define A_WMI_RSSI_THRESHOLD_EVENT(devt, newThreshold, rssi) \
54824 + ar6000_rssiThreshold_event((devt), (newThreshold), (rssi))
54825 +
54826 +#define A_WMI_REPORT_ERROR_EVENT(devt, errorVal) \
54827 + ar6000_reportError_event((devt), (errorVal))
54828 +
54829 +#define A_WMI_ROAM_TABLE_EVENT(devt, pTbl) \
54830 + ar6000_roam_tbl_event((devt), (pTbl))
54831 +
54832 +#define A_WMI_ROAM_DATA_EVENT(devt, p) \
54833 + ar6000_roam_data_event((devt), (p))
54834 +
54835 +#define A_WMI_WOW_LIST_EVENT(devt, num_filters, wow_filters) \
54836 + ar6000_wow_list_event((devt), (num_filters), (wow_filters))
54837 +
54838 +#define A_WMI_CAC_EVENT(devt, ac, cac_indication, statusCode, tspecSuggestion) \
54839 + ar6000_cac_event((devt), (ac), (cac_indication), (statusCode), (tspecSuggestion))
54840 +
54841 +#define A_WMI_IPTOS_TO_USERPRIORITY(pkt) \
54842 + ar6000_iptos_to_userPriority((pkt))
54843 +
54844 +#define A_WMI_PMKID_LIST_EVENT(devt, num_pmkid, pmkid_list) \
54845 + ar6000_pmkid_list_event((devt), (num_pmkid), (pmkid_list))
54846 +
54847 +#ifdef CONFIG_HOST_GPIO_SUPPORT
54848 +
54849 +#define A_WMI_GPIO_INTR_RX(intr_mask, input_values) \
54850 + ar6000_gpio_intr_rx((intr_mask), (input_values))
54851 +
54852 +#define A_WMI_GPIO_DATA_RX(reg_id, value) \
54853 + ar6000_gpio_data_rx((reg_id), (value))
54854 +
54855 +#define A_WMI_GPIO_ACK_RX() \
54856 + ar6000_gpio_ack_rx()
54857 +
54858 +#endif
54859 +
54860 +#ifdef SEND_EVENT_TO_APP
54861 +
54862 +#define A_WMI_SEND_EVENT_TO_APP(ar, eventId, datap, len) \
54863 + ar6000_send_event_to_app((ar), (eventId), (datap), (len))
54864 +
54865 +#else
54866 +
54867 +#define A_WMI_SEND_EVENT_TO_APP(ar, eventId, datap, len)
54868 +
54869 +#endif
54870 +
54871 +#ifdef CONFIG_HOST_TCMD_SUPPORT
54872 +#define A_WMI_TCMD_RX_REPORT_EVENT(devt, results, len) \
54873 + ar6000_tcmd_rx_report_event((devt), (results), (len))
54874 +#endif
54875 +
54876 +#define A_WMI_HBCHALLENGERESP_EVENT(devt, cookie, source) \
54877 + ar6000_hbChallengeResp_event((devt), (cookie), (source))
54878 +
54879 +#define A_WMI_TX_RETRY_ERR_EVENT(devt) \
54880 + ar6000_tx_retry_err_event((devt))
54881 +
54882 +#define A_WMI_SNR_THRESHOLD_EVENT_RX(devt, newThreshold, snr) \
54883 + ar6000_snrThresholdEvent_rx((devt), (newThreshold), (snr))
54884 +
54885 +#define A_WMI_LQ_THRESHOLD_EVENT_RX(devt, range, lqVal) \
54886 + ar6000_lqThresholdEvent_rx((devt), (range), (lqVal))
54887 +
54888 +#define A_WMI_RATEMASK_RX(devt, ratemask) \
54889 + ar6000_ratemask_rx((devt), (ratemask))
54890 +
54891 +#define A_WMI_KEEPALIVE_RX(devt, configured) \
54892 + ar6000_keepalive_rx((devt), (configured))
54893 +
54894 +#define A_WMI_BSSINFO_EVENT_RX(ar, datp, len) \
54895 + ar6000_bssInfo_event_rx((ar), (datap), (len))
54896 +
54897 +#define A_WMI_DBGLOG_EVENT(ar, dropped, buffer, length) \
54898 + ar6000_dbglog_event((ar), (dropped), (buffer), (length));
54899 +
54900 +#define A_WMI_STREAM_TX_ACTIVE(devt,trafficClass) \
54901 + ar6000_indicate_tx_activity((devt),(trafficClass), TRUE)
54902 +
54903 +#define A_WMI_STREAM_TX_INACTIVE(devt,trafficClass) \
54904 + ar6000_indicate_tx_activity((devt),(trafficClass), FALSE)
54905 +
54906 +/****************************************************************************/
54907 +/****************************************************************************/
54908 +/** **/
54909 +/** HTC related hooks **/
54910 +/** **/
54911 +/****************************************************************************/
54912 +/****************************************************************************/
54913 +
54914 +#ifdef __cplusplus
54915 +}
54916 +#endif
54917 +
54918 +#endif
54919 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_drv.h
54920 ===================================================================
54921 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
54922 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_drv.h 2008-12-11 22:46:49.000000000 +0100
54923 @@ -0,0 +1,28 @@
54924 +#ifndef _A_DRV_H_
54925 +#define _A_DRV_H_
54926 +/*
54927 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_drv.h#1 $
54928 + *
54929 + * This file contains the definitions of the basic atheros data types.
54930 + * It is used to map the data types in atheros files to a platform specific
54931 + * type.
54932 + *
54933 + * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
54934 + *
54935 + *
54936 + * This program is free software; you can redistribute it and/or modify
54937 + * it under the terms of the GNU General Public License version 2 as
54938 + * published by the Free Software Foundation;
54939 + *
54940 + * Software distributed under the License is distributed on an "AS
54941 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
54942 + * implied. See the License for the specific language governing
54943 + * rights and limitations under the License.
54944 + *
54945 + *
54946 + *
54947 + */
54948 +
54949 +#include "../ar6000/athdrv_linux.h"
54950 +
54951 +#endif /* _ADRV_H_ */
54952 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_osapi.h
54953 ===================================================================
54954 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
54955 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_osapi.h 2008-12-11 22:46:49.000000000 +0100
54956 @@ -0,0 +1,28 @@
54957 +#ifndef _A_OSAPI_H_
54958 +#define _A_OSAPI_H_
54959 +/*
54960 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_osapi.h#1 $
54961 + *
54962 + * This file contains the definitions of the basic atheros data types.
54963 + * It is used to map the data types in atheros files to a platform specific
54964 + * type.
54965 + *
54966 + * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
54967 + *
54968 + *
54969 + * This program is free software; you can redistribute it and/or modify
54970 + * it under the terms of the GNU General Public License version 2 as
54971 + * published by the Free Software Foundation;
54972 + *
54973 + * Software distributed under the License is distributed on an "AS
54974 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
54975 + * implied. See the License for the specific language governing
54976 + * rights and limitations under the License.
54977 + *
54978 + *
54979 + *
54980 + */
54981 +
54982 +#include "../ar6000/osapi_linux.h"
54983 +
54984 +#endif /* _OSAPI_H_ */
54985 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ar6000_api.h
54986 ===================================================================
54987 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
54988 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ar6000_api.h 2008-12-11 22:46:49.000000000 +0100
54989 @@ -0,0 +1,29 @@
54990 +#ifndef _AR6000_API_H_
54991 +#define _AR6000_API_H_
54992 +/*
54993 + * Copyright (c) 2004-2005 Atheros Communications Inc.
54994 + * All rights reserved.
54995 + *
54996 + * This file contains the API to access the OS dependent atheros host driver
54997 + * by the WMI or WLAN generic modules.
54998 + *
54999 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/ar6000_api.h#1 $
55000 + *
55001 + *
55002 + * This program is free software; you can redistribute it and/or modify
55003 + * it under the terms of the GNU General Public License version 2 as
55004 + * published by the Free Software Foundation;
55005 + *
55006 + * Software distributed under the License is distributed on an "AS
55007 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55008 + * implied. See the License for the specific language governing
55009 + * rights and limitations under the License.
55010 + *
55011 + *
55012 + *
55013 + */
55014 +
55015 +#include "../ar6000/ar6xapi_linux.h"
55016 +
55017 +#endif /* _AR6000_API_H */
55018 +
55019 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ar6000_diag.h
55020 ===================================================================
55021 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55022 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ar6000_diag.h 2008-12-11 22:46:49.000000000 +0100
55023 @@ -0,0 +1,38 @@
55024 +/*
55025 + *
55026 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55027 + * All rights reserved.
55028 + *
55029 + *
55030 + * This program is free software; you can redistribute it and/or modify
55031 + * it under the terms of the GNU General Public License version 2 as
55032 + * published by the Free Software Foundation;
55033 + *
55034 + * Software distributed under the License is distributed on an "AS
55035 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55036 + * implied. See the License for the specific language governing
55037 + * rights and limitations under the License.
55038 + *
55039 + *
55040 + *
55041 + */
55042 +
55043 +#ifndef AR6000_DIAG_H_
55044 +#define AR6000_DIAG_H_
55045 +
55046 +
55047 +A_STATUS
55048 +ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
55049 +
55050 +A_STATUS
55051 +ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
55052 +
55053 +A_STATUS
55054 +ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
55055 + A_UCHAR *data, A_UINT32 length);
55056 +
55057 +A_STATUS
55058 +ar6000_WriteDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
55059 + A_UCHAR *data, A_UINT32 length);
55060 +
55061 +#endif /*AR6000_DIAG_H_*/
55062 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/AR6001_regdump.h
55063 ===================================================================
55064 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55065 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/AR6001_regdump.h 2008-12-11 22:46:49.000000000 +0100
55066 @@ -0,0 +1,100 @@
55067 +/*
55068 + * Copyright (c) 2006 Atheros Communications Inc.
55069 + * All rights reserved.
55070 + *
55071 + * $ATH_LICENSE_HOSTSDK0_C$
55072 + *
55073 + */
55074 +
55075 +#ifndef __AR6000_REGDUMP_H__
55076 +#define __AR6000_REGDUMP_H__
55077 +
55078 +#if !defined(__ASSEMBLER__)
55079 +/*
55080 + * Target CPU state at the time of failure is reflected
55081 + * in a register dump, which the Host can fetch through
55082 + * the diagnostic window.
55083 + */
55084 +
55085 +struct MIPS_exception_frame_s {
55086 + A_UINT32 pc; /* Program Counter */
55087 + A_UINT32 at; /* MIPS General Purpose registers */
55088 + A_UINT32 v0;
55089 + A_UINT32 v1;
55090 + A_UINT32 a0;
55091 + A_UINT32 a1;
55092 + A_UINT32 a2;
55093 + A_UINT32 a3;
55094 + A_UINT32 t0;
55095 + A_UINT32 t1;
55096 + A_UINT32 t2;
55097 + A_UINT32 t3;
55098 + A_UINT32 t4;
55099 + A_UINT32 t5;
55100 + A_UINT32 t6;
55101 + A_UINT32 t7;
55102 + A_UINT32 s0;
55103 + A_UINT32 s1;
55104 + A_UINT32 s2;
55105 + A_UINT32 s3;
55106 + A_UINT32 s4;
55107 + A_UINT32 s5;
55108 + A_UINT32 s6;
55109 + A_UINT32 s7;
55110 + A_UINT32 t8;
55111 + A_UINT32 t9;
55112 + A_UINT32 k0;
55113 + A_UINT32 k1;
55114 + A_UINT32 gp;
55115 + A_UINT32 sp;
55116 + A_UINT32 s8;
55117 + A_UINT32 ra;
55118 + A_UINT32 cause; /* Selected coprocessor regs */
55119 + A_UINT32 status;
55120 +};
55121 +typedef struct MIPS_exception_frame_s CPU_exception_frame_t;
55122 +
55123 +#endif
55124 +
55125 +/*
55126 + * Offsets into MIPS_exception_frame structure, for use in assembler code
55127 + * MUST MATCH C STRUCTURE ABOVE
55128 + */
55129 +#define RD_pc 0
55130 +#define RD_at 1
55131 +#define RD_v0 2
55132 +#define RD_v1 3
55133 +#define RD_a0 4
55134 +#define RD_a1 5
55135 +#define RD_a2 6
55136 +#define RD_a3 7
55137 +#define RD_t0 8
55138 +#define RD_t1 9
55139 +#define RD_t2 10
55140 +#define RD_t3 11
55141 +#define RD_t4 12
55142 +#define RD_t5 13
55143 +#define RD_t6 14
55144 +#define RD_t7 15
55145 +#define RD_s0 16
55146 +#define RD_s1 17
55147 +#define RD_s2 18
55148 +#define RD_s3 19
55149 +#define RD_s4 20
55150 +#define RD_s5 21
55151 +#define RD_s6 22
55152 +#define RD_s7 23
55153 +#define RD_t8 24
55154 +#define RD_t9 25
55155 +#define RD_k0 26
55156 +#define RD_k1 27
55157 +#define RD_gp 28
55158 +#define RD_sp 29
55159 +#define RD_s8 30
55160 +#define RD_ra 31
55161 +#define RD_cause 32
55162 +#define RD_status 33
55163 +
55164 +#define RD_SIZE (34*4) /* Space for this number of words */
55165 +
55166 +#endif /* __AR6000_REGDUMP_H__ */
55167 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/AR6Khwreg.h
55168 ===================================================================
55169 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55170 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/AR6Khwreg.h 2008-12-11 22:46:49.000000000 +0100
55171 @@ -0,0 +1,147 @@
55172 +/*
55173 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55174 + * All rights reserved.
55175 + *
55176 + * $ATH_LICENSE_HOSTSDK0_C$
55177 + *
55178 + * This file contains the definitions for AR6001 registers
55179 + * that may be directly manipulated by Host software.
55180 + */
55181 +
55182 +#ifndef __AR6KHWREG_H__
55183 +#define __AR6KHWREG_H__
55184 +
55185 +#ifdef __cplusplus
55186 +extern "C" {
55187 +#endif
55188 +
55189 +/* Host registers */
55190 +#define HOST_INT_STATUS_ADDRESS 0x00000400
55191 +#define CPU_INT_STATUS_ADDRESS 0x00000401
55192 +#define ERROR_INT_STATUS_ADDRESS 0x00000402
55193 +#define INT_STATUS_ENABLE_ADDRESS 0x00000418
55194 +#define CPU_INT_STATUS_ENABLE_ADDRESS 0x00000419
55195 +#define COUNT_ADDRESS 0x00000420
55196 +#define COUNT_DEC_ADDRESS 0x00000440
55197 +#define WINDOW_DATA_ADDRESS 0x00000474
55198 +#define WINDOW_WRITE_ADDR_ADDRESS 0x00000478
55199 +#define WINDOW_READ_ADDR_ADDRESS 0x0000047c
55200 +
55201 +/* Target addresses */
55202 +#define RESET_CONTROL_ADDRESS 0x0c000000
55203 +#define MC_REMAP_VALID_ADDRESS 0x0c004080
55204 +#define MC_REMAP_SIZE_ADDRESS 0x0c004100
55205 +#define MC_REMAP_COMPARE_ADDRESS 0x0c004180
55206 +#define MC_REMAP_TARGET_ADDRESS 0x0c004200
55207 +#define LOCAL_COUNT_ADDRESS 0x0c014080
55208 +#define LOCAL_SCRATCH_ADDRESS 0x0c0140c0
55209 +
55210 +
55211 +#define INT_STATUS_ENABLE_ERROR_MSB 7
55212 +#define INT_STATUS_ENABLE_ERROR_LSB 7
55213 +#define INT_STATUS_ENABLE_ERROR_MASK 0x00000080
55214 +#define INT_STATUS_ENABLE_ERROR_GET(x) (((x) & INT_STATUS_ENABLE_ERROR_MASK) >> INT_STATUS_ENABLE_ERROR_LSB)
55215 +#define INT_STATUS_ENABLE_ERROR_SET(x) (((x) << INT_STATUS_ENABLE_ERROR_LSB) & INT_STATUS_ENABLE_ERROR_MASK)
55216 +
55217 +#define INT_STATUS_ENABLE_CPU_MSB 6
55218 +#define INT_STATUS_ENABLE_CPU_LSB 6
55219 +#define INT_STATUS_ENABLE_CPU_MASK 0x00000040
55220 +#define INT_STATUS_ENABLE_CPU_GET(x) (((x) & INT_STATUS_ENABLE_CPU_MASK) >> INT_STATUS_ENABLE_CPU_LSB)
55221 +#define INT_STATUS_ENABLE_CPU_SET(x) (((x) << INT_STATUS_ENABLE_CPU_LSB) & INT_STATUS_ENABLE_CPU_MASK)
55222 +
55223 +#define INT_STATUS_ENABLE_COUNTER_MSB 4
55224 +#define INT_STATUS_ENABLE_COUNTER_LSB 4
55225 +#define INT_STATUS_ENABLE_COUNTER_MASK 0x00000010
55226 +#define INT_STATUS_ENABLE_COUNTER_GET(x) (((x) & INT_STATUS_ENABLE_COUNTER_MASK) >> INT_STATUS_ENABLE_COUNTER_LSB)
55227 +#define INT_STATUS_ENABLE_COUNTER_SET(x) (((x) << INT_STATUS_ENABLE_COUNTER_LSB) & INT_STATUS_ENABLE_COUNTER_MASK)
55228 +
55229 +#define INT_STATUS_ENABLE_MBOX_DATA_MSB 3
55230 +#define INT_STATUS_ENABLE_MBOX_DATA_LSB 0
55231 +#define INT_STATUS_ENABLE_MBOX_DATA_MASK 0x0000000f
55232 +#define INT_STATUS_ENABLE_MBOX_DATA_GET(x) (((x) & INT_STATUS_ENABLE_MBOX_DATA_MASK) >> INT_STATUS_ENABLE_MBOX_DATA_LSB)
55233 +#define INT_STATUS_ENABLE_MBOX_DATA_SET(x) (((x) << INT_STATUS_ENABLE_MBOX_DATA_LSB) & INT_STATUS_ENABLE_MBOX_DATA_MASK)
55234 +
55235 +#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_MSB 1
55236 +#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB 1
55237 +#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK 0x00000002
55238 +#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_GET(x) (((x) & ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK) >> ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB)
55239 +#define ERROR_STATUS_ENABLE_RX_UNDERFLOW_SET(x) (((x) << ERROR_STATUS_ENABLE_RX_UNDERFLOW_LSB) & ERROR_STATUS_ENABLE_RX_UNDERFLOW_MASK)
55240 +
55241 +#define ERROR_STATUS_ENABLE_TX_OVERFLOW_MSB 0
55242 +#define ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB 0
55243 +#define ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK 0x00000001
55244 +#define ERROR_STATUS_ENABLE_TX_OVERFLOW_GET(x) (((x) & ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK) >> ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB)
55245 +#define ERROR_STATUS_ENABLE_TX_OVERFLOW_SET(x) (((x) << ERROR_STATUS_ENABLE_TX_OVERFLOW_LSB) & ERROR_STATUS_ENABLE_TX_OVERFLOW_MASK)
55246 +
55247 +
55248 +#define CPU_INT_STATUS_ENABLE_BIT_MSB 7
55249 +#define CPU_INT_STATUS_ENABLE_BIT_LSB 0
55250 +#define CPU_INT_STATUS_ENABLE_BIT_MASK 0x000000ff
55251 +#define CPU_INT_STATUS_ENABLE_BIT_GET(x) (((x) & CPU_INT_STATUS_ENABLE_BIT_MASK) >> CPU_INT_STATUS_ENABLE_BIT_LSB)
55252 +#define CPU_INT_STATUS_ENABLE_BIT_SET(x) (((x) << CPU_INT_STATUS_ENABLE_BIT_LSB) & CPU_INT_STATUS_ENABLE_BIT_MASK)
55253 +
55254 +#define COUNTER_INT_STATUS_ENABLE_BIT_MSB 7
55255 +#define COUNTER_INT_STATUS_ENABLE_BIT_LSB 0
55256 +#define COUNTER_INT_STATUS_ENABLE_BIT_MASK 0x000000ff
55257 +#define COUNTER_INT_STATUS_ENABLE_BIT_GET(x) (((x) & COUNTER_INT_STATUS_ENABLE_BIT_MASK) >> COUNTER_INT_STATUS_ENABLE_BIT_LSB)
55258 +#define COUNTER_INT_STATUS_ENABLE_BIT_SET(x) (((x) << COUNTER_INT_STATUS_ENABLE_BIT_LSB) & COUNTER_INT_STATUS_ENABLE_BIT_MASK)
55259 +
55260 +#define ERROR_INT_STATUS_WAKEUP_MSB 2
55261 +#define ERROR_INT_STATUS_WAKEUP_LSB 2
55262 +#define ERROR_INT_STATUS_WAKEUP_MASK 0x00000004
55263 +#define ERROR_INT_STATUS_WAKEUP_GET(x) (((x) & ERROR_INT_STATUS_WAKEUP_MASK) >> ERROR_INT_STATUS_WAKEUP_LSB)
55264 +#define ERROR_INT_STATUS_WAKEUP_SET(x) (((x) << ERROR_INT_STATUS_WAKEUP_LSB) & ERROR_INT_STATUS_WAKEUP_MASK)
55265 +
55266 +#define ERROR_INT_STATUS_RX_UNDERFLOW_MSB 1
55267 +#define ERROR_INT_STATUS_RX_UNDERFLOW_LSB 1
55268 +#define ERROR_INT_STATUS_RX_UNDERFLOW_MASK 0x00000002
55269 +#define ERROR_INT_STATUS_RX_UNDERFLOW_GET(x) (((x) & ERROR_INT_STATUS_RX_UNDERFLOW_MASK) >> ERROR_INT_STATUS_RX_UNDERFLOW_LSB)
55270 +#define ERROR_INT_STATUS_RX_UNDERFLOW_SET(x) (((x) << ERROR_INT_STATUS_RX_UNDERFLOW_LSB) & ERROR_INT_STATUS_RX_UNDERFLOW_MASK)
55271 +
55272 +#define ERROR_INT_STATUS_TX_OVERFLOW_MSB 0
55273 +#define ERROR_INT_STATUS_TX_OVERFLOW_LSB 0
55274 +#define ERROR_INT_STATUS_TX_OVERFLOW_MASK 0x00000001
55275 +#define ERROR_INT_STATUS_TX_OVERFLOW_GET(x) (((x) & ERROR_INT_STATUS_TX_OVERFLOW_MASK) >> ERROR_INT_STATUS_TX_OVERFLOW_LSB)
55276 +#define ERROR_INT_STATUS_TX_OVERFLOW_SET(x) (((x) << ERROR_INT_STATUS_TX_OVERFLOW_LSB) & ERROR_INT_STATUS_TX_OVERFLOW_MASK)
55277 +
55278 +#define HOST_INT_STATUS_ERROR_MSB 7
55279 +#define HOST_INT_STATUS_ERROR_LSB 7
55280 +#define HOST_INT_STATUS_ERROR_MASK 0x00000080
55281 +#define HOST_INT_STATUS_ERROR_GET(x) (((x) & HOST_INT_STATUS_ERROR_MASK) >> HOST_INT_STATUS_ERROR_LSB)
55282 +#define HOST_INT_STATUS_ERROR_SET(x) (((x) << HOST_INT_STATUS_ERROR_LSB) & HOST_INT_STATUS_ERROR_MASK)
55283 +
55284 +#define HOST_INT_STATUS_CPU_MSB 6
55285 +#define HOST_INT_STATUS_CPU_LSB 6
55286 +#define HOST_INT_STATUS_CPU_MASK 0x00000040
55287 +#define HOST_INT_STATUS_CPU_GET(x) (((x) & HOST_INT_STATUS_CPU_MASK) >> HOST_INT_STATUS_CPU_LSB)
55288 +#define HOST_INT_STATUS_CPU_SET(x) (((x) << HOST_INT_STATUS_CPU_LSB) & HOST_INT_STATUS_CPU_MASK)
55289 +
55290 +#define HOST_INT_STATUS_COUNTER_MSB 4
55291 +#define HOST_INT_STATUS_COUNTER_LSB 4
55292 +#define HOST_INT_STATUS_COUNTER_MASK 0x00000010
55293 +#define HOST_INT_STATUS_COUNTER_GET(x) (((x) & HOST_INT_STATUS_COUNTER_MASK) >> HOST_INT_STATUS_COUNTER_LSB)
55294 +#define HOST_INT_STATUS_COUNTER_SET(x) (((x) << HOST_INT_STATUS_COUNTER_LSB) & HOST_INT_STATUS_COUNTER_MASK)
55295 +
55296 +#define RESET_CONTROL_WARM_RST_MSB 7
55297 +#define RESET_CONTROL_WARM_RST_LSB 7
55298 +#define RESET_CONTROL_WARM_RST_MASK 0x00000080
55299 +#define RESET_CONTROL_WARM_RST_GET(x) (((x) & RESET_CONTROL_WARM_RST_MASK) >> RESET_CONTROL_WARM_RST_LSB)
55300 +#define RESET_CONTROL_WARM_RST_SET(x) (((x) << RESET_CONTROL_WARM_RST_LSB) & RESET_CONTROL_WARM_RST_MASK)
55301 +
55302 +#define RESET_CONTROL_COLD_RST_MSB 8
55303 +#define RESET_CONTROL_COLD_RST_LSB 8
55304 +#define RESET_CONTROL_COLD_RST_MASK 0x00000100
55305 +#define RESET_CONTROL_COLD_RST_GET(x) (((x) & RESET_CONTROL_COLD_RST_MASK) >> RESET_CONTROL_COLD_RST_LSB)
55306 +#define RESET_CONTROL_COLD_RST_SET(x) (((x) << RESET_CONTROL_COLD_RST_LSB) & RESET_CONTROL_COLD_RST_MASK)
55307 +
55308 +#define RESET_CAUSE_LAST_MSB 2
55309 +#define RESET_CAUSE_LAST_LSB 0
55310 +#define RESET_CAUSE_LAST_MASK 0x00000007
55311 +#define RESET_CAUSE_LAST_GET(x) (((x) & RESET_CAUSE_LAST_MASK) >> RESET_CAUSE_LAST_LSB)
55312 +#define RESET_CAUSE_LAST_SET(x) (((x) << RESET_CAUSE_LAST_LSB) & RESET_CAUSE_LAST_MASK)
55313 +
55314 +#ifdef __cplusplus
55315 +}
55316 +#endif
55317 +
55318 +#endif /* __AR6KHWREG_H__ */
55319 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/AR6K_version.h
55320 ===================================================================
55321 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55322 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/AR6K_version.h 2008-12-11 22:46:49.000000000 +0100
55323 @@ -0,0 +1,36 @@
55324 +#define __VER_MAJOR_ 2
55325 +#define __VER_MINOR_ 0
55326 +#define __VER_PATCH_ 0
55327 +
55328 +
55329 +/*
55330 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55331 + * All rights reserved.
55332 + *
55333 + * $ATH_LICENSE_HOSTSDK0_C$
55334 + *
55335 + * The makear6ksdk script (used for release builds) modifies the following line.
55336 + */
55337 +#define __BUILD_NUMBER_ 18
55338 +
55339 +
55340 +/* Format of the version number. */
55341 +#define VER_MAJOR_BIT_OFFSET 28
55342 +#define VER_MINOR_BIT_OFFSET 24
55343 +#define VER_PATCH_BIT_OFFSET 16
55344 +#define VER_BUILD_NUM_BIT_OFFSET 0
55345 +
55346 +
55347 +/*
55348 + * The version has the following format:
55349 + * Bits 28-31: Major version
55350 + * Bits 24-27: Minor version
55351 + * Bits 16-23: Patch version
55352 + * Bits 0-15: Build number (automatically generated during build process )
55353 + * E.g. Build 1.1.3.7 would be represented as 0x11030007.
55354 + *
55355 + * DO NOT split the following macro into multiple lines as this may confuse the build scripts.
55356 + */
55357 +#define AR6K_SW_VERSION ( ( __VER_MAJOR_ << VER_MAJOR_BIT_OFFSET ) + ( __VER_MINOR_ << VER_MINOR_BIT_OFFSET ) + ( __VER_PATCH_ << VER_PATCH_BIT_OFFSET ) + ( __BUILD_NUMBER_ << VER_BUILD_NUM_BIT_OFFSET ) )
55358 +
55359 +
55360 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/AR6K_version.h.NEW
55361 ===================================================================
55362 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55363 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/AR6K_version.h.NEW 2008-12-11 22:46:49.000000000 +0100
55364 @@ -0,0 +1,36 @@
55365 +#define __VER_MAJOR_ 2
55366 +#define __VER_MINOR_ 0
55367 +#define __VER_PATCH_ 0
55368 +
55369 +
55370 +/*
55371 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55372 + * All rights reserved.
55373 + *
55374 + * $ATH_LICENSE_HOSTSDK0_C$
55375 + *
55376 + * The makear6ksdk script (used for release builds) modifies the following line.
55377 + */
55378 +#define __BUILD_NUMBER_ 18
55379 +
55380 +
55381 +/* Format of the version number. */
55382 +#define VER_MAJOR_BIT_OFFSET 28
55383 +#define VER_MINOR_BIT_OFFSET 24
55384 +#define VER_PATCH_BIT_OFFSET 16
55385 +#define VER_BUILD_NUM_BIT_OFFSET 0
55386 +
55387 +
55388 +/*
55389 + * The version has the following format:
55390 + * Bits 28-31: Major version
55391 + * Bits 24-27: Minor version
55392 + * Bits 16-23: Patch version
55393 + * Bits 0-15: Build number (automatically generated during build process )
55394 + * E.g. Build 1.1.3.7 would be represented as 0x11030007.
55395 + *
55396 + * DO NOT split the following macro into multiple lines as this may confuse the build scripts.
55397 + */
55398 +#define AR6K_SW_VERSION ( ( __VER_MAJOR_ << VER_MAJOR_BIT_OFFSET ) + ( __VER_MINOR_ << VER_MINOR_BIT_OFFSET ) + ( __VER_PATCH_ << VER_PATCH_BIT_OFFSET ) + ( __BUILD_NUMBER_ << VER_BUILD_NUM_BIT_OFFSET ) )
55399 +
55400 +
55401 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/athdefs.h
55402 ===================================================================
55403 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55404 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/athdefs.h 2008-12-11 22:46:49.000000000 +0100
55405 @@ -0,0 +1,85 @@
55406 +#ifndef __ATHDEFS_H__
55407 +#define __ATHDEFS_H__
55408 +
55409 +/*
55410 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55411 + * All rights reserved.
55412 + *
55413 + * $ATH_LICENSE_HOSTSDK0_C$
55414 + *
55415 + * This file contains definitions that may be used across both
55416 + * Host and Target software. Nothing here is module-dependent
55417 + * or platform-dependent.
55418 + */
55419 +
55420 +/*
55421 + * Generic error codes that can be used by hw, sta, ap, sim, dk
55422 + * and any other environments. Since these are enums, feel free to
55423 + * add any more codes that you need.
55424 + */
55425 +
55426 +typedef enum {
55427 + A_ERROR = -1, /* Generic error return */
55428 + A_OK = 0, /* success */
55429 + /* Following values start at 1 */
55430 + A_DEVICE_NOT_FOUND, /* not able to find PCI device */
55431 + A_NO_MEMORY, /* not able to allocate memory, not available */
55432 + A_MEMORY_NOT_AVAIL, /* memory region is not free for mapping */
55433 + A_NO_FREE_DESC, /* no free descriptors available */
55434 + A_BAD_ADDRESS, /* address does not match descriptor */
55435 + A_WIN_DRIVER_ERROR, /* used in NT_HW version, if problem at init */
55436 + A_REGS_NOT_MAPPED, /* registers not correctly mapped */
55437 + A_EPERM, /* Not superuser */
55438 + A_EACCES, /* Access denied */
55439 + A_ENOENT, /* No such entry, search failed, etc. */
55440 + A_EEXIST, /* The object already exists (can't create) */
55441 + A_EFAULT, /* Bad address fault */
55442 + A_EBUSY, /* Object is busy */
55443 + A_EINVAL, /* Invalid parameter */
55444 + A_EMSGSIZE, /* Inappropriate message buffer length */
55445 + A_ECANCELED, /* Operation canceled */
55446 + A_ENOTSUP, /* Operation not supported */
55447 + A_ECOMM, /* Communication error on send */
55448 + A_EPROTO, /* Protocol error */
55449 + A_ENODEV, /* No such device */
55450 + A_EDEVNOTUP, /* device is not UP */
55451 + A_NO_RESOURCE, /* No resources for requested operation */
55452 + A_HARDWARE, /* Hardware failure */
55453 + A_PENDING, /* Asynchronous routine; will send up results la
55454 +ter (typically in callback) */
55455 + A_EBADCHANNEL, /* The channel cannot be used */
55456 + A_DECRYPT_ERROR, /* Decryption error */
55457 + A_PHY_ERROR, /* RX PHY error */
55458 + A_CONSUMED /* Object was consumed */
55459 +} A_STATUS;
55460 +
55461 +#define A_SUCCESS(x) (x == A_OK)
55462 +#define A_FAILED(x) (!A_SUCCESS(x))
55463 +
55464 +#ifndef TRUE
55465 +#define TRUE 1
55466 +#endif
55467 +
55468 +#ifndef FALSE
55469 +#define FALSE 0
55470 +#endif
55471 +
55472 +/*
55473 + * The following definition is WLAN specific definition
55474 + */
55475 +typedef enum {
55476 + MODE_11A = 0, /* 11a Mode */
55477 + MODE_11G = 1, /* 11g + 11b Mode */
55478 + MODE_11B = 2, /* 11b Mode */
55479 + MODE_11GONLY = 3, /* 11g only Mode */
55480 + MODE_UNKNOWN = 4,
55481 + MODE_MAX = 4
55482 +} WLAN_PHY_MODE;
55483 +
55484 +typedef enum {
55485 + WLAN_11A_CAPABILITY = 1,
55486 + WLAN_11G_CAPABILITY = 2,
55487 + WLAN_11AG_CAPABILITY = 3,
55488 +}WLAN_CAPABILITY;
55489 +
55490 +#endif /* __ATHDEFS_H__ */
55491 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/athdrv.h
55492 ===================================================================
55493 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55494 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/athdrv.h 2008-12-11 22:46:49.000000000 +0100
55495 @@ -0,0 +1,32 @@
55496 +/*
55497 + * Copyright (c) 2004-2006 Atheros Communications Inc.
55498 + * All rights reserved.
55499 + *
55500 + *
55501 + *
55502 + * This program is free software; you can redistribute it and/or modify
55503 + * it under the terms of the GNU General Public License version 2 as
55504 + * published by the Free Software Foundation;
55505 + *
55506 + * Software distributed under the License is distributed on an "AS
55507 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55508 + * implied. See the License for the specific language governing
55509 + * rights and limitations under the License.
55510 + *
55511 + *
55512 + *
55513 + */
55514 +
55515 +#ifndef _ATHDRV_H_
55516 +#define _ATHDRV_H_
55517 +
55518 +#ifdef __cplusplus
55519 +extern "C" {
55520 +#endif
55521 +
55522 +
55523 +#ifdef __cplusplus
55524 +}
55525 +#endif
55526 +
55527 +#endif /* _ATHDRV_H_ */
55528 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/athendpack.h
55529 ===================================================================
55530 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55531 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/athendpack.h 2008-12-11 22:46:49.000000000 +0100
55532 @@ -0,0 +1,41 @@
55533 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
55534 + * @file: athendpack.h
55535 + *
55536 + * @abstract: end compiler-specific structure packing
55537 + *
55538 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55539 + * All rights reserved.
55540 + *
55541 + *
55542 + * This program is free software; you can redistribute it and/or modify
55543 + * it under the terms of the GNU General Public License version 2 as
55544 + * published by the Free Software Foundation;
55545 + *
55546 + * Software distributed under the License is distributed on an "AS
55547 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55548 + * implied. See the License for the specific language governing
55549 + * rights and limitations under the License.
55550 + *
55551 + *
55552 + *
55553 + */
55554 +#ifdef VXWORKS
55555 +#endif /* VXWORKS */
55556 +
55557 +#ifdef LINUX
55558 +#endif /* LINUX */
55559 +
55560 +#ifdef QNX
55561 +#endif /* QNX */
55562 +
55563 +#ifdef INTEGRITY
55564 +#include "integrity/athendpack_integrity.h"
55565 +#endif /* INTEGRITY */
55566 +
55567 +#ifdef NUCLEUS
55568 +#endif /* NUCLEUS */
55569 +
55570 +#ifdef UNDER_CE
55571 +#include "../os/wince/include/athendpack_wince.h"
55572 +#endif /* WINCE */
55573 +
55574 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/athstartpack.h
55575 ===================================================================
55576 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55577 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/athstartpack.h 2008-12-11 22:46:49.000000000 +0100
55578 @@ -0,0 +1,42 @@
55579 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
55580 + * @file: athstartpack.h
55581 + *
55582 + * @abstract: start compiler-specific structure packing
55583 + *
55584 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55585 + * All rights reserved.
55586 + *
55587 + *
55588 + * This program is free software; you can redistribute it and/or modify
55589 + * it under the terms of the GNU General Public License version 2 as
55590 + * published by the Free Software Foundation;
55591 + *
55592 + * Software distributed under the License is distributed on an "AS
55593 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55594 + * implied. See the License for the specific language governing
55595 + * rights and limitations under the License.
55596 + *
55597 + *
55598 + *
55599 + */
55600 +
55601 +#ifdef VXWORKS
55602 +#endif /* VXWORKS */
55603 +
55604 +#ifdef LINUX
55605 +#endif /* LINUX */
55606 +
55607 +#ifdef QNX
55608 +#endif /* QNX */
55609 +
55610 +#ifdef INTEGRITY
55611 +#include "integrity/athstartpack_integrity.h"
55612 +#endif /* INTEGRITY */
55613 +
55614 +#ifdef NUCLEUS
55615 +#endif /* NUCLEUS */
55616 +
55617 +#ifdef UNDER_CE
55618 +#include "../os/wince/include/athstartpack_wince.h"
55619 +#endif /* WINCE */
55620 +
55621 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_types.h
55622 ===================================================================
55623 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55624 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/a_types.h 2008-12-11 22:46:49.000000000 +0100
55625 @@ -0,0 +1,28 @@
55626 +#ifndef _A_TYPES_H_
55627 +#define _A_TYPES_H_
55628 +/*
55629 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/a_types.h#1 $
55630 + *
55631 + * This file contains the definitions of the basic atheros data types.
55632 + * It is used to map the data types in atheros files to a platform specific
55633 + * type.
55634 + *
55635 + * Copyright 2003-2005 Atheros Communications, Inc., All Rights Reserved.
55636 + *
55637 + *
55638 + * This program is free software; you can redistribute it and/or modify
55639 + * it under the terms of the GNU General Public License version 2 as
55640 + * published by the Free Software Foundation;
55641 + *
55642 + * Software distributed under the License is distributed on an "AS
55643 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55644 + * implied. See the License for the specific language governing
55645 + * rights and limitations under the License.
55646 + *
55647 + *
55648 + *
55649 + */
55650 +
55651 +#include "../ar6000/athtypes_linux.h"
55652 +
55653 +#endif /* _ATHTYPES_H_ */
55654 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/bmi.h
55655 ===================================================================
55656 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55657 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/bmi.h 2008-12-11 22:46:49.000000000 +0100
55658 @@ -0,0 +1,100 @@
55659 +#ifndef _BMI_H_
55660 +#define _BMI_H_
55661 +/*
55662 + * Copyright (c) 2004-2005 Atheros Communications Inc.
55663 + * All rights reserved.
55664 + *
55665 + *
55666 + * This program is free software; you can redistribute it and/or modify
55667 + * it under the terms of the GNU General Public License version 2 as
55668 + * published by the Free Software Foundation;
55669 + *
55670 + * Software distributed under the License is distributed on an "AS
55671 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55672 + * implied. See the License for the specific language governing
55673 + * rights and limitations under the License.
55674 + *
55675 + *
55676 + *
55677 + * BMI declarations and prototypes
55678 + */
55679 +
55680 +#ifdef __cplusplus
55681 +extern "C" {
55682 +#endif /* __cplusplus */
55683 +
55684 +/* Header files */
55685 +#include "a_config.h"
55686 +#include "athdefs.h"
55687 +#include "a_types.h"
55688 +#include "hif.h"
55689 +#include "a_osapi.h"
55690 +#include "bmi_msg.h"
55691 +
55692 +void
55693 +BMIInit(void);
55694 +
55695 +A_STATUS
55696 +BMIDone(HIF_DEVICE *device);
55697 +
55698 +A_STATUS
55699 +BMIGetTargetInfo(HIF_DEVICE *device, struct bmi_target_info *targ_info);
55700 +
55701 +A_STATUS
55702 +BMIReadMemory(HIF_DEVICE *device,
55703 + A_UINT32 address,
55704 + A_UCHAR *buffer,
55705 + A_UINT32 length);
55706 +
55707 +A_STATUS
55708 +BMIWriteMemory(HIF_DEVICE *device,
55709 + A_UINT32 address,
55710 + A_UCHAR *buffer,
55711 + A_UINT32 length);
55712 +
55713 +A_STATUS
55714 +BMIExecute(HIF_DEVICE *device,
55715 + A_UINT32 address,
55716 + A_UINT32 *param);
55717 +
55718 +A_STATUS
55719 +BMISetAppStart(HIF_DEVICE *device,
55720 + A_UINT32 address);
55721 +
55722 +A_STATUS
55723 +BMIReadSOCRegister(HIF_DEVICE *device,
55724 + A_UINT32 address,
55725 + A_UINT32 *param);
55726 +
55727 +A_STATUS
55728 +BMIWriteSOCRegister(HIF_DEVICE *device,
55729 + A_UINT32 address,
55730 + A_UINT32 param);
55731 +
55732 +A_STATUS
55733 +BMIrompatchInstall(HIF_DEVICE *device,
55734 + A_UINT32 ROM_addr,
55735 + A_UINT32 RAM_addr,
55736 + A_UINT32 nbytes,
55737 + A_UINT32 do_activate,
55738 + A_UINT32 *patch_id);
55739 +
55740 +A_STATUS
55741 +BMIrompatchUninstall(HIF_DEVICE *device,
55742 + A_UINT32 rompatch_id);
55743 +
55744 +A_STATUS
55745 +BMIrompatchActivate(HIF_DEVICE *device,
55746 + A_UINT32 rompatch_count,
55747 + A_UINT32 *rompatch_list);
55748 +
55749 +A_STATUS
55750 +BMIrompatchDeactivate(HIF_DEVICE *device,
55751 + A_UINT32 rompatch_count,
55752 + A_UINT32 *rompatch_list);
55753 +
55754 +#ifdef __cplusplus
55755 +}
55756 +#endif
55757 +
55758 +#endif /* _BMI_H_ */
55759 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/bmi_msg.h
55760 ===================================================================
55761 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55762 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/bmi_msg.h 2008-12-11 22:46:49.000000000 +0100
55763 @@ -0,0 +1,199 @@
55764 +#ifndef __BMI_MSG_H__
55765 +#define __BMI_MSG_H__
55766 +/*
55767 + *
55768 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55769 + * All rights reserved.
55770 + *
55771 + *
55772 + * This program is free software; you can redistribute it and/or modify
55773 + * it under the terms of the GNU General Public License version 2 as
55774 + * published by the Free Software Foundation;
55775 + *
55776 + * Software distributed under the License is distributed on an "AS
55777 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55778 + * implied. See the License for the specific language governing
55779 + * rights and limitations under the License.
55780 + *
55781 + *
55782 + *
55783 + */
55784 +
55785 +/*
55786 + * Bootloader Messaging Interface (BMI)
55787 + *
55788 + * BMI is a very simple messaging interface used during initialization
55789 + * to read memory, write memory, execute code, and to define an
55790 + * application entry PC.
55791 + *
55792 + * It is used to download an application to AR6K, to provide
55793 + * patches to code that is already resident on AR6K, and generally
55794 + * to examine and modify state. The Host has an opportunity to use
55795 + * BMI only once during bootup. Once the Host issues a BMI_DONE
55796 + * command, this opportunity ends.
55797 + *
55798 + * The Host writes BMI requests to mailbox0, and reads BMI responses
55799 + * from mailbox0. BMI requests all begin with a command
55800 + * (see below for specific commands), and are followed by
55801 + * command-specific data.
55802 + *
55803 + * Flow control:
55804 + * The Host can only issue a command once the Target gives it a
55805 + * "BMI Command Credit", using AR6K Counter #4. As soon as the
55806 + * Target has completed a command, it issues another BMI Command
55807 + * Credit (so the Host can issue the next command).
55808 + *
55809 + * BMI handles all required Target-side cache flushing.
55810 + */
55811 +
55812 +
55813 +/* Maximum data size used for BMI transfers */
55814 +#define BMI_DATASZ_MAX 32
55815 +
55816 +/* BMI Commands */
55817 +
55818 +#define BMI_NO_COMMAND 0
55819 +
55820 +#define BMI_DONE 1
55821 + /*
55822 + * Semantics: Host is done using BMI
55823 + * Request format:
55824 + * A_UINT32 command (BMI_DONE)
55825 + * Response format: none
55826 + */
55827 +
55828 +#define BMI_READ_MEMORY 2
55829 + /*
55830 + * Semantics: Host reads AR6K memory
55831 + * Request format:
55832 + * A_UINT32 command (BMI_READ_MEMORY)
55833 + * A_UINT32 address
55834 + * A_UINT32 length, at most BMI_DATASZ_MAX
55835 + * Response format:
55836 + * A_UINT8 data[length]
55837 + */
55838 +
55839 +#define BMI_WRITE_MEMORY 3
55840 + /*
55841 + * Semantics: Host writes AR6K memory
55842 + * Request format:
55843 + * A_UINT32 command (BMI_WRITE_MEMORY)
55844 + * A_UINT32 address
55845 + * A_UINT32 length, at most BMI_DATASZ_MAX
55846 + * A_UINT8 data[length]
55847 + * Response format: none
55848 + */
55849 +
55850 +#define BMI_EXECUTE 4
55851 + /*
55852 + * Semantics: Causes AR6K to execute code
55853 + * Request format:
55854 + * A_UINT32 command (BMI_EXECUTE)
55855 + * A_UINT32 address
55856 + * A_UINT32 parameter
55857 + * Response format:
55858 + * A_UINT32 return value
55859 + */
55860 +
55861 +#define BMI_SET_APP_START 5
55862 + /*
55863 + * Semantics: Set Target application starting address
55864 + * Request format:
55865 + * A_UINT32 command (BMI_SET_APP_START)
55866 + * A_UINT32 address
55867 + * Response format: none
55868 + */
55869 +
55870 +#define BMI_READ_SOC_REGISTER 6
55871 + /*
55872 + * Semantics: Read a 32-bit Target SOC register.
55873 + * Request format:
55874 + * A_UINT32 command (BMI_READ_REGISTER)
55875 + * A_UINT32 address
55876 + * Response format:
55877 + * A_UINT32 value
55878 + */
55879 +
55880 +#define BMI_WRITE_SOC_REGISTER 7
55881 + /*
55882 + * Semantics: Write a 32-bit Target SOC register.
55883 + * Request format:
55884 + * A_UINT32 command (BMI_WRITE_REGISTER)
55885 + * A_UINT32 address
55886 + * A_UINT32 value
55887 + *
55888 + * Response format: none
55889 + */
55890 +
55891 +#define BMI_GET_TARGET_ID 8
55892 +#define BMI_GET_TARGET_INFO 8
55893 + /*
55894 + * Semantics: Fetch the 4-byte Target information
55895 + * Request format:
55896 + * A_UINT32 command (BMI_GET_TARGET_ID/INFO)
55897 + * Response format1 (old firmware):
55898 + * A_UINT32 TargetVersionID
55899 + * Response format2 (newer firmware):
55900 + * A_UINT32 TARGET_VERSION_SENTINAL
55901 + * struct bmi_target_info;
55902 + */
55903 +
55904 +struct bmi_target_info {
55905 + A_UINT32 target_info_byte_count; /* size of this structure */
55906 + A_UINT32 target_ver; /* Target Version ID */
55907 + A_UINT32 target_type; /* Target type */
55908 +};
55909 +#define TARGET_VERSION_SENTINAL 0xffffffff
55910 +#define TARGET_TYPE_AR6001 1
55911 +#define TARGET_TYPE_AR6002 2
55912 +
55913 +
55914 +#define BMI_ROMPATCH_INSTALL 9
55915 + /*
55916 + * Semantics: Install a ROM Patch.
55917 + * Request format:
55918 + * A_UINT32 command (BMI_ROMPATCH_INSTALL)
55919 + * A_UINT32 Target ROM Address
55920 + * A_UINT32 Target RAM Address
55921 + * A_UINT32 Size, in bytes
55922 + * A_UINT32 Activate? 1-->activate;
55923 + * 0-->install but do not activate
55924 + * Response format:
55925 + * A_UINT32 PatchID
55926 + */
55927 +
55928 +#define BMI_ROMPATCH_UNINSTALL 10
55929 + /*
55930 + * Semantics: Uninstall a previously-installed ROM Patch,
55931 + * automatically deactivating, if necessary.
55932 + * Request format:
55933 + * A_UINT32 command (BMI_ROMPATCH_UNINSTALL)
55934 + * A_UINT32 PatchID
55935 + *
55936 + * Response format: none
55937 + */
55938 +
55939 +#define BMI_ROMPATCH_ACTIVATE 11
55940 + /*
55941 + * Semantics: Activate a list of previously-installed ROM Patches.
55942 + * Request format:
55943 + * A_UINT32 command (BMI_ROMPATCH_ACTIVATE)
55944 + * A_UINT32 rompatch_count
55945 + * A_UINT32 PatchID[rompatch_count]
55946 + *
55947 + * Response format: none
55948 + */
55949 +
55950 +#define BMI_ROMPATCH_DEACTIVATE 12
55951 + /*
55952 + * Semantics: Deactivate a list of active ROM Patches.
55953 + * Request format:
55954 + * A_UINT32 command (BMI_ROMPATCH_DEACTIVATE)
55955 + * A_UINT32 rompatch_count
55956 + * A_UINT32 PatchID[rompatch_count]
55957 + *
55958 + * Response format: none
55959 + */
55960 +
55961 +
55962 +#endif /* __BMI_MSG_H__ */
55963 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/common_drv.h
55964 ===================================================================
55965 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
55966 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/common_drv.h 2008-12-11 22:46:49.000000000 +0100
55967 @@ -0,0 +1,61 @@
55968 +/*
55969 + *
55970 + * Copyright (c) 2004-2007 Atheros Communications Inc.
55971 + * All rights reserved.
55972 + *
55973 + *
55974 + * This program is free software; you can redistribute it and/or modify
55975 + * it under the terms of the GNU General Public License version 2 as
55976 + * published by the Free Software Foundation;
55977 + *
55978 + * Software distributed under the License is distributed on an "AS
55979 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
55980 + * implied. See the License for the specific language governing
55981 + * rights and limitations under the License.
55982 + *
55983 + *
55984 + *
55985 + */
55986 +
55987 +
55988 +#ifndef COMMON_DRV_H_
55989 +#define COMMON_DRV_H_
55990 +
55991 +#include "hif.h"
55992 +#include "htc_packet.h"
55993 +
55994 +
55995 +
55996 +/* structure that is the state information for the default credit distribution callback
55997 + * drivers should instantiate (zero-init as well) this structure in their driver instance
55998 + * and pass it as a context to the HTC credit distribution functions */
55999 +typedef struct _COMMON_CREDIT_STATE_INFO {
56000 + int TotalAvailableCredits; /* total credits in the system at startup */
56001 + int CurrentFreeCredits; /* credits available in the pool that have not been
56002 + given out to endpoints */
56003 + HTC_ENDPOINT_CREDIT_DIST *pLowestPriEpDist; /* pointer to the lowest priority endpoint dist struct */
56004 +} COMMON_CREDIT_STATE_INFO;
56005 +
56006 +
56007 +/* HTC TX packet tagging definitions */
56008 +#define AR6K_CONTROL_PKT_TAG HTC_TX_PACKET_TAG_USER_DEFINED
56009 +#define AR6K_DATA_PKT_TAG (AR6K_CONTROL_PKT_TAG + 1)
56010 +
56011 +#ifdef __cplusplus
56012 +extern "C" {
56013 +#endif
56014 +
56015 +/* OS-independent APIs */
56016 +A_STATUS ar6000_setup_credit_dist(HTC_HANDLE HTCHandle, COMMON_CREDIT_STATE_INFO *pCredInfo);
56017 +A_STATUS ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
56018 +A_STATUS ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data);
56019 +A_STATUS ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address, A_UCHAR *data, A_UINT32 length);
56020 +A_STATUS ar6000_reset_device(HIF_DEVICE *hifDevice, A_UINT32 TargetType);
56021 +void ar6000_dump_target_assert_info(HIF_DEVICE *hifDevice, A_UINT32 TargetType);
56022 +A_STATUS ar6000_reset_device_skipflash(HIF_DEVICE *hifDevice);
56023 +
56024 +#ifdef __cplusplus
56025 +}
56026 +#endif
56027 +
56028 +#endif /*COMMON_DRV_H_*/
56029 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dbglog_api.h
56030 ===================================================================
56031 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56032 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dbglog_api.h 2008-12-11 22:46:49.000000000 +0100
56033 @@ -0,0 +1,46 @@
56034 +#ifndef _DBGLOG_API_H_
56035 +#define _DBGLOG_API_H_
56036 +/*
56037 + * Copyright (c) 2004-2006 Atheros Communications Inc.
56038 + * All rights reserved.
56039 + *
56040 + *
56041 + * This program is free software; you can redistribute it and/or modify
56042 + * it under the terms of the GNU General Public License version 2 as
56043 + * published by the Free Software Foundation;
56044 + *
56045 + * Software distributed under the License is distributed on an "AS
56046 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
56047 + * implied. See the License for the specific language governing
56048 + * rights and limitations under the License.
56049 + *
56050 + *
56051 + *
56052 + * This file contains host side debug primitives.
56053 + */
56054 +
56055 +#ifdef __cplusplus
56056 +extern "C" {
56057 +#endif
56058 +
56059 +#include "dbglog.h"
56060 +
56061 +#define DBGLOG_HOST_LOG_BUFFER_SIZE DBGLOG_LOG_BUFFER_SIZE
56062 +
56063 +#define DBGLOG_GET_DBGID(arg) \
56064 + ((arg & DBGLOG_DBGID_MASK) >> DBGLOG_DBGID_OFFSET)
56065 +
56066 +#define DBGLOG_GET_MODULEID(arg) \
56067 + ((arg & DBGLOG_MODULEID_MASK) >> DBGLOG_MODULEID_OFFSET)
56068 +
56069 +#define DBGLOG_GET_NUMARGS(arg) \
56070 + ((arg & DBGLOG_NUM_ARGS_MASK) >> DBGLOG_NUM_ARGS_OFFSET)
56071 +
56072 +#define DBGLOG_GET_TIMESTAMP(arg) \
56073 + ((arg & DBGLOG_TIMESTAMP_MASK) >> DBGLOG_TIMESTAMP_OFFSET)
56074 +
56075 +#ifdef __cplusplus
56076 +}
56077 +#endif
56078 +
56079 +#endif /* _DBGLOG_API_H_ */
56080 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dbglog.h
56081 ===================================================================
56082 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56083 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dbglog.h 2008-12-11 22:46:49.000000000 +0100
56084 @@ -0,0 +1,107 @@
56085 +/*
56086 + * Copyright (c) 2004-2007 Atheros Communications Inc.
56087 + * All rights reserved.
56088 + *
56089 + * $ATH_LICENSE_HOSTSDK0_C$
56090 + *
56091 + * This file contains the definitions and data structures associated with
56092 + * the log based debug mechanism.
56093 + *
56094 + */
56095 +
56096 +#ifndef _DBGLOG_H_
56097 +#define _DBGLOG_H_
56098 +
56099 +#ifdef __cplusplus
56100 +extern "C" {
56101 +#endif
56102 +
56103 +#define DBGLOG_TIMESTAMP_OFFSET 0
56104 +#define DBGLOG_TIMESTAMP_MASK 0x0000FFFF /* Bit 0-15. Contains bit
56105 + 8-23 of the LF0 timer */
56106 +#define DBGLOG_DBGID_OFFSET 16
56107 +#define DBGLOG_DBGID_MASK 0x03FF0000 /* Bit 16-25 */
56108 +#define DBGLOG_DBGID_NUM_MAX 256 /* Upper limit is width of mask */
56109 +
56110 +#define DBGLOG_MODULEID_OFFSET 26
56111 +#define DBGLOG_MODULEID_MASK 0x3C000000 /* Bit 26-29 */
56112 +#define DBGLOG_MODULEID_NUM_MAX 16 /* Upper limit is width of mask */
56113 +
56114 +/*
56115 + * Please ensure that the definition of any new module intrduced is captured
56116 + * between the DBGLOG_MODULEID_START and DBGLOG_MODULEID_END defines. The
56117 + * structure is required for the parser to correctly pick up the values for
56118 + * different modules.
56119 + */
56120 +#define DBGLOG_MODULEID_START
56121 +#define DBGLOG_MODULEID_INF 0
56122 +#define DBGLOG_MODULEID_WMI 1
56123 +#define DBGLOG_MODULEID_CSERV 2
56124 +#define DBGLOG_MODULEID_PM 3
56125 +#define DBGLOG_MODULEID_TXRX_MGMTBUF 4
56126 +#define DBGLOG_MODULEID_TXRX_TXBUF 5
56127 +#define DBGLOG_MODULEID_TXRX_RXBUF 6
56128 +#define DBGLOG_MODULEID_WOW 7
56129 +#define DBGLOG_MODULEID_WHAL 8
56130 +#define DBGLOG_MODULEID_END
56131 +
56132 +#define DBGLOG_NUM_ARGS_OFFSET 30
56133 +#define DBGLOG_NUM_ARGS_MASK 0xC0000000 /* Bit 30-31 */
56134 +#define DBGLOG_NUM_ARGS_MAX 2 /* Upper limit is width of mask */
56135 +
56136 +#define DBGLOG_MODULE_LOG_ENABLE_OFFSET 0
56137 +#define DBGLOG_MODULE_LOG_ENABLE_MASK 0x0000FFFF
56138 +
56139 +#define DBGLOG_REPORTING_ENABLED_OFFSET 16
56140 +#define DBGLOG_REPORTING_ENABLED_MASK 0x00010000
56141 +
56142 +#define DBGLOG_TIMESTAMP_RESOLUTION_OFFSET 17
56143 +#define DBGLOG_TIMESTAMP_RESOLUTION_MASK 0x000E0000
56144 +
56145 +#define DBGLOG_REPORT_SIZE_OFFSET 20
56146 +#define DBGLOG_REPORT_SIZE_MASK 0x3FF00000
56147 +
56148 +#define DBGLOG_LOG_BUFFER_SIZE 1500
56149 +#define DBGLOG_DBGID_DEFINITION_LEN_MAX 64
56150 +
56151 +struct dbglog_buf_s {
56152 + struct dbglog_buf_s *next;
56153 + A_INT8 *buffer;
56154 + A_UINT32 bufsize;
56155 + A_UINT32 length;
56156 + A_UINT32 count;
56157 + A_UINT32 free;
56158 +};
56159 +
56160 +struct dbglog_hdr_s {
56161 + struct dbglog_buf_s *dbuf;
56162 + A_UINT32 dropped;
56163 +};
56164 +
56165 +struct dbglog_config_s {
56166 + A_UINT32 cfgvalid; /* Mask with valid config bits */
56167 + union {
56168 + /* TODO: Take care of endianness */
56169 + struct {
56170 + A_UINT32 mmask:16; /* Mask of modules with logging on */
56171 + A_UINT32 rep:1; /* Reporting enabled or not */
56172 + A_UINT32 tsr:3; /* Time stamp resolution. Def: 1 ms */
56173 + A_UINT32 size:10; /* Report size in number of messages */
56174 + A_UINT32 reserved:2;
56175 + } dbglog_config;
56176 +
56177 + A_UINT32 value;
56178 + } u;
56179 +};
56180 +
56181 +#define cfgmmask u.dbglog_config.mmask
56182 +#define cfgrep u.dbglog_config.rep
56183 +#define cfgtsr u.dbglog_config.tsr
56184 +#define cfgsize u.dbglog_config.size
56185 +#define cfgvalue u.value
56186 +
56187 +#ifdef __cplusplus
56188 +}
56189 +#endif
56190 +
56191 +#endif /* _DBGLOG_H_ */
56192 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dbglog_id.h
56193 ===================================================================
56194 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56195 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dbglog_id.h 2008-12-11 22:46:49.000000000 +0100
56196 @@ -0,0 +1,307 @@
56197 +/*
56198 + *
56199 + * Copyright (c) 2004-2007 Atheros Communications Inc.
56200 + * All rights reserved.
56201 + *
56202 + * $ATH_LICENSE_HOSTSDK0_C$
56203 + *
56204 + * This file contains the definitions of the debug identifiers for different
56205 + * modules.
56206 + *
56207 + */
56208 +
56209 +#ifndef _DBGLOG_ID_H_
56210 +#define _DBGLOG_ID_H_
56211 +
56212 +#ifdef __cplusplus
56213 +extern "C" {
56214 +#endif
56215 +
56216 +/*
56217 + * The nomenclature for the debug identifiers is MODULE_DESCRIPTION.
56218 + * Please ensure that the definition of any new debugid introduced is captured
56219 + * between the <MODULE>_DBGID_DEFINITION_START and
56220 + * <MODULE>_DBGID_DEFINITION_END defines. The structure is required for the
56221 + * parser to correctly pick up the values for different debug identifiers.
56222 + */
56223 +
56224 +/* INF debug identifier definitions */
56225 +#define INF_DBGID_DEFINITION_START
56226 +#define INF_ASSERTION_FAILED 1
56227 +#define INF_TARGET_ID 2
56228 +#define INF_DBGID_DEFINITION_END
56229 +
56230 +/* WMI debug identifier definitions */
56231 +#define WMI_DBGID_DEFINITION_START
56232 +#define WMI_CMD_RX_XTND_PKT_TOO_SHORT 1
56233 +#define WMI_EXTENDED_CMD_NOT_HANDLED 2
56234 +#define WMI_CMD_RX_PKT_TOO_SHORT 3
56235 +#define WMI_CALLING_WMI_EXTENSION_FN 4
56236 +#define WMI_CMD_NOT_HANDLED 5
56237 +#define WMI_IN_SYNC 6
56238 +#define WMI_TARGET_WMI_SYNC_CMD 7
56239 +#define WMI_SET_SNR_THRESHOLD_PARAMS 8
56240 +#define WMI_SET_RSSI_THRESHOLD_PARAMS 9
56241 +#define WMI_SET_LQ_TRESHOLD_PARAMS 10
56242 +#define WMI_TARGET_CREATE_PSTREAM_CMD 11
56243 +#define WMI_WI_DTM_INUSE 12
56244 +#define WMI_TARGET_DELETE_PSTREAM_CMD 13
56245 +#define WMI_TARGET_IMPLICIT_DELETE_PSTREAM_CMD 14
56246 +#define WMI_TARGET_GET_BIT_RATE_CMD 15
56247 +#define WMI_GET_RATE_MASK_CMD_FIX_RATE_MASK_IS 16
56248 +#define WMI_TARGET_GET_AVAILABLE_CHANNELS_CMD 17
56249 +#define WMI_TARGET_GET_TX_PWR_CMD 18
56250 +#define WMI_FREE_EVBUF_WMIBUF 19
56251 +#define WMI_FREE_EVBUF_DATABUF 20
56252 +#define WMI_FREE_EVBUF_BADFLAG 21
56253 +#define WMI_HTC_RX_ERROR_DATA_PACKET 22
56254 +#define WMI_HTC_RX_SYNC_PAUSING_FOR_MBOX 23
56255 +#define WMI_INCORRECT_WMI_DATA_HDR_DROPPING_PKT 24
56256 +#define WMI_SENDING_READY_EVENT 25
56257 +#define WMI_SETPOWER_MDOE_TO_MAXPERF 26
56258 +#define WMI_SETPOWER_MDOE_TO_REC 27
56259 +#define WMI_BSSINFO_EVENT_FROM 28
56260 +#define WMI_TARGET_GET_STATS_CMD 29
56261 +#define WMI_SENDING_SCAN_COMPLETE_EVENT 30
56262 +#define WMI_SENDING_RSSI_INDB_THRESHOLD_EVENT 31
56263 +#define WMI_SENDING_RSSI_INDBM_THRESHOLD_EVENT 32
56264 +#define WMI_SENDING_LINK_QUALITY_THRESHOLD_EVENT 33
56265 +#define WMI_SENDING_ERROR_REPORT_EVENT 34
56266 +#define WMI_SENDING_CAC_EVENT 35
56267 +#define WMI_TARGET_GET_ROAM_TABLE_CMD 36
56268 +#define WMI_TARGET_GET_ROAM_DATA_CMD 37
56269 +#define WMI_SENDING_GPIO_INTR_EVENT 38
56270 +#define WMI_SENDING_GPIO_ACK_EVENT 39
56271 +#define WMI_SENDING_GPIO_DATA_EVENT 40
56272 +#define WMI_CMD_RX 41
56273 +#define WMI_CMD_RX_XTND 42
56274 +#define WMI_EVENT_SEND 43
56275 +#define WMI_EVENT_SEND_XTND 44
56276 +#define WMI_DBGID_DEFINITION_END
56277 +
56278 +/* CSERV debug identifier definitions */
56279 +#define CSERV_DBGID_DEFINITION_START
56280 +#define CSERV_BEGIN_SCAN1 1
56281 +#define CSERV_BEGIN_SCAN2 2
56282 +#define CSERV_END_SCAN1 3
56283 +#define CSERV_END_SCAN2 4
56284 +#define CSERV_CHAN_SCAN_START 5
56285 +#define CSERV_CHAN_SCAN_STOP 6
56286 +#define CSERV_CHANNEL_OPPPORTUNITY 7
56287 +#define CSERV_NC_TIMEOUT 8
56288 +#define CSERV_BACK_HOME 10
56289 +#define CSERV_CHMGR_CH_CALLBACK1 11
56290 +#define CSERV_CHMGR_CH_CALLBACK2 12
56291 +#define CSERV_CHMGR_CH_CALLBACK3 13
56292 +#define CSERV_SET_SCAN_PARAMS1 14
56293 +#define CSERV_SET_SCAN_PARAMS2 15
56294 +#define CSERV_SET_SCAN_PARAMS3 16
56295 +#define CSERV_SET_SCAN_PARAMS4 17
56296 +#define CSERV_ABORT_SCAN 18
56297 +#define CSERV_NEWSTATE 19
56298 +#define CSERV_MINCHMGR_OP_END 20
56299 +#define CSERV_CHMGR_OP_END 21
56300 +#define CSERV_DISCONNECT_TIMEOUT 22
56301 +#define CSERV_ROAM_TIMEOUT 23
56302 +#define CSERV_FORCE_SCAN1 24
56303 +#define CSERV_FORCE_SCAN2 25
56304 +#define CSERV_FORCE_SCAN3 26
56305 +#define CSERV_UTIL_TIMEOUT 27
56306 +#define CSERV_RSSIPOLLER 28
56307 +#define CSERV_RETRY_CONNECT_TIMEOUT 29
56308 +#define CSERV_RSSIINDBMPOLLER 30
56309 +#define CSERV_BGSCAN_ENABLE 31
56310 +#define CSERV_BGSCAN_DISABLE 32
56311 +#define CSERV_WLAN_START_SCAN_CMD1 33
56312 +#define CSERV_WLAN_START_SCAN_CMD2 34
56313 +#define CSERV_WLAN_START_SCAN_CMD3 35
56314 +#define CSERV_START_SCAN_CMD 36
56315 +#define CSERV_START_FORCE_SCAN 37
56316 +#define CSERV_NEXT_CHAN 38
56317 +#define CSERV_SET_REGCODE 39
56318 +#define CSERV_START_ADHOC 40
56319 +#define CSERV_ADHOC_AT_HOME 41
56320 +#define CSERV_OPT_AT_HOME 42
56321 +#define CSERV_WLAN_CONNECT_CMD 43
56322 +#define CSERV_WLAN_RECONNECT_CMD 44
56323 +#define CSERV_WLAN_DISCONNECT_CMD 45
56324 +#define CSERV_BSS_CHANGE_CHANNEL 46
56325 +#define CSERV_BEACON_RX 47
56326 +#define CSERV_KEEPALIVE_CHECK 48
56327 +#define CSERV_RC_BEGIN_SCAN 49
56328 +#define CSERV_RC_SCAN_START 50
56329 +#define CSERV_RC_SCAN_STOP 51
56330 +#define CSERV_RC_NEXT 52
56331 +#define CSERV_RC_SCAN_END 53
56332 +#define CSERV_PROBE_CALLBACK 54
56333 +#define CSERV_ROAM1 55
56334 +#define CSERV_ROAM2 56
56335 +#define CSERV_ROAM3 57
56336 +#define CSERV_CONNECT_EVENT 58
56337 +#define CSERV_DISCONNECT_EVENT 59
56338 +#define CSERV_BMISS_HANDLER1 60
56339 +#define CSERV_BMISS_HANDLER2 61
56340 +#define CSERV_BMISS_HANDLER3 62
56341 +#define CSERV_LOWRSSI_HANDLER 63
56342 +#define CSERV_WLAN_SET_PMKID_CMD 64
56343 +#define CSERV_RECONNECT_REQUEST 65
56344 +#define CSERV_KEYSPLUMBED_EVENT 66
56345 +#define CSERV_NEW_REG 67
56346 +#define CSERV_SET_RSSI_THOLD 68
56347 +#define CSERV_RSSITHRESHOLDCHECK 69
56348 +#define CSERV_RSSIINDBMTHRESHOLDCHECK 70
56349 +#define CSERV_WLAN_SET_OPT_CMD1 71
56350 +#define CSERV_WLAN_SET_OPT_CMD2 72
56351 +#define CSERV_WLAN_SET_OPT_CMD3 73
56352 +#define CSERV_WLAN_SET_OPT_CMD4 74
56353 +#define CSERV_SCAN_CONNECT_STOP 75
56354 +#define CSERV_BMISS_HANDLER4 76
56355 +#define CSERV_INITIALIZE_TIMER 77
56356 +#define CSERV_ARM_TIMER 78
56357 +#define CSERV_DISARM_TIMER 79
56358 +#define CSERV_UNINITIALIZE_TIMER 80
56359 +#define CSERV_DISCONNECT_EVENT2 81
56360 +#define CSERV_SCAN_CONNECT_START 82
56361 +#define CSERV_BSSINFO_MEMORY_ALLOC_FAILED 83
56362 +#define CSERV_SET_SCAN_PARAMS5 84
56363 +#define CSERV_DBGID_DEFINITION_END
56364 +
56365 +/* TXRX debug identifier definitions */
56366 +#define TXRX_TXBUF_DBGID_DEFINITION_START
56367 +#define TXRX_TXBUF_ALLOCATE_BUF 1
56368 +#define TXRX_TXBUF_QUEUE_BUF_TO_MBOX 2
56369 +#define TXRX_TXBUF_QUEUE_BUF_TO_TXQ 3
56370 +#define TXRX_TXBUF_TXQ_DEPTH 4
56371 +#define TXRX_TXBUF_IBSS_QUEUE_TO_SFQ 5
56372 +#define TXRX_TXBUF_IBSS_QUEUE_TO_TXQ_FRM_SFQ 6
56373 +#define TXRX_TXBUF_INITIALIZE_TIMER 7
56374 +#define TXRX_TXBUF_ARM_TIMER 8
56375 +#define TXRX_TXBUF_DISARM_TIMER 9
56376 +#define TXRX_TXBUF_UNINITIALIZE_TIMER 10
56377 +#define TXRX_TXBUF_DBGID_DEFINITION_END
56378 +
56379 +#define TXRX_RXBUF_DBGID_DEFINITION_START
56380 +#define TXRX_RXBUF_ALLOCATE_BUF 1
56381 +#define TXRX_RXBUF_QUEUE_TO_HOST 2
56382 +#define TXRX_RXBUF_QUEUE_TO_WLAN 3
56383 +#define TXRX_RXBUF_ZERO_LEN_BUF 4
56384 +#define TXRX_RXBUF_QUEUE_TO_HOST_LASTBUF_IN_RXCHAIN 5
56385 +#define TXRX_RXBUF_LASTBUF_IN_RXCHAIN_ZEROBUF 6
56386 +#define TXRX_RXBUF_QUEUE_EMPTY_QUEUE_TO_WLAN 7
56387 +#define TXRX_RXBUF_SEND_TO_RECV_MGMT 8
56388 +#define TXRX_RXBUF_SEND_TO_IEEE_LAYER 9
56389 +#define TXRX_RXBUF_DBGID_DEFINITION_END
56390 +
56391 +#define TXRX_MGMTBUF_DBGID_DEFINITION_START
56392 +#define TXRX_MGMTBUF_ALLOCATE_BUF 1
56393 +#define TXRX_MGMTBUF_ALLOCATE_SM_BUF 2
56394 +#define TXRX_MGMTBUF_ALLOCATE_RMBUF 3
56395 +#define TXRX_MGMTBUF_GET_BUF 4
56396 +#define TXRX_MGMTBUF_GET_SM_BUF 5
56397 +#define TXRX_MGMTBUF_QUEUE_BUF_TO_TXQ 6
56398 +#define TXRX_MGMTBUF_REAPED_BUF 7
56399 +#define TXRX_MGMTBUF_REAPED_SM_BUF 8
56400 +#define TXRX_MGMTBUF_WAIT_FOR_TXQ_DRAIN 9
56401 +#define TXRX_MGMTBUF_WAIT_FOR_TXQ_SFQ_DRAIN 10
56402 +#define TXRX_MGMTBUF_ENQUEUE_INTO_SFQ 11
56403 +#define TXRX_MGMTBUF_DEQUEUE_FROM_SFQ 12
56404 +#define TXRX_MGMTBUF_PAUSE_TXQ 13
56405 +#define TXRX_MGMTBUF_RESUME_TXQ 14
56406 +#define TXRX_MGMTBUF_WAIT_FORTXQ_DRAIN_TIMEOUT 15
56407 +#define TXRX_MGMTBUF_DRAINQ 16
56408 +#define TXRX_MGMTBUF_INDICATE_Q_DRAINED 17
56409 +#define TXRX_MGMTBUF_DBGID_DEFINITION_END
56410 +
56411 +/* PM (Power Module) debug identifier definitions */
56412 +#define PM_DBGID_DEFINITION_START
56413 +#define PM_INIT 1
56414 +#define PM_ENABLE 2
56415 +#define PM_SET_STATE 3
56416 +#define PM_SET_POWERMODE 4
56417 +#define PM_CONN_NOTIFY 5
56418 +#define PM_REF_COUNT_NEGATIVE 6
56419 +#define PM_APSD_ENABLE 7
56420 +#define PM_UPDATE_APSD_STATE 8
56421 +#define PM_CHAN_OP_REQ 9
56422 +#define PM_SET_MY_BEACON_POLICY 10
56423 +#define PM_SET_ALL_BEACON_POLICY 11
56424 +#define PM_SET_PM_PARAMS1 12
56425 +#define PM_SET_PM_PARAMS2 13
56426 +#define PM_ADHOC_SET_PM_CAPS_FAIL 14
56427 +#define PM_ADHOC_UNKNOWN_IBSS_ATTRIB_ID 15
56428 +#define PM_DBGID_DEFINITION_END
56429 +
56430 +/* Wake on Wireless debug identifier definitions */
56431 +#define WOW_DBGID_DEFINITION_START
56432 +#define WOW_INIT 1
56433 +#define WOW_GET_CONFIG_DSET 2
56434 +#define WOW_NO_CONFIG_DSET 3
56435 +#define WOW_INVALID_CONFIG_DSET 4
56436 +#define WOW_USE_DEFAULT_CONFIG 5
56437 +#define WOW_SETUP_GPIO 6
56438 +#define WOW_INIT_DONE 7
56439 +#define WOW_SET_GPIO_PIN 8
56440 +#define WOW_CLEAR_GPIO_PIN 9
56441 +#define WOW_SET_WOW_MODE_CMD 10
56442 +#define WOW_SET_HOST_MODE_CMD 11
56443 +#define WOW_ADD_WOW_PATTERN_CMD 12
56444 +#define WOW_NEW_WOW_PATTERN_AT_INDEX 13
56445 +#define WOW_DEL_WOW_PATTERN_CMD 14
56446 +#define WOW_LIST_CONTAINS_PATTERNS 15
56447 +#define WOW_GET_WOW_LIST_CMD 16
56448 +#define WOW_INVALID_FILTER_ID 17
56449 +#define WOW_INVALID_FILTER_LISTID 18
56450 +#define WOW_NO_VALID_FILTER_AT_ID 19
56451 +#define WOW_NO_VALID_LIST_AT_ID 20
56452 +#define WOW_NUM_PATTERNS_EXCEEDED 21
56453 +#define WOW_NUM_LISTS_EXCEEDED 22
56454 +#define WOW_GET_WOW_STATS 23
56455 +#define WOW_CLEAR_WOW_STATS 24
56456 +#define WOW_WAKEUP_HOST 25
56457 +#define WOW_EVENT_WAKEUP_HOST 26
56458 +#define WOW_EVENT_DISCARD 27
56459 +#define WOW_PATTERN_MATCH 28
56460 +#define WOW_PATTERN_NOT_MATCH 29
56461 +#define WOW_PATTERN_NOT_MATCH_OFFSET 30
56462 +#define WOW_DISABLED_HOST_ASLEEP 31
56463 +#define WOW_ENABLED_HOST_ASLEEP_NO_PATTERNS 32
56464 +#define WOW_ENABLED_HOST_ASLEEP_NO_MATCH_FOUND 33
56465 +#define WOW_DBGID_DEFINITION_END
56466 +
56467 +/* WHAL debug identifier definitions */
56468 +#define WHAL_DBGID_DEFINITION_START
56469 +#define WHAL_ERROR_ANI_CONTROL 1
56470 +#define WHAL_ERROR_CHIP_TEST1 2
56471 +#define WHAL_ERROR_CHIP_TEST2 3
56472 +#define WHAL_ERROR_EEPROM_CHECKSUM 4
56473 +#define WHAL_ERROR_EEPROM_MACADDR 5
56474 +#define WHAL_ERROR_INTERRUPT_HIU 6
56475 +#define WHAL_ERROR_KEYCACHE_RESET 7
56476 +#define WHAL_ERROR_KEYCACHE_SET 8
56477 +#define WHAL_ERROR_KEYCACHE_TYPE 9
56478 +#define WHAL_ERROR_KEYCACHE_TKIPENTRY 10
56479 +#define WHAL_ERROR_KEYCACHE_WEPLENGTH 11
56480 +#define WHAL_ERROR_PHY_INVALID_CHANNEL 12
56481 +#define WHAL_ERROR_POWER_AWAKE 13
56482 +#define WHAL_ERROR_POWER_SET 14
56483 +#define WHAL_ERROR_RECV_STOPDMA 15
56484 +#define WHAL_ERROR_RECV_STOPPCU 16
56485 +#define WHAL_ERROR_RESET_CHANNF1 17
56486 +#define WHAL_ERROR_RESET_CHANNF2 18
56487 +#define WHAL_ERROR_RESET_PM 19
56488 +#define WHAL_ERROR_RESET_OFFSETCAL 20
56489 +#define WHAL_ERROR_RESET_RFGRANT 21
56490 +#define WHAL_ERROR_RESET_RXFRAME 22
56491 +#define WHAL_ERROR_RESET_STOPDMA 23
56492 +#define WHAL_ERROR_RESET_RECOVER 24
56493 +#define WHAL_ERROR_XMIT_COMPUTE 25
56494 +#define WHAL_ERROR_XMIT_NOQUEUE 26
56495 +#define WHAL_ERROR_XMIT_ACTIVEQUEUE 27
56496 +#define WHAL_ERROR_XMIT_BADTYPE 28
56497 +#define WHAL_DBGID_DEFINITION_END
56498 +
56499 +#ifdef __cplusplus
56500 +}
56501 +#endif
56502 +
56503 +#endif /* _DBGLOG_ID_H_ */
56504 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dl_list.h
56505 ===================================================================
56506 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56507 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dl_list.h 2008-12-11 22:46:49.000000000 +0100
56508 @@ -0,0 +1,114 @@
56509 +/*
56510 + *
56511 + * Double-link list definitions (adapted from Atheros SDIO stack)
56512 + *
56513 + * Copyright (c) 2007 Atheros Communications Inc.
56514 + * All rights reserved.
56515 + *
56516 + *
56517 + * This program is free software; you can redistribute it and/or modify
56518 + * it under the terms of the GNU General Public License version 2 as
56519 + * published by the Free Software Foundation;
56520 + *
56521 + * Software distributed under the License is distributed on an "AS
56522 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
56523 + * implied. See the License for the specific language governing
56524 + * rights and limitations under the License.
56525 + *
56526 + *
56527 + *
56528 + */
56529 +#ifndef __DL_LIST_H___
56530 +#define __DL_LIST_H___
56531 +
56532 +#define A_CONTAINING_STRUCT(address, struct_type, field_name)\
56533 + ((struct_type *)((A_UINT32)(address) - (A_UINT32)(&((struct_type *)0)->field_name)))
56534 +
56535 +/* list functions */
56536 +/* pointers for the list */
56537 +typedef struct _DL_LIST {
56538 + struct _DL_LIST *pPrev;
56539 + struct _DL_LIST *pNext;
56540 +}DL_LIST, *PDL_LIST;
56541 +/*
56542 + * DL_LIST_INIT , initialize doubly linked list
56543 +*/
56544 +#define DL_LIST_INIT(pList)\
56545 + {(pList)->pPrev = pList; (pList)->pNext = pList;}
56546 +
56547 +#define DL_LIST_IS_EMPTY(pList) (((pList)->pPrev == (pList)) && ((pList)->pNext == (pList)))
56548 +#define DL_LIST_GET_ITEM_AT_HEAD(pList) (pList)->pNext
56549 +#define DL_LIST_GET_ITEM_AT_TAIL(pList) (pList)->pPrev
56550 +/*
56551 + * ITERATE_OVER_LIST pStart is the list, pTemp is a temp list member
56552 + * NOT: do not use this function if the items in the list are deleted inside the
56553 + * iteration loop
56554 +*/
56555 +#define ITERATE_OVER_LIST(pStart, pTemp) \
56556 + for((pTemp) =(pStart)->pNext; pTemp != (pStart); (pTemp) = (pTemp)->pNext)
56557 +
56558 +
56559 +/* safe iterate macro that allows the item to be removed from the list
56560 + * the iteration continues to the next item in the list
56561 + */
56562 +#define ITERATE_OVER_LIST_ALLOW_REMOVE(pStart,pItem,st,offset) \
56563 +{ \
56564 + PDL_LIST pTemp; \
56565 + pTemp = (pStart)->pNext; \
56566 + while (pTemp != (pStart)) { \
56567 + (pItem) = A_CONTAINING_STRUCT(pTemp,st,offset); \
56568 + pTemp = pTemp->pNext; \
56569 +
56570 +#define ITERATE_END }}
56571 +
56572 +/*
56573 + * DL_ListInsertTail - insert pAdd to the end of the list
56574 +*/
56575 +static INLINE PDL_LIST DL_ListInsertTail(PDL_LIST pList, PDL_LIST pAdd) {
56576 + /* insert at tail */
56577 + pAdd->pPrev = pList->pPrev;
56578 + pAdd->pNext = pList;
56579 + pList->pPrev->pNext = pAdd;
56580 + pList->pPrev = pAdd;
56581 + return pAdd;
56582 +}
56583 +
56584 +/*
56585 + * DL_ListInsertHead - insert pAdd into the head of the list
56586 +*/
56587 +static INLINE PDL_LIST DL_ListInsertHead(PDL_LIST pList, PDL_LIST pAdd) {
56588 + /* insert at head */
56589 + pAdd->pPrev = pList;
56590 + pAdd->pNext = pList->pNext;
56591 + pList->pNext->pPrev = pAdd;
56592 + pList->pNext = pAdd;
56593 + return pAdd;
56594 +}
56595 +
56596 +#define DL_ListAdd(pList,pItem) DL_ListInsertHead((pList),(pItem))
56597 +/*
56598 + * DL_ListRemove - remove pDel from list
56599 +*/
56600 +static INLINE PDL_LIST DL_ListRemove(PDL_LIST pDel) {
56601 + pDel->pNext->pPrev = pDel->pPrev;
56602 + pDel->pPrev->pNext = pDel->pNext;
56603 + /* point back to itself just to be safe, incase remove is called again */
56604 + pDel->pNext = pDel;
56605 + pDel->pPrev = pDel;
56606 + return pDel;
56607 +}
56608 +
56609 +/*
56610 + * DL_ListRemoveItemFromHead - get a list item from the head
56611 +*/
56612 +static INLINE PDL_LIST DL_ListRemoveItemFromHead(PDL_LIST pList) {
56613 + PDL_LIST pItem = NULL;
56614 + if (pList->pNext != pList) {
56615 + pItem = pList->pNext;
56616 + /* remove the first item from head */
56617 + DL_ListRemove(pItem);
56618 + }
56619 + return pItem;
56620 +}
56621 +
56622 +#endif /* __DL_LIST_H___ */
56623 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dset_api.h
56624 ===================================================================
56625 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56626 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dset_api.h 2008-12-11 22:46:49.000000000 +0100
56627 @@ -0,0 +1,63 @@
56628 +/*
56629 + * Copyright (c) 2004-2006 Atheros Communications Inc.
56630 + * All rights reserved.
56631 + *
56632 + *
56633 + * This program is free software; you can redistribute it and/or modify
56634 + * it under the terms of the GNU General Public License version 2 as
56635 + * published by the Free Software Foundation;
56636 + *
56637 + * Software distributed under the License is distributed on an "AS
56638 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
56639 + * implied. See the License for the specific language governing
56640 + * rights and limitations under the License.
56641 + *
56642 + *
56643 + *
56644 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/dset_api.h#1 $
56645 + *
56646 + * Host-side DataSet API.
56647 + *
56648 + */
56649 +
56650 +#ifndef _DSET_API_H_
56651 +#define _DSET_API_H_
56652 +
56653 +#ifdef __cplusplus
56654 +extern "C" {
56655 +#endif /* __cplusplus */
56656 +
56657 +/*
56658 + * Host-side DataSet support is optional, and is not
56659 + * currently required for correct operation. To disable
56660 + * Host-side DataSet support, set this to 0.
56661 + */
56662 +#ifndef CONFIG_HOST_DSET_SUPPORT
56663 +#define CONFIG_HOST_DSET_SUPPORT 1
56664 +#endif
56665 +
56666 +/* Called to send a DataSet Open Reply back to the Target. */
56667 +A_STATUS wmi_dset_open_reply(struct wmi_t *wmip,
56668 + A_UINT32 status,
56669 + A_UINT32 access_cookie,
56670 + A_UINT32 size,
56671 + A_UINT32 version,
56672 + A_UINT32 targ_handle,
56673 + A_UINT32 targ_reply_fn,
56674 + A_UINT32 targ_reply_arg);
56675 +
56676 +/* Called to send a DataSet Data Reply back to the Target. */
56677 +A_STATUS wmi_dset_data_reply(struct wmi_t *wmip,
56678 + A_UINT32 status,
56679 + A_UINT8 *host_buf,
56680 + A_UINT32 length,
56681 + A_UINT32 targ_buf,
56682 + A_UINT32 targ_reply_fn,
56683 + A_UINT32 targ_reply_arg);
56684 +
56685 +#ifdef __cplusplus
56686 +}
56687 +#endif /* __cplusplus */
56688 +
56689 +
56690 +#endif /* _DSET_API_H_ */
56691 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dsetid.h
56692 ===================================================================
56693 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56694 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dsetid.h 2008-12-11 22:46:49.000000000 +0100
56695 @@ -0,0 +1,110 @@
56696 +/*
56697 + * Copyright (c) 2004-2007 Atheros Communications Inc.
56698 + * All rights reserved.
56699 + *
56700 + * $ATH_LICENSE_HOSTSDK0_C$
56701 + *
56702 + */
56703 +
56704 +#ifndef __DSETID_H__
56705 +#define __DSETID_H__
56706 +
56707 +/* Well-known DataSet IDs */
56708 +#define DSETID_UNUSED 0x00000000
56709 +#define DSETID_BOARD_DATA 0x00000001 /* Cal and board data */
56710 +#define DSETID_REGDB 0x00000002 /* Regulatory Database */
56711 +#define DSETID_POWER_CONTROL 0x00000003 /* TX Pwr Lim & Ant Gain */
56712 +#define DSETID_USER_CONFIG 0x00000004 /* User Configuration */
56713 +
56714 +#define DSETID_ANALOG_CONTROL_DATA_START 0x00000005
56715 +#define DSETID_ANALOG_CONTROL_DATA_END 0x00000025
56716 +/*
56717 + * Get DSETID for various reference clock speeds.
56718 + * For each speed there are three DataSets that correspond
56719 + * to the three columns of bank6 data (addr, 11a, 11b/g).
56720 + * This macro returns the dsetid of the first of those
56721 + * three DataSets.
56722 + */
56723 +#define ANALOG_CONTROL_DATA_DSETID(refclk) \
56724 + (DSETID_ANALOG_CONTROL_DATA_START + 3*refclk)
56725 +
56726 +/*
56727 + * There are TWO STARTUP_PATCH DataSets.
56728 + * DSETID_STARTUP_PATCH is historical, and was applied before BMI on
56729 + * earlier systems. On AR6002, it is applied after BMI, just like
56730 + * DSETID_STARTUP_PATCH2.
56731 + */
56732 +#define DSETID_STARTUP_PATCH 0x00000026
56733 +#define DSETID_GPIO_CONFIG_PATCH 0x00000027
56734 +#define DSETID_WLANREGS 0x00000028 /* override wlan regs */
56735 +#define DSETID_STARTUP_PATCH2 0x00000029
56736 +
56737 +#define DSETID_WOW_CONFIG 0x00000090 /* WoW Configuration */
56738 +
56739 +/* Add WHAL_INI_DATA_ID to DSETID_INI_DATA for a specific WHAL INI table. */
56740 +#define DSETID_INI_DATA 0x00000100
56741 +/* Reserved for WHAL INI Tables: 0x100..0x11f */
56742 +#define DSETID_INI_DATA_END 0x0000011f
56743 +
56744 +#define DSETID_VENDOR_START 0x00010000 /* Vendor-defined DataSets */
56745 +
56746 +#define DSETID_INDEX_END 0xfffffffe /* Reserved to indicate the
56747 + end of a memory-based
56748 + DataSet Index */
56749 +#define DSETID_INDEX_FREE 0xffffffff /* An unused index entry */
56750 +
56751 +/*
56752 + * PATCH DataSet format:
56753 + * A list of patches, terminated by a patch with
56754 + * address=PATCH_END.
56755 + *
56756 + * This allows for patches to be stored in flash.
56757 + */
56758 +struct patch_s {
56759 + A_UINT32 *address;
56760 + A_UINT32 data;
56761 +};
56762 +
56763 +/*
56764 + * Skip some patches. Can be used to erase a single patch in a
56765 + * patch DataSet without having to re-write the DataSet. May
56766 + * also be used to embed information for use by subsequent
56767 + * patch code. The "data" in a PATCH_SKIP tells how many
56768 + * bytes of length "patch_s" to skip.
56769 + */
56770 +#define PATCH_SKIP ((A_UINT32 *)0x00000000)
56771 +
56772 +/*
56773 + * Execute code at the address specified by "data".
56774 + * The address of the patch structure is passed as
56775 + * the one parameter.
56776 + */
56777 +#define PATCH_CODE_ABS ((A_UINT32 *)0x00000001)
56778 +
56779 +/*
56780 + * Same as PATCH_CODE_ABS, but treat "data" as an
56781 + * offset from the start of the patch word.
56782 + */
56783 +#define PATCH_CODE_REL ((A_UINT32 *)0x00000002)
56784 +
56785 +/* Mark the end of this patch DataSet. */
56786 +#define PATCH_END ((A_UINT32 *)0xffffffff)
56787 +
56788 +/*
56789 + * A DataSet which contains a Binary Patch to some other DataSet
56790 + * uses the original dsetid with the DSETID_BPATCH_FLAG bit set.
56791 + * Such a BPatch DataSet consists of BPatch metadata followed by
56792 + * the bdiff bytes. BPatch metadata consists of a single 32-bit
56793 + * word that contains the size of the BPatched final image.
56794 + *
56795 + * To create a suitable bdiff DataSet, use bdiff in host/tools/bdiff
56796 + * to create "diffs":
56797 + * bdiff -q -O -nooldmd5 -nonewmd5 -d ORIGfile NEWfile diffs
56798 + * Then add BPatch metadata to the start of "diffs".
56799 + *
56800 + * NB: There are some implementation-induced restrictions
56801 + * on which DataSets can be BPatched.
56802 + */
56803 +#define DSETID_BPATCH_FLAG 0x80000000
56804 +
56805 +#endif /* __DSETID_H__ */
56806 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dset_internal.h
56807 ===================================================================
56808 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56809 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/dset_internal.h 2008-12-11 22:46:49.000000000 +0100
56810 @@ -0,0 +1,39 @@
56811 +/*
56812 + * Copyright (c) 2007 Atheros Communications Inc.
56813 + * All rights reserved.
56814 + *
56815 + * $ATH_LICENSE_HOSTSDK0_C$
56816 + *
56817 + */
56818 +
56819 +#ifndef __DSET_INTERNAL_H__
56820 +#define __DSET_INTERNAL_H__
56821 +
56822 +/*
56823 + * Internal dset definitions, common for DataSet layer.
56824 + */
56825 +
56826 +#define DSET_TYPE_STANDARD 0
56827 +#define DSET_TYPE_BPATCHED 1
56828 +#define DSET_TYPE_COMPRESSED 2
56829 +
56830 +/* Dataset descriptor */
56831 +
56832 +typedef struct dset_descriptor_s {
56833 + struct dset_descriptor_s *next; /* List link. NULL only at the last
56834 + descriptor */
56835 + A_UINT16 id; /* Dset ID */
56836 + A_UINT16 size; /* Dset size. */
56837 + void *DataPtr; /* Pointer to raw data for standard
56838 + DataSet or pointer to original
56839 + dset_descriptor for patched
56840 + DataSet */
56841 + A_UINT32 data_type; /* DSET_TYPE_*, above */
56842 +
56843 + void *AuxPtr; /* Additional data that might
56844 + needed for data_type. For
56845 + example, pointer to patch
56846 + Dataset descriptor for BPatch. */
56847 +} dset_descriptor_t;
56848 +
56849 +#endif /* __DSET_INTERNAL_H__ */
56850 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/gpio_api.h
56851 ===================================================================
56852 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56853 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/gpio_api.h 2008-12-11 22:46:49.000000000 +0100
56854 @@ -0,0 +1,57 @@
56855 +#ifndef _GPIO_API_H_
56856 +#define _GPIO_API_H_
56857 +/*
56858 + * Copyright 2005 Atheros Communications, Inc., All Rights Reserved.
56859 + *
56860 + *
56861 + * This program is free software; you can redistribute it and/or modify
56862 + * it under the terms of the GNU General Public License version 2 as
56863 + * published by the Free Software Foundation;
56864 + *
56865 + * Software distributed under the License is distributed on an "AS
56866 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
56867 + * implied. See the License for the specific language governing
56868 + * rights and limitations under the License.
56869 + *
56870 + *
56871 + *
56872 + */
56873 +
56874 +/*
56875 + * Host-side General Purpose I/O API.
56876 + *
56877 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/gpio_api.h#1 $
56878 + */
56879 +
56880 +/*
56881 + * Send a command to the Target in order to change output on GPIO pins.
56882 + */
56883 +A_STATUS wmi_gpio_output_set(struct wmi_t *wmip,
56884 + A_UINT32 set_mask,
56885 + A_UINT32 clear_mask,
56886 + A_UINT32 enable_mask,
56887 + A_UINT32 disable_mask);
56888 +
56889 +/*
56890 + * Send a command to the Target requesting input state of GPIO pins.
56891 + */
56892 +A_STATUS wmi_gpio_input_get(struct wmi_t *wmip);
56893 +
56894 +/*
56895 + * Send a command to the Target to change the value of a GPIO register.
56896 + */
56897 +A_STATUS wmi_gpio_register_set(struct wmi_t *wmip,
56898 + A_UINT32 gpioreg_id,
56899 + A_UINT32 value);
56900 +
56901 +/*
56902 + * Send a command to the Target to fetch the value of a GPIO register.
56903 + */
56904 +A_STATUS wmi_gpio_register_get(struct wmi_t *wmip, A_UINT32 gpioreg_id);
56905 +
56906 +/*
56907 + * Send a command to the Target, acknowledging some GPIO interrupts.
56908 + */
56909 +A_STATUS wmi_gpio_intr_ack(struct wmi_t *wmip, A_UINT32 ack_mask);
56910 +
56911 +#endif /* _GPIO_API_H_ */
56912 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/gpio.h
56913 ===================================================================
56914 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56915 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/gpio.h 2008-12-11 22:46:49.000000000 +0100
56916 @@ -0,0 +1,34 @@
56917 +/*
56918 + * Copyright (c) 2005 Atheros Communications Inc.
56919 + * All rights reserved.
56920 + *
56921 + * $ATH_LICENSE_HOSTSDK0_C$
56922 + *
56923 + */
56924 +
56925 +#if defined(AR6001)
56926 +#define GPIO_PIN_COUNT 18
56927 +#else
56928 +#define GPIO_PIN_COUNT 18
56929 +#endif
56930 +
56931 +/*
56932 + * Possible values for WMIX_GPIO_SET_REGISTER_CMDID.
56933 + * NB: These match hardware order, so that addresses can
56934 + * easily be computed.
56935 + */
56936 +#define GPIO_ID_OUT 0x00000000
56937 +#define GPIO_ID_OUT_W1TS 0x00000001
56938 +#define GPIO_ID_OUT_W1TC 0x00000002
56939 +#define GPIO_ID_ENABLE 0x00000003
56940 +#define GPIO_ID_ENABLE_W1TS 0x00000004
56941 +#define GPIO_ID_ENABLE_W1TC 0x00000005
56942 +#define GPIO_ID_IN 0x00000006
56943 +#define GPIO_ID_STATUS 0x00000007
56944 +#define GPIO_ID_STATUS_W1TS 0x00000008
56945 +#define GPIO_ID_STATUS_W1TC 0x00000009
56946 +#define GPIO_ID_PIN0 0x0000000a
56947 +#define GPIO_ID_PIN(n) (GPIO_ID_PIN0+(n))
56948 +
56949 +#define GPIO_LAST_REGISTER_ID GPIO_ID_PIN(17)
56950 +#define GPIO_ID_NONE 0xffffffff
56951 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/hif.h
56952 ===================================================================
56953 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
56954 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/hif.h 2008-12-11 22:46:49.000000000 +0100
56955 @@ -0,0 +1,296 @@
56956 +/*
56957 + * Copyright (c) 2004-2007 Atheros Communications Inc.
56958 + * All rights reserved.
56959 + *
56960 + *
56961 + * This program is free software; you can redistribute it and/or modify
56962 + * it under the terms of the GNU General Public License version 2 as
56963 + * published by the Free Software Foundation;
56964 + *
56965 + * Software distributed under the License is distributed on an "AS
56966 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
56967 + * implied. See the License for the specific language governing
56968 + * rights and limitations under the License.
56969 + *
56970 + *
56971 + *
56972 + * HIF specific declarations and prototypes
56973 + */
56974 +
56975 +#ifndef _HIF_H_
56976 +#define _HIF_H_
56977 +
56978 +#ifdef __cplusplus
56979 +extern "C" {
56980 +#endif /* __cplusplus */
56981 +
56982 +/* Header files */
56983 +#include "a_config.h"
56984 +#include "athdefs.h"
56985 +#include "a_types.h"
56986 +#include "a_osapi.h"
56987 +
56988 +typedef struct htc_callbacks HTC_CALLBACKS;
56989 +typedef struct hif_device HIF_DEVICE;
56990 +
56991 +/*
56992 + * direction - Direction of transfer (HIF_READ/HIF_WRITE).
56993 + */
56994 +#define HIF_READ 0x00000001
56995 +#define HIF_WRITE 0x00000002
56996 +#define HIF_DIR_MASK (HIF_READ | HIF_WRITE)
56997 +
56998 +/*
56999 + * type - An interface may support different kind of read/write commands.
57000 + * The command type is divided into a basic and an extended command
57001 + * and can be specified using HIF_BASIC_IO/HIF_EXTENDED_IO.
57002 + */
57003 +#define HIF_BASIC_IO 0x00000004
57004 +#define HIF_EXTENDED_IO 0x00000008
57005 +#define HIF_TYPE_MASK (HIF_BASIC_IO | HIF_EXTENDED_IO)
57006 +
57007 +/*
57008 + * emode - This indicates the whether the command is to be executed in a
57009 + * blocking or non-blocking fashion (HIF_SYNCHRONOUS/
57010 + * HIF_ASYNCHRONOUS). The read/write data paths in HTC have been
57011 + * implemented using the asynchronous mode allowing the the bus
57012 + * driver to indicate the completion of operation through the
57013 + * registered callback routine. The requirement primarily comes
57014 + * from the contexts these operations get called from (a driver's
57015 + * transmit context or the ISR context in case of receive).
57016 + * Support for both of these modes is essential.
57017 + */
57018 +#define HIF_SYNCHRONOUS 0x00000010
57019 +#define HIF_ASYNCHRONOUS 0x00000020
57020 +#define HIF_EMODE_MASK (HIF_SYNCHRONOUS | HIF_ASYNCHRONOUS)
57021 +
57022 +/*
57023 + * dmode - An interface may support different kinds of commands based on
57024 + * the tradeoff between the amount of data it can carry and the
57025 + * setup time. Byte and Block modes are supported (HIF_BYTE_BASIS/
57026 + * HIF_BLOCK_BASIS). In case of latter, the data is rounded off
57027 + * to the nearest block size by padding. The size of the block is
57028 + * configurable at compile time using the HIF_BLOCK_SIZE and is
57029 + * negotiated with the target during initialization after the
57030 + * dragon interrupts are enabled.
57031 + */
57032 +#define HIF_BYTE_BASIS 0x00000040
57033 +#define HIF_BLOCK_BASIS 0x00000080
57034 +#define HIF_DMODE_MASK (HIF_BYTE_BASIS | HIF_BLOCK_BASIS)
57035 +
57036 +/*
57037 + * amode - This indicates if the address has to be incremented on dragon
57038 + * after every read/write operation (HIF?FIXED_ADDRESS/
57039 + * HIF_INCREMENTAL_ADDRESS).
57040 + */
57041 +#define HIF_FIXED_ADDRESS 0x00000100
57042 +#define HIF_INCREMENTAL_ADDRESS 0x00000200
57043 +#define HIF_AMODE_MASK (HIF_FIXED_ADDRESS | HIF_INCREMENTAL_ADDRESS)
57044 +
57045 +#define HIF_WR_ASYNC_BYTE_FIX \
57046 + (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
57047 +#define HIF_WR_ASYNC_BYTE_INC \
57048 + (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
57049 +#define HIF_WR_ASYNC_BLOCK_INC \
57050 + (HIF_WRITE | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
57051 +#define HIF_WR_SYNC_BYTE_FIX \
57052 + (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
57053 +#define HIF_WR_SYNC_BYTE_INC \
57054 + (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
57055 +#define HIF_WR_SYNC_BLOCK_INC \
57056 + (HIF_WRITE | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
57057 +#define HIF_RD_SYNC_BYTE_INC \
57058 + (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
57059 +#define HIF_RD_SYNC_BYTE_FIX \
57060 + (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
57061 +#define HIF_RD_ASYNC_BYTE_FIX \
57062 + (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_FIXED_ADDRESS)
57063 +#define HIF_RD_ASYNC_BLOCK_FIX \
57064 + (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_FIXED_ADDRESS)
57065 +#define HIF_RD_ASYNC_BYTE_INC \
57066 + (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BYTE_BASIS | HIF_INCREMENTAL_ADDRESS)
57067 +#define HIF_RD_ASYNC_BLOCK_INC \
57068 + (HIF_READ | HIF_ASYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
57069 +#define HIF_RD_SYNC_BLOCK_INC \
57070 + (HIF_READ | HIF_SYNCHRONOUS | HIF_EXTENDED_IO | HIF_BLOCK_BASIS | HIF_INCREMENTAL_ADDRESS)
57071 +
57072 +
57073 +typedef enum {
57074 + HIF_DEVICE_POWER_STATE = 0,
57075 + HIF_DEVICE_GET_MBOX_BLOCK_SIZE,
57076 + HIF_DEVICE_GET_MBOX_ADDR,
57077 + HIF_DEVICE_GET_PENDING_EVENTS_FUNC,
57078 + HIF_DEVICE_GET_IRQ_PROC_MODE,
57079 + HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC,
57080 +} HIF_DEVICE_CONFIG_OPCODE;
57081 +
57082 +/*
57083 + * HIF CONFIGURE definitions:
57084 + *
57085 + * HIF_DEVICE_GET_MBOX_BLOCK_SIZE
57086 + * input : none
57087 + * output : array of 4 A_UINT32s
57088 + * notes: block size is returned for each mailbox (4)
57089 + *
57090 + * HIF_DEVICE_GET_MBOX_ADDR
57091 + * input : none
57092 + * output : array of 4 A_UINT32
57093 + * notes: address is returned for each mailbox (4) in the array
57094 + *
57095 + * HIF_DEVICE_GET_PENDING_EVENTS_FUNC
57096 + * input : none
57097 + * output: HIF_PENDING_EVENTS_FUNC function pointer
57098 + * notes: this is optional for the HIF layer, if the request is
57099 + * not handled then it indicates that the upper layer can use
57100 + * the standard device methods to get pending events (IRQs, mailbox messages etc..)
57101 + * otherwise it can call the function pointer to check pending events.
57102 + *
57103 + * HIF_DEVICE_GET_IRQ_PROC_MODE
57104 + * input : none
57105 + * output : HIF_DEVICE_IRQ_PROCESSING_MODE (interrupt processing mode)
57106 + * note: the hif layer interfaces with the underlying OS-specific bus driver. The HIF
57107 + * layer can report whether IRQ processing is requires synchronous behavior or
57108 + * can be processed using asynchronous bus requests (typically faster).
57109 + *
57110 + * HIF_DEVICE_GET_RECV_EVENT_MASK_UNMASK_FUNC
57111 + * input :
57112 + * output : HIF_MASK_UNMASK_RECV_EVENT function pointer
57113 + * notes: this is optional for the HIF layer. The HIF layer may require a special mechanism
57114 + * to mask receive message events. The upper layer can call this pointer when it needs
57115 + * to mask/unmask receive events (in case it runs out of buffers).
57116 + *
57117 + *
57118 + */
57119 +
57120 +typedef enum {
57121 + HIF_DEVICE_IRQ_SYNC_ONLY, /* for HIF implementations that require the DSR to process all
57122 + interrupts before returning */
57123 + HIF_DEVICE_IRQ_ASYNC_SYNC, /* for HIF implementations that allow DSR to process interrupts
57124 + using ASYNC I/O (that is HIFAckInterrupt can be called at a
57125 + later time */
57126 +} HIF_DEVICE_IRQ_PROCESSING_MODE;
57127 +
57128 +#define HIF_MAX_DEVICES 1
57129 +
57130 +struct htc_callbacks {
57131 + A_UCHAR *name;
57132 + A_UINT32 id;
57133 + A_STATUS (* deviceInsertedHandler)(void *hif_handle);
57134 + A_STATUS (* deviceRemovedHandler)(void *htc_handle, A_STATUS status);
57135 + A_STATUS (* deviceSuspendHandler)(void *htc_handle);
57136 + A_STATUS (* deviceResumeHandler)(void *htc_handle);
57137 + A_STATUS (* deviceWakeupHandler)(void *htc_handle);
57138 + A_STATUS (* rwCompletionHandler)(void *context, A_STATUS status);
57139 + A_STATUS (* dsrHandler)(void *htc_handle);
57140 +};
57141 +
57142 +
57143 +#define HIF_OTHER_EVENTS (1 << 0) /* other interrupts (non-Recv) are pending, host
57144 + needs to read the register table to figure out what */
57145 +#define HIF_RECV_MSG_AVAIL (1 << 1) /* pending recv packet */
57146 +
57147 +typedef struct _HIF_PENDING_EVENTS_INFO {
57148 + A_UINT32 Events;
57149 + A_UINT32 LookAhead;
57150 +} HIF_PENDING_EVENTS_INFO;
57151 +
57152 + /* function to get pending events , some HIF modules use special mechanisms
57153 + * to detect packet available and other interrupts */
57154 +typedef A_STATUS ( *HIF_PENDING_EVENTS_FUNC)(HIF_DEVICE *device,
57155 + HIF_PENDING_EVENTS_INFO *pEvents,
57156 + void *AsyncContext);
57157 +
57158 +#define HIF_MASK_RECV TRUE
57159 +#define HIF_UNMASK_RECV FALSE
57160 + /* function to mask recv events */
57161 +typedef A_STATUS ( *HIF_MASK_UNMASK_RECV_EVENT)(HIF_DEVICE *device,
57162 + A_BOOL Mask,
57163 + void *AsyncContext);
57164 +
57165 +
57166 +/*
57167 + * This API is used by the HTC layer to initialize the HIF layer and to
57168 + * register different callback routines. Support for following events has
57169 + * been captured - DSR, Read/Write completion, Device insertion/removal,
57170 + * Device suspension/resumption/wakeup. In addition to this, the API is
57171 + * also used to register the name and the revision of the chip. The latter
57172 + * can be used to verify the revision of the chip read from the device
57173 + * before reporting it to HTC.
57174 + */
57175 +int HIFInit(HTC_CALLBACKS *callbacks);
57176 +
57177 +/*
57178 + * This API is used to provide the read/write interface over the specific bus
57179 + * interface.
57180 + * address - Starting address in the dragon's address space. For mailbox
57181 + * writes, it refers to the start of the mbox boundary. It should
57182 + * be ensured that the last byte falls on the mailbox's EOM. For
57183 + * mailbox reads, it refers to the end of the mbox boundary.
57184 + * buffer - Pointer to the buffer containg the data to be transmitted or
57185 + * received.
57186 + * length - Amount of data to be transmitted or received.
57187 + * request - Characterizes the attributes of the command.
57188 + */
57189 +A_STATUS
57190 +HIFReadWrite(HIF_DEVICE *device,
57191 + A_UINT32 address,
57192 + A_UCHAR *buffer,
57193 + A_UINT32 length,
57194 + A_UINT32 request,
57195 + void *context);
57196 +
57197 +/*
57198 + * This can be initiated from the unload driver context ie when the HTCShutdown
57199 + * routine is called.
57200 + */
57201 +void HIFShutDownDevice(HIF_DEVICE *device);
57202 +
57203 +/*
57204 + * This should translate to an acknowledgment to the bus driver indicating that
57205 + * the previous interrupt request has been serviced and the all the relevant
57206 + * sources have been cleared. HTC is ready to process more interrupts.
57207 + * This should prevent the bus driver from raising an interrupt unless the
57208 + * previous one has been serviced and acknowledged using the previous API.
57209 + */
57210 +void HIFAckInterrupt(HIF_DEVICE *device);
57211 +
57212 +void HIFMaskInterrupt(HIF_DEVICE *device);
57213 +
57214 +void HIFUnMaskInterrupt(HIF_DEVICE *device);
57215 +
57216 +/*
57217 + * This set of functions are to be used by the bus driver to notify
57218 + * the HIF module about various events.
57219 + * These are not implemented if the bus driver provides an alternative
57220 + * way for this notification though callbacks for instance.
57221 + */
57222 +int HIFInsertEventNotify(void);
57223 +
57224 +int HIFRemoveEventNotify(void);
57225 +
57226 +int HIFIRQEventNotify(void);
57227 +
57228 +int HIFRWCompleteEventNotify(void);
57229 +
57230 +/*
57231 + * This function associates a opaque handle with the HIF layer
57232 + * to be used in communication with upper layer i.e. HTC.
57233 + * This would normaly be a pointer to htc_target data structure.
57234 + */
57235 +void HIFSetHandle(void *hif_handle, void *handle);
57236 +
57237 +A_STATUS
57238 +HIFConfigureDevice(HIF_DEVICE *device, HIF_DEVICE_CONFIG_OPCODE opcode,
57239 + void *config, A_UINT32 configLen);
57240 +
57241 +
57242 +struct device;
57243 +struct device*
57244 +HIFGetOSDevice(HIF_DEVICE *device);
57245 +
57246 +
57247 +#ifdef __cplusplus
57248 +}
57249 +#endif
57250 +
57251 +#endif /* _HIF_H_ */
57252 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/host_version.h
57253 ===================================================================
57254 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
57255 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/host_version.h 2008-12-11 22:46:49.000000000 +0100
57256 @@ -0,0 +1,49 @@
57257 +#ifndef _HOST_VERSION_H_
57258 +#define _HOST_VERSION_H_
57259 +/*
57260 + * Copyright (c) 2004-2005 Atheros Communications Inc.
57261 + * All rights reserved.
57262 + *
57263 + * This file contains version information for the sample host driver for the
57264 + * AR6000 chip
57265 + *
57266 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/host_version.h#2 $
57267 + *
57268 + *
57269 + * This program is free software; you can redistribute it and/or modify
57270 + * it under the terms of the GNU General Public License version 2 as
57271 + * published by the Free Software Foundation;
57272 + *
57273 + * Software distributed under the License is distributed on an "AS
57274 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
57275 + * implied. See the License for the specific language governing
57276 + * rights and limitations under the License.
57277 + *
57278 + *
57279 + *
57280 + */
57281 +
57282 +#ifdef __cplusplus
57283 +extern "C" {
57284 +#endif
57285 +
57286 +#include <AR6K_version.h>
57287 +
57288 +/*
57289 + * The version number is made up of major, minor, patch and build
57290 + * numbers. These are 16 bit numbers. The build and release script will
57291 + * set the build number using a Perforce counter. Here the build number is
57292 + * set to 9999 so that builds done without the build-release script are easily
57293 + * identifiable.
57294 + */
57295 +
57296 +#define ATH_SW_VER_MAJOR __VER_MAJOR_
57297 +#define ATH_SW_VER_MINOR __VER_MINOR_
57298 +#define ATH_SW_VER_PATCH __VER_PATCH_
57299 +#define ATH_SW_VER_BUILD 9999
57300 +
57301 +#ifdef __cplusplus
57302 +}
57303 +#endif
57304 +
57305 +#endif /* _HOST_VERSION_H_ */
57306 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/htc_api.h
57307 ===================================================================
57308 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
57309 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/htc_api.h 2008-12-11 22:46:49.000000000 +0100
57310 @@ -0,0 +1,436 @@
57311 +/*
57312 + *
57313 + * Copyright (c) 2007 Atheros Communications Inc.
57314 + * All rights reserved.
57315 + *
57316 + *
57317 + * This program is free software; you can redistribute it and/or modify
57318 + * it under the terms of the GNU General Public License version 2 as
57319 + * published by the Free Software Foundation;
57320 + *
57321 + * Software distributed under the License is distributed on an "AS
57322 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
57323 + * implied. See the License for the specific language governing
57324 + * rights and limitations under the License.
57325 + *
57326 + *
57327 + *
57328 + */
57329 +
57330 +#ifndef _HTC_API_H_
57331 +#define _HTC_API_H_
57332 +
57333 +#include <htc.h>
57334 +#include <htc_services.h>
57335 +#include "htc_packet.h"
57336 +
57337 +#ifdef __cplusplus
57338 +extern "C" {
57339 +#endif /* __cplusplus */
57340 +
57341 +/* TODO.. for BMI */
57342 +#define ENDPOINT1 0
57343 +// TODO -remove me, but we have to fix BMI first
57344 +#define HTC_MAILBOX_NUM_MAX 4
57345 +
57346 +
57347 +/* ------ Endpoint IDS ------ */
57348 +typedef enum
57349 +{
57350 + ENDPOINT_UNUSED = -1,
57351 + ENDPOINT_0 = 0,
57352 + ENDPOINT_1 = 1,
57353 + ENDPOINT_2 = 2,
57354 + ENDPOINT_3,
57355 + ENDPOINT_4,
57356 + ENDPOINT_5,
57357 + ENDPOINT_6,
57358 + ENDPOINT_7,
57359 + ENDPOINT_8,
57360 + ENDPOINT_MAX,
57361 +} HTC_ENDPOINT_ID;
57362 +
57363 +/* this is the amount of header room required by users of HTC */
57364 +#define HTC_HEADER_LEN HTC_HDR_LENGTH
57365 +
57366 +typedef void *HTC_HANDLE;
57367 +
57368 +typedef A_UINT16 HTC_SERVICE_ID;
57369 +
57370 +typedef struct _HTC_INIT_INFO {
57371 + void (*AddInstance)(HTC_HANDLE);
57372 + void (*DeleteInstance)(void *Instance);
57373 + void (*TargetFailure)(void *Instance, A_STATUS Status);
57374 +} HTC_INIT_INFO;
57375 +
57376 +/* per service connection send completion */
57377 +typedef void (*HTC_EP_SEND_PKT_COMPLETE)(void *,HTC_PACKET *);
57378 +/* per service connection pkt received */
57379 +typedef void (*HTC_EP_RECV_PKT)(void *,HTC_PACKET *);
57380 +
57381 +/* Optional per service connection receive buffer re-fill callback,
57382 + * On some OSes (like Linux) packets are allocated from a global pool and indicated up
57383 + * to the network stack. The driver never gets the packets back from the OS. For these OSes
57384 + * a refill callback can be used to allocate and re-queue buffers into HTC.
57385 + *
57386 + * On other OSes, the network stack can call into the driver's OS-specifc "return_packet" handler and
57387 + * the driver can re-queue these buffers into HTC. In this regard a refill callback is
57388 + * unnecessary */
57389 +typedef void (*HTC_EP_RECV_REFILL)(void *, HTC_ENDPOINT_ID Endpoint);
57390 +
57391 +/* Optional per service connection callback when a send queue is full. This can occur if the
57392 + * host continues queueing up TX packets faster than credits can arrive
57393 + * To prevent the host (on some Oses like Linux) from continuously queueing packets
57394 + * and consuming resources, this callback is provided so that that the host
57395 + * can disable TX in the subsystem (i.e. network stack)
57396 + * Other OSes require a "per-packet" indication_RAW_STREAM_NUM_MAX for each completed TX packet, this
57397 + * closed loop mechanism will prevent the network stack from overunning the NIC */
57398 +typedef void (*HTC_EP_SEND_QUEUE_FULL)(void *, HTC_ENDPOINT_ID Endpoint);
57399 +
57400 +typedef struct _HTC_EP_CALLBACKS {
57401 + void *pContext; /* context for each callback */
57402 + HTC_EP_SEND_PKT_COMPLETE EpTxComplete; /* tx completion callback for connected endpoint */
57403 + HTC_EP_RECV_PKT EpRecv; /* receive callback for connected endpoint */
57404 + HTC_EP_RECV_REFILL EpRecvRefill; /* OPTIONAL receive re-fill callback for connected endpoint */
57405 + HTC_EP_SEND_QUEUE_FULL EpSendFull; /* OPTIONAL send full callback */
57406 +} HTC_EP_CALLBACKS;
57407 +
57408 +/* service connection information */
57409 +typedef struct _HTC_SERVICE_CONNECT_REQ {
57410 + HTC_SERVICE_ID ServiceID; /* service ID to connect to */
57411 + A_UINT16 ConnectionFlags; /* connection flags, see htc protocol definition */
57412 + A_UINT8 *pMetaData; /* ptr to optional service-specific meta-data */
57413 + A_UINT8 MetaDataLength; /* optional meta data length */
57414 + HTC_EP_CALLBACKS EpCallbacks; /* endpoint callbacks */
57415 + int MaxSendQueueDepth; /* maximum depth of any send queue */
57416 +} HTC_SERVICE_CONNECT_REQ;
57417 +
57418 +/* service connection response information */
57419 +typedef struct _HTC_SERVICE_CONNECT_RESP {
57420 + A_UINT8 *pMetaData; /* caller supplied buffer to optional meta-data */
57421 + A_UINT8 BufferLength; /* length of caller supplied buffer */
57422 + A_UINT8 ActualLength; /* actual length of meta data */
57423 + HTC_ENDPOINT_ID Endpoint; /* endpoint to communicate over */
57424 + int MaxMsgLength; /* max length of all messages over this endpoint */
57425 + A_UINT8 ConnectRespCode; /* connect response code from target */
57426 +} HTC_SERVICE_CONNECT_RESP;
57427 +
57428 +/* endpoint distribution structure */
57429 +typedef struct _HTC_ENDPOINT_CREDIT_DIST {
57430 + struct _HTC_ENDPOINT_CREDIT_DIST *pNext;
57431 + struct _HTC_ENDPOINT_CREDIT_DIST *pPrev;
57432 + HTC_SERVICE_ID ServiceID; /* Service ID (set by HTC) */
57433 + HTC_ENDPOINT_ID Endpoint; /* endpoint for this distribution struct (set by HTC) */
57434 + A_UINT32 DistFlags; /* distribution flags, distribution function can
57435 + set default activity using SET_EP_ACTIVE() macro */
57436 + int TxCreditsNorm; /* credits for normal operation, anything above this
57437 + indicates the endpoint is over-subscribed, this field
57438 + is only relevant to the credit distribution function */
57439 + int TxCreditsMin; /* floor for credit distribution, this field is
57440 + only relevant to the credit distribution function */
57441 + int TxCreditsAssigned; /* number of credits assigned to this EP, this field
57442 + is only relevant to the credit dist function */
57443 + int TxCredits; /* current credits available, this field is used by
57444 + HTC to determine whether a message can be sent or
57445 + must be queued */
57446 + int TxCreditsToDist; /* pending credits to distribute on this endpoint, this
57447 + is set by HTC when credit reports arrive.
57448 + The credit distribution functions sets this to zero
57449 + when it distributes the credits */
57450 + int TxCreditsSeek; /* this is the number of credits that the current pending TX
57451 + packet needs to transmit. This is set by HTC when
57452 + and endpoint needs credits in order to transmit */
57453 + int TxCreditSize; /* size in bytes of each credit (set by HTC) */
57454 + int TxCreditsPerMaxMsg; /* credits required for a maximum sized messages (set by HTC) */
57455 + void *pHTCReserved; /* reserved for HTC use */
57456 +} HTC_ENDPOINT_CREDIT_DIST;
57457 +
57458 +#define HTC_EP_ACTIVE (1 << 31)
57459 +
57460 +/* macro to check if an endpoint has gone active, useful for credit
57461 + * distributions */
57462 +#define IS_EP_ACTIVE(epDist) ((epDist)->DistFlags & HTC_EP_ACTIVE)
57463 +#define SET_EP_ACTIVE(epDist) (epDist)->DistFlags |= HTC_EP_ACTIVE
57464 +
57465 + /* credit distibution code that is passed into the distrbution function,
57466 + * there are mandatory and optional codes that must be handled */
57467 +typedef enum _HTC_CREDIT_DIST_REASON {
57468 + HTC_CREDIT_DIST_SEND_COMPLETE = 0, /* credits available as a result of completed
57469 + send operations (MANDATORY) resulting in credit reports */
57470 + HTC_CREDIT_DIST_ACTIVITY_CHANGE = 1, /* a change in endpoint activity occured (OPTIONAL) */
57471 + HTC_CREDIT_DIST_SEEK_CREDITS, /* an endpoint needs to "seek" credits (OPTIONAL) */
57472 + HTC_DUMP_CREDIT_STATE /* for debugging, dump any state information that is kept by
57473 + the distribution function */
57474 +} HTC_CREDIT_DIST_REASON;
57475 +
57476 +typedef void (*HTC_CREDIT_DIST_CALLBACK)(void *Context,
57477 + HTC_ENDPOINT_CREDIT_DIST *pEPList,
57478 + HTC_CREDIT_DIST_REASON Reason);
57479 +
57480 +typedef void (*HTC_CREDIT_INIT_CALLBACK)(void *Context,
57481 + HTC_ENDPOINT_CREDIT_DIST *pEPList,
57482 + int TotalCredits);
57483 +
57484 + /* endpoint statistics action */
57485 +typedef enum _HTC_ENDPOINT_STAT_ACTION {
57486 + HTC_EP_STAT_SAMPLE = 0, /* only read statistics */
57487 + HTC_EP_STAT_SAMPLE_AND_CLEAR = 1, /* sample and immediately clear statistics */
57488 + HTC_EP_STAT_CLEAR /* clear only */
57489 +} HTC_ENDPOINT_STAT_ACTION;
57490 +
57491 + /* endpoint statistics */
57492 +typedef struct _HTC_ENDPOINT_STATS {
57493 + A_UINT32 TxCreditLowIndications; /* number of times the host set the credit-low flag in a send message on
57494 + this endpoint */
57495 + A_UINT32 TxIssued; /* running count of TX packets issued */
57496 + A_UINT32 TxCreditRpts; /* running count of total credit reports received for this endpoint */
57497 + A_UINT32 TxCreditRptsFromRx;
57498 + A_UINT32 TxCreditRptsFromOther;
57499 + A_UINT32 TxCreditRptsFromEp0;
57500 + A_UINT32 TxCreditsFromRx; /* count of credits received via Rx packets on this endpoint */
57501 + A_UINT32 TxCreditsFromOther; /* count of credits received via another endpoint */
57502 + A_UINT32 TxCreditsFromEp0; /* count of credits received via another endpoint */
57503 + A_UINT32 TxCreditsConsummed; /* count of consummed credits */
57504 + A_UINT32 TxCreditsReturned; /* count of credits returned */
57505 + A_UINT32 RxReceived; /* count of RX packets received */
57506 + A_UINT32 RxLookAheads; /* count of lookahead records
57507 + found in messages received on this endpoint */
57508 +} HTC_ENDPOINT_STATS;
57509 +
57510 +/* ------ Function Prototypes ------ */
57511 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57512 + @desc: Initialize HTC
57513 + @function name: HTCInit
57514 + @input: pInfo - initialization information
57515 + @output:
57516 + @return: A_OK on success
57517 + @notes: The caller initializes global HTC state and registers various instance
57518 + notification callbacks (see HTC_INIT_INFO).
57519 +
57520 + @example:
57521 + @see also: HTCShutdown
57522 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57523 +A_STATUS HTCInit(HTC_INIT_INFO *pInfo);
57524 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57525 + @desc: Get the underlying HIF device handle
57526 + @function name: HTCGetHifDevice
57527 + @input: HTCHandle - handle passed into the AddInstance callback
57528 + @output:
57529 + @return: opaque HIF device handle usable in HIF API calls.
57530 + @notes:
57531 + @example:
57532 + @see also:
57533 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57534 +void *HTCGetHifDevice(HTC_HANDLE HTCHandle);
57535 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57536 + @desc: Set the associated instance for the HTC handle
57537 + @function name: HTCSetInstance
57538 + @input: HTCHandle - handle passed into the AddInstance callback
57539 + Instance - caller supplied instance object
57540 + @output:
57541 + @return:
57542 + @notes: Caller must set the instance information for the HTC handle in order to receive
57543 + notifications for instance deletion (DeleteInstance callback is called) and for target
57544 + failure notification.
57545 + @example:
57546 + @see also:
57547 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57548 +void HTCSetInstance(HTC_HANDLE HTCHandle, void *Instance);
57549 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57550 + @desc: Set credit distribution parameters
57551 + @function name: HTCSetCreditDistribution
57552 + @input: HTCHandle - HTC handle
57553 + pCreditDistCont - caller supplied context to pass into distribution functions
57554 + CreditDistFunc - Distribution function callback
57555 + CreditDistInit - Credit Distribution initialization callback
57556 + ServicePriorityOrder - Array containing list of service IDs, lowest index is highest
57557 + priority
57558 + ListLength - number of elements in ServicePriorityOrder
57559 + @output:
57560 + @return:
57561 + @notes: The user can set a custom credit distribution function to handle special requirements
57562 + for each endpoint. A default credit distribution routine can be used by setting
57563 + CreditInitFunc to NULL. The default credit distribution is only provided for simple
57564 + "fair" credit distribution without regard to any prioritization.
57565 +
57566 + @example:
57567 + @see also:
57568 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57569 +void HTCSetCreditDistribution(HTC_HANDLE HTCHandle,
57570 + void *pCreditDistContext,
57571 + HTC_CREDIT_DIST_CALLBACK CreditDistFunc,
57572 + HTC_CREDIT_INIT_CALLBACK CreditInitFunc,
57573 + HTC_SERVICE_ID ServicePriorityOrder[],
57574 + int ListLength);
57575 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57576 + @desc: Wait for the target to indicate the HTC layer is ready
57577 + @function name: HTCWaitTarget
57578 + @input: HTCHandle - HTC handle
57579 + @output:
57580 + @return:
57581 + @notes: This API blocks until the target responds with an HTC ready message.
57582 + The caller should not connect services until the target has indicated it is
57583 + ready.
57584 + @example:
57585 + @see also: HTCConnectService
57586 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57587 +A_STATUS HTCWaitTarget(HTC_HANDLE HTCHandle);
57588 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57589 + @desc: Start target service communications
57590 + @function name: HTCStart
57591 + @input: HTCHandle - HTC handle
57592 + @output:
57593 + @return:
57594 + @notes: This API indicates to the target that the service connection phase is complete
57595 + and the target can freely start all connected services. This API should only be
57596 + called AFTER all service connections have been made. TCStart will issue a
57597 + SETUP_COMPLETE message to the target to indicate that all service connections
57598 + have been made and the target can start communicating over the endpoints.
57599 + @example:
57600 + @see also: HTCConnectService
57601 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57602 +A_STATUS HTCStart(HTC_HANDLE HTCHandle);
57603 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57604 + @desc: Add receive packet to HTC
57605 + @function name: HTCAddReceivePkt
57606 + @input: HTCHandle - HTC handle
57607 + pPacket - HTC receive packet to add
57608 + @output:
57609 + @return: A_OK on success
57610 + @notes: user must supply HTC packets for capturing incomming HTC frames. The caller
57611 + must initialize each HTC packet using the SET_HTC_PACKET_INFO_RX_REFILL()
57612 + macro.
57613 + @example:
57614 + @see also:
57615 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57616 +A_STATUS HTCAddReceivePkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket);
57617 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57618 + @desc: Connect to an HTC service
57619 + @function name: HTCConnectService
57620 + @input: HTCHandle - HTC handle
57621 + pReq - connection details
57622 + @output: pResp - connection response
57623 + @return:
57624 + @notes: Service connections must be performed before HTCStart. User provides callback handlers
57625 + for various endpoint events.
57626 + @example:
57627 + @see also: HTCStart
57628 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57629 +A_STATUS HTCConnectService(HTC_HANDLE HTCHandle,
57630 + HTC_SERVICE_CONNECT_REQ *pReq,
57631 + HTC_SERVICE_CONNECT_RESP *pResp);
57632 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57633 + @desc: Send an HTC packet
57634 + @function name: HTCSendPkt
57635 + @input: HTCHandle - HTC handle
57636 + pPacket - packet to send
57637 + @output:
57638 + @return: A_OK
57639 + @notes: Caller must initialize packet using SET_HTC_PACKET_INFO_TX() macro.
57640 + This interface is fully asynchronous. On error, HTC SendPkt will
57641 + call the registered Endpoint callback to cleanup the packet.
57642 + @example:
57643 + @see also: HTCFlushEndpoint
57644 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57645 +A_STATUS HTCSendPkt(HTC_HANDLE HTCHandle, HTC_PACKET *pPacket);
57646 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57647 + @desc: Stop HTC service communications
57648 + @function name: HTCStop
57649 + @input: HTCHandle - HTC handle
57650 + @output:
57651 + @return:
57652 + @notes: HTC communications is halted. All receive and pending TX packets will
57653 + be flushed.
57654 + @example:
57655 + @see also:
57656 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57657 +void HTCStop(HTC_HANDLE HTCHandle);
57658 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57659 + @desc: Shutdown HTC
57660 + @function name: HTCShutdown
57661 + @input:
57662 + @output:
57663 + @return:
57664 + @notes: This cleans up all resources allocated by HTCInit().
57665 + @example:
57666 + @see also: HTCInit
57667 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57668 +void HTCShutDown(void);
57669 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57670 + @desc: Flush pending TX packets
57671 + @function name: HTCFlushEndpoint
57672 + @input: HTCHandle - HTC handle
57673 + Endpoint - Endpoint to flush
57674 + Tag - flush tag
57675 + @output:
57676 + @return:
57677 + @notes: The Tag parameter is used to selectively flush packets with matching tags.
57678 + The value of 0 forces all packets to be flush regardless of tag.
57679 + @example:
57680 + @see also: HTCSendPkt
57681 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57682 +void HTCFlushEndpoint(HTC_HANDLE HTCHandle, HTC_ENDPOINT_ID Endpoint, HTC_TX_TAG Tag);
57683 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57684 + @desc: Dump credit distribution state
57685 + @function name: HTCDumpCreditStates
57686 + @input: HTCHandle - HTC handle
57687 + @output:
57688 + @return:
57689 + @notes: This dumps all credit distribution information to the debugger
57690 + @example:
57691 + @see also:
57692 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57693 +void HTCDumpCreditStates(HTC_HANDLE HTCHandle);
57694 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57695 + @desc: Indicate a traffic activity change on an endpoint
57696 + @function name: HTCIndicateActivityChange
57697 + @input: HTCHandle - HTC handle
57698 + Endpoint - endpoint in which activity has changed
57699 + Active - TRUE if active, FALSE if it has become inactive
57700 + @output:
57701 + @return:
57702 + @notes: This triggers the registered credit distribution function to
57703 + re-adjust credits for active/inactive endpoints.
57704 + @example:
57705 + @see also:
57706 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57707 +void HTCIndicateActivityChange(HTC_HANDLE HTCHandle,
57708 + HTC_ENDPOINT_ID Endpoint,
57709 + A_BOOL Active);
57710 +
57711 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
57712 + @desc: Get endpoint statistics
57713 + @function name: HTCGetEndpointStatistics
57714 + @input: HTCHandle - HTC handle
57715 + Endpoint - Endpoint identifier
57716 + Action - action to take with statistics
57717 + @output:
57718 + pStats - statistics that were sampled (can be NULL if Action is HTC_EP_STAT_CLEAR)
57719 +
57720 + @return: TRUE if statistics profiling is enabled, otherwise FALSE.
57721 +
57722 + @notes: Statistics is a compile-time option and this function may return FALSE
57723 + if HTC is not compiled with profiling.
57724 +
57725 + The caller can specify the statistic "action" to take when sampling
57726 + the statistics. This includes:
57727 +
57728 + HTC_EP_STAT_SAMPLE: The pStats structure is filled with the current values.
57729 + HTC_EP_STAT_SAMPLE_AND_CLEAR: The structure is filled and the current statistics
57730 + are cleared.
57731 + HTC_EP_STAT_CLEA : the statistics are cleared, the called can pass a NULL value for
57732 + pStats
57733 +
57734 + @example:
57735 + @see also:
57736 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
57737 +A_BOOL HTCGetEndpointStatistics(HTC_HANDLE HTCHandle,
57738 + HTC_ENDPOINT_ID Endpoint,
57739 + HTC_ENDPOINT_STAT_ACTION Action,
57740 + HTC_ENDPOINT_STATS *pStats);
57741 +
57742 +#ifdef __cplusplus
57743 +}
57744 +#endif
57745 +
57746 +#endif /* _HTC_API_H_ */
57747 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/htc.h
57748 ===================================================================
57749 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
57750 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/htc.h 2008-12-11 22:46:49.000000000 +0100
57751 @@ -0,0 +1,190 @@
57752 +/*
57753 + * Copyright (c) 2007 Atheros Communications Inc.
57754 + * All rights reserved.
57755 + *
57756 + * $ATH_LICENSE_HOSTSDK0_C$
57757 + *
57758 + */
57759 +
57760 +
57761 +#ifndef __HTC_H__
57762 +#define __HTC_H__
57763 +
57764 +#ifndef ATH_TARGET
57765 +#include "athstartpack.h"
57766 +#endif
57767 +
57768 +#define A_OFFSETOF(type,field) (int)(&(((type *)NULL)->field))
57769 +
57770 +#define ASSEMBLE_UNALIGNED_UINT16(p,highbyte,lowbyte) \
57771 + (((A_UINT16)(((A_UINT8 *)(p))[(highbyte)])) << 8 | (A_UINT16)(((A_UINT8 *)(p))[(lowbyte)]))
57772 +
57773 +/* alignment independent macros (little-endian) to fetch UINT16s or UINT8s from a
57774 + * structure using only the type and field name.
57775 + * Use these macros if there is the potential for unaligned buffer accesses. */
57776 +#define A_GET_UINT16_FIELD(p,type,field) \
57777 + ASSEMBLE_UNALIGNED_UINT16(p,\
57778 + A_OFFSETOF(type,field) + 1, \
57779 + A_OFFSETOF(type,field))
57780 +
57781 +#define A_SET_UINT16_FIELD(p,type,field,value) \
57782 +{ \
57783 + ((A_UINT8 *)(p))[A_OFFSETOF(type,field)] = (A_UINT8)(value); \
57784 + ((A_UINT8 *)(p))[A_OFFSETOF(type,field) + 1] = (A_UINT8)((value) >> 8); \
57785 +}
57786 +
57787 +#define A_GET_UINT8_FIELD(p,type,field) \
57788 + ((A_UINT8 *)(p))[A_OFFSETOF(type,field)]
57789 +
57790 +#define A_SET_UINT8_FIELD(p,type,field,value) \
57791 + ((A_UINT8 *)(p))[A_OFFSETOF(type,field)] = (value)
57792 +
57793 +/****** DANGER DANGER ***************
57794 + *
57795 + * The frame header length and message formats defined herein were
57796 + * selected to accommodate optimal alignment for target processing. This reduces code
57797 + * size and improves performance.
57798 + *
57799 + * Any changes to the header length may alter the alignment and cause exceptions
57800 + * on the target. When adding to the message structures insure that fields are
57801 + * properly aligned.
57802 + *
57803 + */
57804 +
57805 +/* HTC frame header */
57806 +typedef PREPACK struct _HTC_FRAME_HDR{
57807 + /* do not remove or re-arrange these fields, these are minimally required
57808 + * to take advantage of 4-byte lookaheads in some hardware implementations */
57809 + A_UINT8 EndpointID;
57810 + A_UINT8 Flags;
57811 + A_UINT16 PayloadLen; /* length of data (including trailer) that follows the header */
57812 +
57813 + /***** end of 4-byte lookahead ****/
57814 +
57815 + A_UINT8 ControlBytes[2];
57816 +
57817 + /* message payload starts after the header */
57818 +
57819 +} POSTPACK HTC_FRAME_HDR;
57820 +
57821 +/* frame header flags */
57822 +#define HTC_FLAGS_NEED_CREDIT_UPDATE (1 << 0)
57823 +#define HTC_FLAGS_RECV_TRAILER (1 << 1)
57824 +
57825 +
57826 +#define HTC_HDR_LENGTH (sizeof(HTC_FRAME_HDR))
57827 +#define HTC_MAX_TRAILER_LENGTH 255
57828 +#define HTC_MAX_PAYLOAD_LENGTH (2048 - sizeof(HTC_FRAME_HDR))
57829 +
57830 +/* HTC control message IDs */
57831 +typedef enum {
57832 + HTC_MSG_READY_ID = 1,
57833 + HTC_MSG_CONNECT_SERVICE_ID = 2,
57834 + HTC_MSG_CONNECT_SERVICE_RESPONSE_ID = 3,
57835 + HTC_MSG_SETUP_COMPLETE_ID = 4,
57836 +} HTC_MSG_IDS;
57837 +
57838 +#define HTC_MAX_CONTROL_MESSAGE_LENGTH 256
57839 +
57840 +/* base message ID header */
57841 +typedef PREPACK struct {
57842 + A_UINT16 MessageID;
57843 +} POSTPACK HTC_UNKNOWN_MSG;
57844 +
57845 +/* HTC ready message
57846 + * direction : target-to-host */
57847 +typedef PREPACK struct {
57848 + A_UINT16 MessageID; /* ID */
57849 + A_UINT16 CreditCount; /* number of credits the target can offer */
57850 + A_UINT16 CreditSize; /* size of each credit */
57851 + A_UINT8 MaxEndpoints; /* maximum number of endpoints the target has resources for */
57852 + A_UINT8 _Pad1;
57853 +} POSTPACK HTC_READY_MSG;
57854 +
57855 +#define HTC_SERVICE_META_DATA_MAX_LENGTH 128
57856 +
57857 +/* connect service
57858 + * direction : host-to-target */
57859 +typedef PREPACK struct {
57860 + A_UINT16 MessageID;
57861 + A_UINT16 ServiceID; /* service ID of the service to connect to */
57862 + A_UINT16 ConnectionFlags; /* connection flags */
57863 +
57864 +#define HTC_CONNECT_FLAGS_REDUCE_CREDIT_DRIBBLE (1 << 2) /* reduce credit dribbling when
57865 + the host needs credits */
57866 +#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_MASK (0x3)
57867 +#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_FOURTH 0x0
57868 +#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_ONE_HALF 0x1
57869 +#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_THREE_FOURTHS 0x2
57870 +#define HTC_CONNECT_FLAGS_THRESHOLD_LEVEL_UNITY 0x3
57871 +
57872 + A_UINT8 ServiceMetaLength; /* length of meta data that follows */
57873 + A_UINT8 _Pad1;
57874 +
57875 + /* service-specific meta data starts after the header */
57876 +
57877 +} POSTPACK HTC_CONNECT_SERVICE_MSG;
57878 +
57879 +/* connect response
57880 + * direction : target-to-host */
57881 +typedef PREPACK struct {
57882 + A_UINT16 MessageID;
57883 + A_UINT16 ServiceID; /* service ID that the connection request was made */
57884 + A_UINT8 Status; /* service connection status */
57885 + A_UINT8 EndpointID; /* assigned endpoint ID */
57886 + A_UINT16 MaxMsgSize; /* maximum expected message size on this endpoint */
57887 + A_UINT8 ServiceMetaLength; /* length of meta data that follows */
57888 + A_UINT8 _Pad1;
57889 +
57890 + /* service-specific meta data starts after the header */
57891 +
57892 +} POSTPACK HTC_CONNECT_SERVICE_RESPONSE_MSG;
57893 +
57894 +typedef PREPACK struct {
57895 + A_UINT16 MessageID;
57896 + /* currently, no other fields */
57897 +} POSTPACK HTC_SETUP_COMPLETE_MSG;
57898 +
57899 +
57900 +/* connect response status codes */
57901 +#define HTC_SERVICE_SUCCESS 0 /* success */
57902 +#define HTC_SERVICE_NOT_FOUND 1 /* service could not be found */
57903 +#define HTC_SERVICE_FAILED 2 /* specific service failed the connect */
57904 +#define HTC_SERVICE_NO_RESOURCES 3 /* no resources (i.e. no more endpoints) */
57905 +#define HTC_SERVICE_NO_MORE_EP 4 /* specific service is not allowing any more
57906 + endpoints */
57907 +
57908 +/* report record IDs */
57909 +typedef enum {
57910 + HTC_RECORD_NULL = 0,
57911 + HTC_RECORD_CREDITS = 1,
57912 + HTC_RECORD_LOOKAHEAD = 2,
57913 +} HTC_RPT_IDS;
57914 +
57915 +typedef PREPACK struct {
57916 + A_UINT8 RecordID; /* Record ID */
57917 + A_UINT8 Length; /* Length of record */
57918 +} POSTPACK HTC_RECORD_HDR;
57919 +
57920 +typedef PREPACK struct {
57921 + A_UINT8 EndpointID; /* Endpoint that owns these credits */
57922 + A_UINT8 Credits; /* credits to report since last report */
57923 +} POSTPACK HTC_CREDIT_REPORT;
57924 +
57925 +typedef PREPACK struct {
57926 + A_UINT8 PreValid; /* pre valid guard */
57927 + A_UINT8 LookAhead[4]; /* 4 byte lookahead */
57928 + A_UINT8 PostValid; /* post valid guard */
57929 +
57930 + /* NOTE: the LookAhead array is guarded by a PreValid and Post Valid guard bytes.
57931 + * The PreValid bytes must equal the inverse of the PostValid byte */
57932 +
57933 +} POSTPACK HTC_LOOKAHEAD_REPORT;
57934 +
57935 +#ifndef ATH_TARGET
57936 +#include "athendpack.h"
57937 +#endif
57938 +
57939 +
57940 +#endif /* __HTC_H__ */
57941 +
57942 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/htc_packet.h
57943 ===================================================================
57944 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
57945 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/htc_packet.h 2008-12-11 22:46:49.000000000 +0100
57946 @@ -0,0 +1,138 @@
57947 +/*
57948 + *
57949 + * Copyright (c) 2007 Atheros Communications Inc.
57950 + * All rights reserved.
57951 + *
57952 + *
57953 + * This program is free software; you can redistribute it and/or modify
57954 + * it under the terms of the GNU General Public License version 2 as
57955 + * published by the Free Software Foundation;
57956 + *
57957 + * Software distributed under the License is distributed on an "AS
57958 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
57959 + * implied. See the License for the specific language governing
57960 + * rights and limitations under the License.
57961 + *
57962 + *
57963 + *
57964 + */
57965 +
57966 +#ifndef HTC_PACKET_H_
57967 +#define HTC_PACKET_H_
57968 +
57969 +
57970 +#include "dl_list.h"
57971 +
57972 +struct _HTC_PACKET;
57973 +
57974 +typedef void (* HTC_PACKET_COMPLETION)(void *,struct _HTC_PACKET *);
57975 +
57976 +typedef A_UINT16 HTC_TX_TAG;
57977 +
57978 +typedef struct _HTC_TX_PACKET_INFO {
57979 + HTC_TX_TAG Tag; /* tag used to selective flush packets */
57980 +} HTC_TX_PACKET_INFO;
57981 +
57982 +#define HTC_TX_PACKET_TAG_ALL 0 /* a tag of zero is reserved and used to flush ALL packets */
57983 +#define HTC_TX_PACKET_TAG_INTERNAL 1 /* internal tags start here */
57984 +#define HTC_TX_PACKET_TAG_USER_DEFINED (HTC_TX_PACKET_TAG_INTERNAL + 9) /* user-defined tags start here */
57985 +
57986 +typedef struct _HTC_RX_PACKET_INFO {
57987 + A_UINT32 Unused; /* for future use and to make compilers happy */
57988 +} HTC_RX_PACKET_INFO;
57989 +
57990 +/* wrapper around endpoint-specific packets */
57991 +typedef struct _HTC_PACKET {
57992 + DL_LIST ListLink; /* double link */
57993 + void *pPktContext; /* caller's per packet specific context */
57994 +
57995 + A_UINT8 *pBufferStart; /* the true buffer start , the caller can
57996 + store the real buffer start here. In
57997 + receive callbacks, the HTC layer sets pBuffer
57998 + to the start of the payload past the header. This
57999 + field allows the caller to reset pBuffer when it
58000 + recycles receive packets back to HTC */
58001 + /*
58002 + * Pointer to the start of the buffer. In the transmit
58003 + * direction this points to the start of the payload. In the
58004 + * receive direction, however, the buffer when queued up
58005 + * points to the start of the HTC header but when returned
58006 + * to the caller points to the start of the payload
58007 + */
58008 + A_UINT8 *pBuffer; /* payload start (RX/TX) */
58009 + A_UINT32 BufferLength; /* length of buffer */
58010 + A_UINT32 ActualLength; /* actual length of payload */
58011 + int Endpoint; /* endpoint that this packet was sent/recv'd from */
58012 + A_STATUS Status; /* completion status */
58013 + union {
58014 + HTC_TX_PACKET_INFO AsTx; /* Tx Packet specific info */
58015 + HTC_RX_PACKET_INFO AsRx; /* Rx Packet specific info */
58016 + } PktInfo;
58017 +
58018 + /* the following fields are for internal HTC use */
58019 + HTC_PACKET_COMPLETION Completion; /* completion */
58020 + void *pContext; /* HTC private completion context */
58021 + A_UINT32 HTCReserved; /* reserved */
58022 +} HTC_PACKET;
58023 +
58024 +
58025 +
58026 +#define COMPLETE_HTC_PACKET(p,status) \
58027 +{ \
58028 + (p)->Status = (status); \
58029 + (p)->Completion((p)->pContext,(p)); \
58030 +}
58031 +
58032 +#define INIT_HTC_PACKET_INFO(p,b,len) \
58033 +{ \
58034 + (p)->pBufferStart = (b); \
58035 + (p)->BufferLength = (len); \
58036 +}
58037 +
58038 +/* macro to set an initial RX packet for refilling HTC */
58039 +#define SET_HTC_PACKET_INFO_RX_REFILL(p,c,b,len,ep) \
58040 +{ \
58041 + (p)->pPktContext = (c); \
58042 + (p)->pBuffer = (b); \
58043 + (p)->pBufferStart = (b); \
58044 + (p)->BufferLength = (len); \
58045 + (p)->Endpoint = (ep); \
58046 +}
58047 +
58048 +/* fast macro to recycle an RX packet that will be re-queued to HTC */
58049 +#define HTC_PACKET_RESET_RX(p) \
58050 + (p)->pBuffer = (p)->pBufferStart
58051 +
58052 +/* macro to set packet parameters for TX */
58053 +#define SET_HTC_PACKET_INFO_TX(p,c,b,len,ep,tag) \
58054 +{ \
58055 + (p)->pPktContext = (c); \
58056 + (p)->pBuffer = (b); \
58057 + (p)->ActualLength = (len); \
58058 + (p)->Endpoint = (ep); \
58059 + (p)->PktInfo.AsTx.Tag = (tag); \
58060 +}
58061 +
58062 +/* HTC Packet Queueing Macros */
58063 +typedef DL_LIST HTC_PACKET_QUEUE;
58064 +/* initialize queue */
58065 +#define INIT_HTC_PACKET_QUEUE(pQ) DL_LIST_INIT((pQ))
58066 +/* enqueue HTC packet to the tail of the queue */
58067 +#define HTC_PACKET_ENQUEUE(pQ,p) DL_ListInsertTail((pQ),&(p)->ListLink)
58068 +/* test if a queue is empty */
58069 +#define HTC_QUEUE_EMPTY(pQ) DL_LIST_IS_EMPTY((pQ))
58070 +/* get packet at head without removing it */
58071 +#define HTC_GET_PKT_AT_HEAD(pQ) A_CONTAINING_STRUCT((DL_LIST_GET_ITEM_AT_HEAD(pQ)),HTC_PACKET,ListLink);
58072 +/* remove a packet from the current list it is linked to */
58073 +#define HTC_PACKET_REMOVE(p) DL_ListRemove(&(p)->ListLink)
58074 +
58075 +/* dequeue an HTC packet from the head of the queue */
58076 +static INLINE HTC_PACKET *HTC_PACKET_DEQUEUE(HTC_PACKET_QUEUE *queue) {
58077 + DL_LIST *pItem = DL_ListRemoveItemFromHead(queue);
58078 + if (pItem != NULL) {
58079 + return A_CONTAINING_STRUCT(pItem, HTC_PACKET, ListLink);
58080 + }
58081 + return NULL;
58082 +}
58083 +
58084 +#endif /*HTC_PACKET_H_*/
58085 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/htc_services.h
58086 ===================================================================
58087 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58088 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/htc_services.h 2008-12-11 22:46:49.000000000 +0100
58089 @@ -0,0 +1,37 @@
58090 +/*
58091 + * Copyright (c) 2007 Atheros Communications Inc.
58092 + * All rights reserved.
58093 + *
58094 + * $ATH_LICENSE_HOSTSDK0_C$
58095 + *
58096 + */
58097 +
58098 +#ifndef __HTC_SERVICES_H__
58099 +#define __HTC_SERVICES_H__
58100 +
58101 +/* Current service IDs */
58102 +
58103 +typedef enum {
58104 + RSVD_SERVICE_GROUP = 0,
58105 + WMI_SERVICE_GROUP = 1,
58106 +
58107 + HTC_TEST_GROUP = 254,
58108 + HTC_SERVICE_GROUP_LAST = 255
58109 +}HTC_SERVICE_GROUP_IDS;
58110 +
58111 +#define MAKE_SERVICE_ID(group,index) \
58112 + (int)(((int)group << 8) | (int)(index))
58113 +
58114 +/* NOTE: service ID of 0x0000 is reserved and should never be used */
58115 +#define HTC_CTRL_RSVD_SVC MAKE_SERVICE_ID(RSVD_SERVICE_GROUP,1)
58116 +#define WMI_CONTROL_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,0)
58117 +#define WMI_DATA_BE_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,1)
58118 +#define WMI_DATA_BK_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,2)
58119 +#define WMI_DATA_VI_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,3)
58120 +#define WMI_DATA_VO_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP,4)
58121 +#define WMI_MAX_SERVICES 5
58122 +
58123 +/* raw stream service (i.e. flash, tcmd, calibration apps) */
58124 +#define HTC_RAW_STREAMS_SVC MAKE_SERVICE_ID(HTC_TEST_GROUP,0)
58125 +
58126 +#endif /*HTC_SERVICES_H_*/
58127 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ieee80211.h
58128 ===================================================================
58129 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58130 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ieee80211.h 2008-12-11 22:46:49.000000000 +0100
58131 @@ -0,0 +1,342 @@
58132 +/*-
58133 + * Copyright (c) 2001 Atsushi Onoe
58134 + * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
58135 + * Copyright (c) 2006 Atheros Communications, Inc.
58136 + *
58137 + * Wireless Network driver for Atheros AR6001
58138 + * All rights reserved.
58139 + *
58140 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
58141 + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
58142 + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
58143 + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
58144 + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
58145 + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
58146 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58147 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
58148 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
58149 + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
58150 + *
58151 + */
58152 +#ifndef _NET80211_IEEE80211_H_
58153 +#define _NET80211_IEEE80211_H_
58154 +
58155 +#include "athstartpack.h"
58156 +
58157 +/*
58158 + * 802.11 protocol definitions.
58159 + */
58160 +
58161 +#define IEEE80211_ADDR_LEN 6 /* size of 802.11 address */
58162 +/* is 802.11 address multicast/broadcast? */
58163 +#define IEEE80211_IS_MULTICAST(_a) (*(_a) & 0x01)
58164 +#define IEEE80211_ADDR_EQ(addr1, addr2) \
58165 + (A_MEMCMP(addr1, addr2, IEEE80211_ADDR_LEN) == 0)
58166 +
58167 +#define IEEE80211_KEYBUF_SIZE 16
58168 +#define IEEE80211_MICBUF_SIZE (8+8) /* space for both tx and rx */
58169 +
58170 +/*
58171 + * NB: these values are ordered carefully; there are lots of
58172 + * of implications in any reordering. In particular beware
58173 + * that 4 is not used to avoid conflicting with IEEE80211_F_PRIVACY.
58174 + */
58175 +#define IEEE80211_CIPHER_WEP 0
58176 +#define IEEE80211_CIPHER_TKIP 1
58177 +#define IEEE80211_CIPHER_AES_OCB 2
58178 +#define IEEE80211_CIPHER_AES_CCM 3
58179 +#define IEEE80211_CIPHER_CKIP 5
58180 +#define IEEE80211_CIPHER_CCKM_KRK 6
58181 +#define IEEE80211_CIPHER_NONE 7 /* pseudo value */
58182 +
58183 +#define IEEE80211_CIPHER_MAX (IEEE80211_CIPHER_NONE+1)
58184 +
58185 +#define IEEE80211_IS_VALID_WEP_CIPHER_LEN(len) \
58186 + (((len) == 5) || ((len) == 13) || ((len) == 16))
58187 +
58188 +
58189 +
58190 +/*
58191 + * generic definitions for IEEE 802.11 frames
58192 + */
58193 +PREPACK struct ieee80211_frame {
58194 + A_UINT8 i_fc[2];
58195 + A_UINT8 i_dur[2];
58196 + A_UINT8 i_addr1[IEEE80211_ADDR_LEN];
58197 + A_UINT8 i_addr2[IEEE80211_ADDR_LEN];
58198 + A_UINT8 i_addr3[IEEE80211_ADDR_LEN];
58199 + A_UINT8 i_seq[2];
58200 + /* possibly followed by addr4[IEEE80211_ADDR_LEN]; */
58201 + /* see below */
58202 +} POSTPACK;
58203 +
58204 +#define IEEE80211_FC0_VERSION_MASK 0x03
58205 +#define IEEE80211_FC0_VERSION_SHIFT 0
58206 +#define IEEE80211_FC0_VERSION_0 0x00
58207 +#define IEEE80211_FC0_TYPE_MASK 0x0c
58208 +#define IEEE80211_FC0_TYPE_SHIFT 2
58209 +#define IEEE80211_FC0_TYPE_MGT 0x00
58210 +#define IEEE80211_FC0_TYPE_CTL 0x04
58211 +#define IEEE80211_FC0_TYPE_DATA 0x08
58212 +
58213 +#define IEEE80211_FC0_SUBTYPE_MASK 0xf0
58214 +#define IEEE80211_FC0_SUBTYPE_SHIFT 4
58215 +/* for TYPE_MGT */
58216 +#define IEEE80211_FC0_SUBTYPE_ASSOC_REQ 0x00
58217 +#define IEEE80211_FC0_SUBTYPE_ASSOC_RESP 0x10
58218 +#define IEEE80211_FC0_SUBTYPE_REASSOC_REQ 0x20
58219 +#define IEEE80211_FC0_SUBTYPE_REASSOC_RESP 0x30
58220 +#define IEEE80211_FC0_SUBTYPE_PROBE_REQ 0x40
58221 +#define IEEE80211_FC0_SUBTYPE_PROBE_RESP 0x50
58222 +#define IEEE80211_FC0_SUBTYPE_BEACON 0x80
58223 +#define IEEE80211_FC0_SUBTYPE_ATIM 0x90
58224 +#define IEEE80211_FC0_SUBTYPE_DISASSOC 0xa0
58225 +#define IEEE80211_FC0_SUBTYPE_AUTH 0xb0
58226 +#define IEEE80211_FC0_SUBTYPE_DEAUTH 0xc0
58227 +/* for TYPE_CTL */
58228 +#define IEEE80211_FC0_SUBTYPE_PS_POLL 0xa0
58229 +#define IEEE80211_FC0_SUBTYPE_RTS 0xb0
58230 +#define IEEE80211_FC0_SUBTYPE_CTS 0xc0
58231 +#define IEEE80211_FC0_SUBTYPE_ACK 0xd0
58232 +#define IEEE80211_FC0_SUBTYPE_CF_END 0xe0
58233 +#define IEEE80211_FC0_SUBTYPE_CF_END_ACK 0xf0
58234 +/* for TYPE_DATA (bit combination) */
58235 +#define IEEE80211_FC0_SUBTYPE_DATA 0x00
58236 +#define IEEE80211_FC0_SUBTYPE_CF_ACK 0x10
58237 +#define IEEE80211_FC0_SUBTYPE_CF_POLL 0x20
58238 +#define IEEE80211_FC0_SUBTYPE_CF_ACPL 0x30
58239 +#define IEEE80211_FC0_SUBTYPE_NODATA 0x40
58240 +#define IEEE80211_FC0_SUBTYPE_CFACK 0x50
58241 +#define IEEE80211_FC0_SUBTYPE_CFPOLL 0x60
58242 +#define IEEE80211_FC0_SUBTYPE_CF_ACK_CF_ACK 0x70
58243 +#define IEEE80211_FC0_SUBTYPE_QOS 0x80
58244 +#define IEEE80211_FC0_SUBTYPE_QOS_NULL 0xc0
58245 +
58246 +#define IEEE80211_FC1_DIR_MASK 0x03
58247 +#define IEEE80211_FC1_DIR_NODS 0x00 /* STA->STA */
58248 +#define IEEE80211_FC1_DIR_TODS 0x01 /* STA->AP */
58249 +#define IEEE80211_FC1_DIR_FROMDS 0x02 /* AP ->STA */
58250 +#define IEEE80211_FC1_DIR_DSTODS 0x03 /* AP ->AP */
58251 +
58252 +#define IEEE80211_FC1_MORE_FRAG 0x04
58253 +#define IEEE80211_FC1_RETRY 0x08
58254 +#define IEEE80211_FC1_PWR_MGT 0x10
58255 +#define IEEE80211_FC1_MORE_DATA 0x20
58256 +#define IEEE80211_FC1_WEP 0x40
58257 +#define IEEE80211_FC1_ORDER 0x80
58258 +
58259 +#define IEEE80211_SEQ_FRAG_MASK 0x000f
58260 +#define IEEE80211_SEQ_FRAG_SHIFT 0
58261 +#define IEEE80211_SEQ_SEQ_MASK 0xfff0
58262 +#define IEEE80211_SEQ_SEQ_SHIFT 4
58263 +
58264 +#define IEEE80211_NWID_LEN 32
58265 +
58266 +/*
58267 + * 802.11 rate set.
58268 + */
58269 +#define IEEE80211_RATE_SIZE 8 /* 802.11 standard */
58270 +#define IEEE80211_RATE_MAXSIZE 15 /* max rates we'll handle */
58271 +
58272 +#define WMM_NUM_AC 4 /* 4 AC categories */
58273 +
58274 +#define WMM_PARAM_ACI_M 0x60 /* Mask for ACI field */
58275 +#define WMM_PARAM_ACI_S 5 /* Shift for ACI field */
58276 +#define WMM_PARAM_ACM_M 0x10 /* Mask for ACM bit */
58277 +#define WMM_PARAM_ACM_S 4 /* Shift for ACM bit */
58278 +#define WMM_PARAM_AIFSN_M 0x0f /* Mask for aifsn field */
58279 +#define WMM_PARAM_LOGCWMIN_M 0x0f /* Mask for CwMin field (in log) */
58280 +#define WMM_PARAM_LOGCWMAX_M 0xf0 /* Mask for CwMax field (in log) */
58281 +#define WMM_PARAM_LOGCWMAX_S 4 /* Shift for CwMax field */
58282 +
58283 +#define WMM_AC_TO_TID(_ac) ( \
58284 + ((_ac) == WMM_AC_VO) ? 6 : \
58285 + ((_ac) == WMM_AC_VI) ? 5 : \
58286 + ((_ac) == WMM_AC_BK) ? 1 : \
58287 + 0)
58288 +
58289 +#define TID_TO_WMM_AC(_tid) ( \
58290 + ((_tid) < 1) ? WMM_AC_BE : \
58291 + ((_tid) < 3) ? WMM_AC_BK : \
58292 + ((_tid) < 6) ? WMM_AC_VI : \
58293 + WMM_AC_VO)
58294 +/*
58295 + * Management information element payloads.
58296 + */
58297 +
58298 +enum {
58299 + IEEE80211_ELEMID_SSID = 0,
58300 + IEEE80211_ELEMID_RATES = 1,
58301 + IEEE80211_ELEMID_FHPARMS = 2,
58302 + IEEE80211_ELEMID_DSPARMS = 3,
58303 + IEEE80211_ELEMID_CFPARMS = 4,
58304 + IEEE80211_ELEMID_TIM = 5,
58305 + IEEE80211_ELEMID_IBSSPARMS = 6,
58306 + IEEE80211_ELEMID_COUNTRY = 7,
58307 + IEEE80211_ELEMID_CHALLENGE = 16,
58308 + /* 17-31 reserved for challenge text extension */
58309 + IEEE80211_ELEMID_PWRCNSTR = 32,
58310 + IEEE80211_ELEMID_PWRCAP = 33,
58311 + IEEE80211_ELEMID_TPCREQ = 34,
58312 + IEEE80211_ELEMID_TPCREP = 35,
58313 + IEEE80211_ELEMID_SUPPCHAN = 36,
58314 + IEEE80211_ELEMID_CHANSWITCH = 37,
58315 + IEEE80211_ELEMID_MEASREQ = 38,
58316 + IEEE80211_ELEMID_MEASREP = 39,
58317 + IEEE80211_ELEMID_QUIET = 40,
58318 + IEEE80211_ELEMID_IBSSDFS = 41,
58319 + IEEE80211_ELEMID_ERP = 42,
58320 + IEEE80211_ELEMID_RSN = 48,
58321 + IEEE80211_ELEMID_XRATES = 50,
58322 + IEEE80211_ELEMID_TPC = 150,
58323 + IEEE80211_ELEMID_CCKM = 156,
58324 + IEEE80211_ELEMID_VENDOR = 221, /* vendor private */
58325 +};
58326 +
58327 +#define ATH_OUI 0x7f0300 /* Atheros OUI */
58328 +#define ATH_OUI_TYPE 0x01
58329 +#define ATH_OUI_SUBTYPE 0x01
58330 +#define ATH_OUI_VERSION 0x00
58331 +
58332 +#define WPA_OUI 0xf25000
58333 +#define WPA_OUI_TYPE 0x01
58334 +#define WPA_VERSION 1 /* current supported version */
58335 +
58336 +#define WPA_CSE_NULL 0x00
58337 +#define WPA_CSE_WEP40 0x01
58338 +#define WPA_CSE_TKIP 0x02
58339 +#define WPA_CSE_CCMP 0x04
58340 +#define WPA_CSE_WEP104 0x05
58341 +
58342 +#define WPA_ASE_NONE 0x00
58343 +#define WPA_ASE_8021X_UNSPEC 0x01
58344 +#define WPA_ASE_8021X_PSK 0x02
58345 +
58346 +#define RSN_OUI 0xac0f00
58347 +#define RSN_VERSION 1 /* current supported version */
58348 +
58349 +#define RSN_CSE_NULL 0x00
58350 +#define RSN_CSE_WEP40 0x01
58351 +#define RSN_CSE_TKIP 0x02
58352 +#define RSN_CSE_WRAP 0x03
58353 +#define RSN_CSE_CCMP 0x04
58354 +#define RSN_CSE_WEP104 0x05
58355 +
58356 +#define RSN_ASE_NONE 0x00
58357 +#define RSN_ASE_8021X_UNSPEC 0x01
58358 +#define RSN_ASE_8021X_PSK 0x02
58359 +
58360 +#define RSN_CAP_PREAUTH 0x01
58361 +
58362 +#define WMM_OUI 0xf25000
58363 +#define WMM_OUI_TYPE 0x02
58364 +#define WMM_INFO_OUI_SUBTYPE 0x00
58365 +#define WMM_PARAM_OUI_SUBTYPE 0x01
58366 +#define WMM_VERSION 1
58367 +
58368 +/* WMM stream classes */
58369 +#define WMM_NUM_AC 4
58370 +#define WMM_AC_BE 0 /* best effort */
58371 +#define WMM_AC_BK 1 /* background */
58372 +#define WMM_AC_VI 2 /* video */
58373 +#define WMM_AC_VO 3 /* voice */
58374 +
58375 +/* TSPEC related */
58376 +#define ACTION_CATEGORY_CODE_TSPEC 17
58377 +#define ACTION_CODE_TSPEC_ADDTS 0
58378 +#define ACTION_CODE_TSPEC_ADDTS_RESP 1
58379 +#define ACTION_CODE_TSPEC_DELTS 2
58380 +
58381 +typedef enum {
58382 + TSPEC_STATUS_CODE_ADMISSION_ACCEPTED = 0,
58383 + TSPEC_STATUS_CODE_ADDTS_INVALID_PARAMS = 0x1,
58384 + TSPEC_STATUS_CODE_ADDTS_REQUEST_REFUSED = 0x3,
58385 + TSPEC_STATUS_CODE_UNSPECIFIED_QOS_RELATED_FAILURE = 0xC8,
58386 + TSPEC_STATUS_CODE_REQUESTED_REFUSED_POLICY_CONFIGURATION = 0xC9,
58387 + TSPEC_STATUS_CODE_INSUFFCIENT_BANDWIDTH = 0xCA,
58388 + TSPEC_STATUS_CODE_INVALID_PARAMS = 0xCB,
58389 + TSPEC_STATUS_CODE_DELTS_SENT = 0x30,
58390 + TSPEC_STATUS_CODE_DELTS_RECV = 0x31,
58391 +} TSPEC_STATUS_CODE;
58392 +
58393 +/*
58394 + * WMM/802.11e Tspec Element
58395 + */
58396 +typedef PREPACK struct wmm_tspec_ie_t {
58397 + A_UINT8 elementId;
58398 + A_UINT8 len;
58399 + A_UINT8 oui[3];
58400 + A_UINT8 ouiType;
58401 + A_UINT8 ouiSubType;
58402 + A_UINT8 version;
58403 + A_UINT16 tsInfo_info;
58404 + A_UINT8 tsInfo_reserved;
58405 + A_UINT16 nominalMSDU;
58406 + A_UINT16 maxMSDU;
58407 + A_UINT32 minServiceInt;
58408 + A_UINT32 maxServiceInt;
58409 + A_UINT32 inactivityInt;
58410 + A_UINT32 suspensionInt;
58411 + A_UINT32 serviceStartTime;
58412 + A_UINT32 minDataRate;
58413 + A_UINT32 meanDataRate;
58414 + A_UINT32 peakDataRate;
58415 + A_UINT32 maxBurstSize;
58416 + A_UINT32 delayBound;
58417 + A_UINT32 minPhyRate;
58418 + A_UINT16 sba;
58419 + A_UINT16 mediumTime;
58420 +} POSTPACK WMM_TSPEC_IE;
58421 +
58422 +
58423 +/*
58424 + * BEACON management packets
58425 + *
58426 + * octet timestamp[8]
58427 + * octet beacon interval[2]
58428 + * octet capability information[2]
58429 + * information element
58430 + * octet elemid
58431 + * octet length
58432 + * octet information[length]
58433 + */
58434 +
58435 +#define IEEE80211_BEACON_INTERVAL(beacon) \
58436 + ((beacon)[8] | ((beacon)[9] << 8))
58437 +#define IEEE80211_BEACON_CAPABILITY(beacon) \
58438 + ((beacon)[10] | ((beacon)[11] << 8))
58439 +
58440 +#define IEEE80211_CAPINFO_ESS 0x0001
58441 +#define IEEE80211_CAPINFO_IBSS 0x0002
58442 +#define IEEE80211_CAPINFO_CF_POLLABLE 0x0004
58443 +#define IEEE80211_CAPINFO_CF_POLLREQ 0x0008
58444 +#define IEEE80211_CAPINFO_PRIVACY 0x0010
58445 +#define IEEE80211_CAPINFO_SHORT_PREAMBLE 0x0020
58446 +#define IEEE80211_CAPINFO_PBCC 0x0040
58447 +#define IEEE80211_CAPINFO_CHNL_AGILITY 0x0080
58448 +/* bits 8-9 are reserved */
58449 +#define IEEE80211_CAPINFO_SHORT_SLOTTIME 0x0400
58450 +#define IEEE80211_CAPINFO_APSD 0x0800
58451 +/* bit 12 is reserved */
58452 +#define IEEE80211_CAPINFO_DSSSOFDM 0x2000
58453 +/* bits 14-15 are reserved */
58454 +
58455 +/*
58456 + * Authentication Modes
58457 + */
58458 +
58459 +enum ieee80211_authmode {
58460 + IEEE80211_AUTH_NONE = 0,
58461 + IEEE80211_AUTH_OPEN = 1,
58462 + IEEE80211_AUTH_SHARED = 2,
58463 + IEEE80211_AUTH_8021X = 3,
58464 + IEEE80211_AUTH_AUTO = 4, /* auto-select/accept */
58465 + /* NB: these are used only for ioctls */
58466 + IEEE80211_AUTH_WPA = 5, /* WPA/RSN w/ 802.1x */
58467 + IEEE80211_AUTH_WPA_PSK = 6, /* WPA/RSN w/ PSK */
58468 + IEEE80211_AUTH_WPA_CCKM = 7, /* WPA/RSN IE w/ CCKM */
58469 +};
58470 +
58471 +#include "athendpack.h"
58472 +
58473 +#endif /* _NET80211_IEEE80211_H_ */
58474 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ieee80211_ioctl.h
58475 ===================================================================
58476 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58477 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ieee80211_ioctl.h 2008-12-11 22:46:49.000000000 +0100
58478 @@ -0,0 +1,163 @@
58479 +/*
58480 + * Copyright (c) 2004-2005 Atheros Communications Inc.
58481 + * All rights reserved.
58482 + *
58483 + *
58484 + * This program is free software; you can redistribute it and/or modify
58485 + * it under the terms of the GNU General Public License version 2 as
58486 + * published by the Free Software Foundation;
58487 + *
58488 + * Software distributed under the License is distributed on an "AS
58489 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
58490 + * implied. See the License for the specific language governing
58491 + * rights and limitations under the License.
58492 + *
58493 + *
58494 + *
58495 + *
58496 + * $Id: //depot/sw/releases/olca2.0-GPL/host/os/linux/include/ieee80211_ioctl.h#1 $
58497 + */
58498 +
58499 +#ifndef _IEEE80211_IOCTL_H_
58500 +#define _IEEE80211_IOCTL_H_
58501 +
58502 +#ifdef __cplusplus
58503 +extern "C" {
58504 +#endif
58505 +
58506 +/*
58507 + * Extracted from the MADWIFI net80211/ieee80211_ioctl.h
58508 + */
58509 +
58510 +/*
58511 + * WPA/RSN get/set key request. Specify the key/cipher
58512 + * type and whether the key is to be used for sending and/or
58513 + * receiving. The key index should be set only when working
58514 + * with global keys (use IEEE80211_KEYIX_NONE for ``no index'').
58515 + * Otherwise a unicast/pairwise key is specified by the bssid
58516 + * (on a station) or mac address (on an ap). They key length
58517 + * must include any MIC key data; otherwise it should be no
58518 + more than IEEE80211_KEYBUF_SIZE.
58519 + */
58520 +struct ieee80211req_key {
58521 + u_int8_t ik_type; /* key/cipher type */
58522 + u_int8_t ik_pad;
58523 + u_int16_t ik_keyix; /* key index */
58524 + u_int8_t ik_keylen; /* key length in bytes */
58525 + u_int8_t ik_flags;
58526 +#define IEEE80211_KEY_XMIT 0x01
58527 +#define IEEE80211_KEY_RECV 0x02
58528 +#define IEEE80211_KEY_DEFAULT 0x80 /* default xmit key */
58529 + u_int8_t ik_macaddr[IEEE80211_ADDR_LEN];
58530 + u_int64_t ik_keyrsc; /* key receive sequence counter */
58531 + u_int64_t ik_keytsc; /* key transmit sequence counter */
58532 + u_int8_t ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE];
58533 +};
58534 +/*
58535 + * Delete a key either by index or address. Set the index
58536 + * to IEEE80211_KEYIX_NONE when deleting a unicast key.
58537 + */
58538 +struct ieee80211req_del_key {
58539 + u_int8_t idk_keyix; /* key index */
58540 + u_int8_t idk_macaddr[IEEE80211_ADDR_LEN];
58541 +};
58542 +/*
58543 + * MLME state manipulation request. IEEE80211_MLME_ASSOC
58544 + * only makes sense when operating as a station. The other
58545 + * requests can be used when operating as a station or an
58546 + * ap (to effect a station).
58547 + */
58548 +struct ieee80211req_mlme {
58549 + u_int8_t im_op; /* operation to perform */
58550 +#define IEEE80211_MLME_ASSOC 1 /* associate station */
58551 +#define IEEE80211_MLME_DISASSOC 2 /* disassociate station */
58552 +#define IEEE80211_MLME_DEAUTH 3 /* deauthenticate station */
58553 +#define IEEE80211_MLME_AUTHORIZE 4 /* authorize station */
58554 +#define IEEE80211_MLME_UNAUTHORIZE 5 /* unauthorize station */
58555 + u_int16_t im_reason; /* 802.11 reason code */
58556 + u_int8_t im_macaddr[IEEE80211_ADDR_LEN];
58557 +};
58558 +
58559 +struct ieee80211req_addpmkid {
58560 + u_int8_t pi_bssid[IEEE80211_ADDR_LEN];
58561 + u_int8_t pi_enable;
58562 + u_int8_t pi_pmkid[16];
58563 +};
58564 +
58565 +#define AUTH_ALG_OPEN_SYSTEM 0x01
58566 +#define AUTH_ALG_SHARED_KEY 0x02
58567 +#define AUTH_ALG_LEAP 0x04
58568 +
58569 +struct ieee80211req_authalg {
58570 + u_int8_t auth_alg;
58571 +};
58572 +
58573 +/*
58574 + * Request to add an IE to a Management Frame
58575 + */
58576 +enum{
58577 + IEEE80211_APPIE_FRAME_BEACON = 0,
58578 + IEEE80211_APPIE_FRAME_PROBE_REQ = 1,
58579 + IEEE80211_APPIE_FRAME_PROBE_RESP = 2,
58580 + IEEE80211_APPIE_FRAME_ASSOC_REQ = 3,
58581 + IEEE80211_APPIE_FRAME_ASSOC_RESP = 4,
58582 + IEEE80211_APPIE_NUM_OF_FRAME = 5
58583 +};
58584 +
58585 +/*
58586 + * The Maximum length of the IE that can be added to a Management frame
58587 + */
58588 +#define IEEE80211_APPIE_FRAME_MAX_LEN 78
58589 +
58590 +struct ieee80211req_getset_appiebuf {
58591 + u_int32_t app_frmtype; /* management frame type for which buffer is added */
58592 + u_int32_t app_buflen; /*application supplied buffer length */
58593 + u_int8_t app_buf[];
58594 +};
58595 +
58596 +/*
58597 + * The following definitions are used by an application to set filter
58598 + * for receiving management frames
58599 + */
58600 +enum {
58601 + IEEE80211_FILTER_TYPE_BEACON = 0x1,
58602 + IEEE80211_FILTER_TYPE_PROBE_REQ = 0x2,
58603 + IEEE80211_FILTER_TYPE_PROBE_RESP = 0x4,
58604 + IEEE80211_FILTER_TYPE_ASSOC_REQ = 0x8,
58605 + IEEE80211_FILTER_TYPE_ASSOC_RESP = 0x10,
58606 + IEEE80211_FILTER_TYPE_AUTH = 0x20,
58607 + IEEE80211_FILTER_TYPE_DEAUTH = 0x40,
58608 + IEEE80211_FILTER_TYPE_DISASSOC = 0x80,
58609 + IEEE80211_FILTER_TYPE_ALL = 0xFF /* used to check the valid filter bits */
58610 +};
58611 +
58612 +struct ieee80211req_set_filter {
58613 + u_int32_t app_filterype; /* management frame filter type */
58614 +};
58615 +
58616 +enum {
58617 + IEEE80211_PARAM_AUTHMODE = 3, /* Authentication Mode */
58618 + IEEE80211_PARAM_MCASTCIPHER = 5,
58619 + IEEE80211_PARAM_MCASTKEYLEN = 6, /* multicast key length */
58620 + IEEE80211_PARAM_UCASTCIPHER = 8,
58621 + IEEE80211_PARAM_UCASTKEYLEN = 9, /* unicast key length */
58622 + IEEE80211_PARAM_WPA = 10, /* WPA mode (0,1,2) */
58623 + IEEE80211_PARAM_ROAMING = 12, /* roaming mode */
58624 + IEEE80211_PARAM_PRIVACY = 13, /* privacy invoked */
58625 + IEEE80211_PARAM_COUNTERMEASURES = 14, /* WPA/TKIP countermeasures */
58626 + IEEE80211_PARAM_DROPUNENCRYPTED = 15, /* discard unencrypted frames */
58627 +};
58628 +
58629 +/*
58630 + * Values for IEEE80211_PARAM_WPA
58631 + */
58632 +#define WPA_MODE_WPA1 1
58633 +#define WPA_MODE_WPA2 2
58634 +#define WPA_MODE_AUTO 3
58635 +#define WPA_MODE_NONE 4
58636 +
58637 +#ifdef __cplusplus
58638 +}
58639 +#endif
58640 +
58641 +#endif /* _IEEE80211_IOCTL_H_ */
58642 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ieee80211_node.h
58643 ===================================================================
58644 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58645 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ieee80211_node.h 2008-12-11 22:46:49.000000000 +0100
58646 @@ -0,0 +1,77 @@
58647 +/*-
58648 + * Copyright (c) 2001 Atsushi Onoe
58649 + * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
58650 + * Copyright (c) 2006 Atheros Communications, Inc.
58651 + *
58652 + * Wireless Network driver for Atheros AR6001
58653 + * All rights reserved.
58654 + *
58655 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
58656 + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
58657 + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
58658 + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
58659 + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
58660 + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
58661 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
58662 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
58663 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
58664 + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
58665 + *
58666 + */
58667 +#ifndef _IEEE80211_NODE_H_
58668 +#define _IEEE80211_NODE_H_
58669 +
58670 +/*
58671 + * Node locking definitions.
58672 + */
58673 +#define IEEE80211_NODE_LOCK_INIT(_nt) A_MUTEX_INIT(&(_nt)->nt_nodelock)
58674 +#define IEEE80211_NODE_LOCK_DESTROY(_nt)
58675 +#define IEEE80211_NODE_LOCK(_nt) A_MUTEX_LOCK(&(_nt)->nt_nodelock)
58676 +#define IEEE80211_NODE_UNLOCK(_nt) A_MUTEX_UNLOCK(&(_nt)->nt_nodelock)
58677 +#define IEEE80211_NODE_LOCK_BH(_nt) A_MUTEX_LOCK(&(_nt)->nt_nodelock)
58678 +#define IEEE80211_NODE_UNLOCK_BH(_nt) A_MUTEX_UNLOCK(&(_nt)->nt_nodelock)
58679 +#define IEEE80211_NODE_LOCK_ASSERT(_nt)
58680 +
58681 +/*
58682 + * Node reference counting definitions.
58683 + *
58684 + * ieee80211_node_initref initialize the reference count to 1
58685 + * ieee80211_node_incref add a reference
58686 + * ieee80211_node_decref remove a reference
58687 + * ieee80211_node_dectestref remove a reference and return 1 if this
58688 + * is the last reference, otherwise 0
58689 + * ieee80211_node_refcnt reference count for printing (only)
58690 + */
58691 +#define ieee80211_node_initref(_ni) ((_ni)->ni_refcnt = 1)
58692 +#define ieee80211_node_incref(_ni) ((_ni)->ni_refcnt++)
58693 +#define ieee80211_node_decref(_ni) ((_ni)->ni_refcnt--)
58694 +#define ieee80211_node_dectestref(_ni) (((_ni)->ni_refcnt--) == 0)
58695 +#define ieee80211_node_refcnt(_ni) ((_ni)->ni_refcnt)
58696 +
58697 +#define IEEE80211_NODE_HASHSIZE 32
58698 +/* simple hash is enough for variation of macaddr */
58699 +#define IEEE80211_NODE_HASH(addr) \
58700 + (((const A_UINT8 *)(addr))[IEEE80211_ADDR_LEN - 1] % \
58701 + IEEE80211_NODE_HASHSIZE)
58702 +
58703 +/*
58704 + * Table of ieee80211_node instances. Each ieee80211com
58705 + * has at least one for holding the scan candidates.
58706 + * When operating as an access point or in ibss mode there
58707 + * is a second table for associated stations or neighbors.
58708 + */
58709 +struct ieee80211_node_table {
58710 + void *nt_wmip; /* back reference */
58711 + A_MUTEX_T nt_nodelock; /* on node table */
58712 + struct bss *nt_node_first; /* information of all nodes */
58713 + struct bss *nt_node_last; /* information of all nodes */
58714 + struct bss *nt_hash[IEEE80211_NODE_HASHSIZE];
58715 + const char *nt_name; /* for debugging */
58716 + A_UINT32 nt_scangen; /* gen# for timeout scan */
58717 + A_TIMER nt_inact_timer;
58718 + A_UINT8 isTimerArmed; /* is the node timer armed */
58719 +};
58720 +
58721 +#define WLAN_NODE_INACT_TIMEOUT_MSEC 10000
58722 +
58723 +#endif /* _IEEE80211_NODE_H_ */
58724 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ini_dset.h
58725 ===================================================================
58726 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58727 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/ini_dset.h 2008-12-11 22:46:49.000000000 +0100
58728 @@ -0,0 +1,40 @@
58729 +/*
58730 + * Copyright (c) 2004-2007 Atheros Communications Inc.
58731 + * All rights reserved.
58732 + *
58733 + * $ATH_LICENSE_HOSTSDK0_C$
58734 + *
58735 + */
58736 +#ifndef _INI_DSET_H_
58737 +#define _INI_DSET_H_
58738 +
58739 +/*
58740 + * Each of these represents a WHAL INI table, which consists
58741 + * of an "address column" followed by 1 or more "value columns".
58742 + *
58743 + * Software uses the base WHAL_INI_DATA_ID+column to access a
58744 + * DataSet that holds a particular column of data.
58745 + */
58746 +typedef enum {
58747 + WHAL_INI_DATA_ID_NULL =0,
58748 + WHAL_INI_DATA_ID_MODE_SPECIFIC =1, /* 2,3 */
58749 + WHAL_INI_DATA_ID_COMMON =4, /* 5 */
58750 + WHAL_INI_DATA_ID_BB_RFGAIN =6, /* 7,8 */
58751 + WHAL_INI_DATA_ID_ANALOG_BANK1 =9, /* 10 */
58752 + WHAL_INI_DATA_ID_ANALOG_BANK2 =11, /* 12 */
58753 + WHAL_INI_DATA_ID_ANALOG_BANK3 =13, /* 14, 15 */
58754 + WHAL_INI_DATA_ID_ANALOG_BANK6 =16, /* 17, 18 */
58755 + WHAL_INI_DATA_ID_ANALOG_BANK7 =19, /* 20 */
58756 + WHAL_INI_DATA_ID_MODE_OVERRIDES =21, /* 22,23 */
58757 + WHAL_INI_DATA_ID_COMMON_OVERRIDES =24, /* 25 */
58758 +
58759 + WHAL_INI_DATA_ID_MAX =25
58760 +} WHAL_INI_DATA_ID;
58761 +
58762 +typedef PREPACK struct {
58763 + A_UINT16 freqIndex; // 1 - A mode 2 - B or G mode 0 - common
58764 + A_UINT16 offset;
58765 + A_UINT32 newValue;
58766 +} POSTPACK INI_DSET_REG_OVERRIDE;
58767 +
58768 +#endif
58769 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/regDb.h
58770 ===================================================================
58771 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58772 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/regDb.h 2008-12-11 22:46:49.000000000 +0100
58773 @@ -0,0 +1,19 @@
58774 +/*
58775 + * Copyright (c) 2005 Atheros Communications, Inc.
58776 + * All rights reserved.
58777 + *
58778 + *
58779 + * $ATH_LICENSE_HOSTSDK0_C$
58780 + *
58781 + * This module contains the header files for regulatory module,
58782 + * which include the DB schema and DB values.
58783 + * $Id:
58784 + */
58785 +
58786 +#ifndef __REG_DB_H__
58787 +#define __REG_DB_H__
58788 +
58789 +#include "./regulatory/reg_dbschema.h"
58790 +#include "./regulatory/reg_dbvalues.h"
58791 +
58792 +#endif /* __REG_DB_H__ */
58793 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/regdump.h
58794 ===================================================================
58795 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58796 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/regdump.h 2008-12-11 22:46:49.000000000 +0100
58797 @@ -0,0 +1,33 @@
58798 +#ifndef __REGDUMP_H__
58799 +#define __REGDUMP_H__
58800 +/*
58801 + * Copyright (c) 2004-2007 Atheros Communications Inc.
58802 + * All rights reserved.
58803 + *
58804 + * $ATH_LICENSE_HOSTSDK0_C$
58805 + *
58806 + */
58807 +#if defined(AR6001)
58808 +#include "AR6001/AR6001_regdump.h"
58809 +#endif
58810 +#if defined(AR6002)
58811 +#include "AR6002/AR6002_regdump.h"
58812 +#endif
58813 +
58814 +#if !defined(__ASSEMBLER__)
58815 +/*
58816 + * Target CPU state at the time of failure is reflected
58817 + * in a register dump, which the Host can fetch through
58818 + * the diagnostic window.
58819 + */
58820 +struct register_dump_s {
58821 + A_UINT32 target_id; /* Target ID */
58822 + A_UINT32 assline; /* Line number (if assertion failure) */
58823 + A_UINT32 pc; /* Program Counter at time of exception */
58824 + A_UINT32 badvaddr; /* Virtual address causing exception */
58825 + CPU_exception_frame_t exc_frame; /* CPU-specific exception info */
58826 +
58827 + /* Could copy top of stack here, too.... */
58828 +};
58829 +#endif /* __ASSEMBLER__ */
58830 +#endif /* __REGDUMP_H__ */
58831 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/targaddrs.h
58832 ===================================================================
58833 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58834 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/targaddrs.h 2008-12-11 22:46:49.000000000 +0100
58835 @@ -0,0 +1,158 @@
58836 +/*
58837 + * Copyright (c) 2004-2007 Atheros Communications Inc.
58838 + * All rights reserved.
58839 + *
58840 + * $ATH_LICENSE_HOSTSDK0_C$
58841 + *
58842 + */
58843 +
58844 +#ifndef __TARGADDRS_H__
58845 +#define __TARGADDRS_H__
58846 +#if defined(AR6001)
58847 +#include "AR6001/addrs.h"
58848 +#endif
58849 +#if defined(AR6002)
58850 +#include "AR6002/addrs.h"
58851 +#endif
58852 +
58853 +/*
58854 + * AR6K option bits, to enable/disable various features.
58855 + * By default, all option bits are 0.
58856 + * These bits can be set in LOCAL_SCRATCH register 0.
58857 + */
58858 +#define AR6K_OPTION_BMI_DISABLE 0x01 /* Disable BMI comm with Host */
58859 +#define AR6K_OPTION_SERIAL_ENABLE 0x02 /* Enable serial port msgs */
58860 +#define AR6K_OPTION_WDT_DISABLE 0x04 /* WatchDog Timer override */
58861 +#define AR6K_OPTION_SLEEP_DISABLE 0x08 /* Disable system sleep */
58862 +#define AR6K_OPTION_STOP_BOOT 0x10 /* Stop boot processes (for ATE) */
58863 +#define AR6K_OPTION_ENABLE_NOANI 0x20 /* Operate without ANI */
58864 +#define AR6K_OPTION_DSET_DISABLE 0x40 /* Ignore DataSets */
58865 +#define AR6K_OPTION_IGNORE_FLASH 0x80 /* Ignore flash during bootup */
58866 +
58867 +/*
58868 + * xxx_HOST_INTEREST_ADDRESS is the address in Target RAM of the
58869 + * host_interest structure. It must match the address of the _host_interest
58870 + * symbol (see linker script).
58871 + *
58872 + * Host Interest is shared between Host and Target in order to coordinate
58873 + * between the two, and is intended to remain constant (with additions only
58874 + * at the end) across software releases.
58875 + */
58876 +#define AR6001_HOST_INTEREST_ADDRESS 0x80000600
58877 +#define AR6002_HOST_INTEREST_ADDRESS 0x00500400
58878 +
58879 +#define HOST_INTEREST_MAX_SIZE 0x100
58880 +
58881 +#if !defined(__ASSEMBLER__)
58882 +struct register_dump_s;
58883 +struct dbglog_hdr_s;
58884 +
58885 +/*
58886 + * These are items that the Host may need to access
58887 + * via BMI or via the Diagnostic Window. The position
58888 + * of items in this structure must remain constant
58889 + * across firmware revisions!
58890 + *
58891 + * Types for each item must be fixed size across
58892 + * target and host platforms.
58893 + *
58894 + * More items may be added at the end.
58895 + */
58896 +struct host_interest_s {
58897 + /*
58898 + * Pointer to application-defined area, if any.
58899 + * Set by Target application during startup.
58900 + */
58901 + A_UINT32 hi_app_host_interest; /* 0x00 */
58902 +
58903 + /* Pointer to register dump area, valid after Target crash. */
58904 + A_UINT32 hi_failure_state; /* 0x04 */
58905 +
58906 + /* Pointer to debug logging header */
58907 + A_UINT32 hi_dbglog_hdr; /* 0x08 */
58908 +
58909 + /* Indicates whether or not flash is present on Target.
58910 + * NB: flash_is_present indicator is here not just
58911 + * because it might be of interest to the Host; but
58912 + * also because it's set early on by Target's startup
58913 + * asm code and we need it to have a special RAM address
58914 + * so that it doesn't get reinitialized with the rest
58915 + * of data.
58916 + */
58917 + A_UINT32 hi_flash_is_present; /* 0x0c */
58918 +
58919 + /*
58920 + * General-purpose flag bits, similar to AR6000_OPTION_* flags.
58921 + * Can be used by application rather than by OS.
58922 + */
58923 + A_UINT32 hi_option_flag; /* 0x10 */
58924 +
58925 + /*
58926 + * Boolean that determines whether or not to
58927 + * display messages on the serial port.
58928 + */
58929 + A_UINT32 hi_serial_enable; /* 0x14 */
58930 +
58931 + /* Start address of Flash DataSet index, if any */
58932 + A_UINT32 hi_dset_list_head; /* 0x18 */
58933 +
58934 + /* Override Target application start address */
58935 + A_UINT32 hi_app_start; /* 0x1c */
58936 +
58937 + /* Clock and voltage tuning */
58938 + A_UINT32 hi_skip_clock_init; /* 0x20 */
58939 + A_UINT32 hi_core_clock_setting; /* 0x24 */
58940 + A_UINT32 hi_cpu_clock_setting; /* 0x28 */
58941 + A_UINT32 hi_system_sleep_setting; /* 0x2c */
58942 + A_UINT32 hi_xtal_control_setting; /* 0x30 */
58943 + A_UINT32 hi_pll_ctrl_setting_24ghz; /* 0x34 */
58944 + A_UINT32 hi_pll_ctrl_setting_5ghz; /* 0x38 */
58945 + A_UINT32 hi_ref_voltage_trim_setting; /* 0x3c */
58946 + A_UINT32 hi_clock_info; /* 0x40 */
58947 +
58948 + /*
58949 + * Flash configuration overrides, used only
58950 + * when firmware is not executing from flash.
58951 + * (When using flash, modify the global variables
58952 + * with equivalent names.)
58953 + */
58954 + A_UINT32 hi_bank0_addr_value; /* 0x44 */
58955 + A_UINT32 hi_bank0_read_value; /* 0x48 */
58956 + A_UINT32 hi_bank0_write_value; /* 0x4c */
58957 + A_UINT32 hi_bank0_config_value; /* 0x50 */
58958 +
58959 + /* Pointer to Board Data */
58960 + A_UINT32 hi_board_data; /* 0x54 */
58961 + A_UINT32 hi_board_data_initialized; /* 0x58 */
58962 +
58963 + A_UINT32 hi_dset_RAM_index_table; /* 0x5c */
58964 +
58965 + A_UINT32 hi_desired_baud_rate; /* 0x60 */
58966 + A_UINT32 hi_dbglog_config; /* 0x64 */
58967 + A_UINT32 hi_end_RAM_reserve_sz; /* 0x68 */
58968 + A_UINT32 hi_mbox_io_block_sz; /* 0x6c */
58969 +
58970 + A_UINT32 hi_num_bpatch_streams; /* 0x70 */
58971 + A_UINT32 hi_mbox_isr_yield_limit; /* 0x74 */
58972 +
58973 + A_UINT32 hi_refclk_hz; /* 0x78 */
58974 +};
58975 +
58976 +/* Bits defined in hi_option_flag */
58977 +#define HI_OPTION_TIMER_WAR 1 /* not really used */
58978 +
58979 +/*
58980 + * Intended for use by Host software, this macro returns the Target RAM
58981 + * address of any item in the host_interest structure.
58982 + * Example: target_addr = AR6001_HOST_INTEREST_ITEM_ADDRESS(hi_board_data);
58983 + */
58984 +#define AR6001_HOST_INTEREST_ITEM_ADDRESS(item) \
58985 + ((A_UINT32)&((((struct host_interest_s *)(AR6001_HOST_INTEREST_ADDRESS))->item)))
58986 +
58987 +#define AR6002_HOST_INTEREST_ITEM_ADDRESS(item) \
58988 + ((A_UINT32)&((((struct host_interest_s *)(AR6002_HOST_INTEREST_ADDRESS))->item)))
58989 +
58990 +
58991 +#endif /* !__ASSEMBLER__ */
58992 +
58993 +#endif /* __TARGADDRS_H__ */
58994 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/testcmd.h
58995 ===================================================================
58996 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
58997 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/testcmd.h 2008-12-11 22:46:49.000000000 +0100
58998 @@ -0,0 +1,144 @@
58999 +/*
59000 + * Copyright (c) 2004-2005 Atheros Communications Inc.
59001 + * All rights reserved.
59002 + *
59003 + *
59004 + * $ATH_LICENSE_HOSTSDK0_C$
59005 + *
59006 + */
59007 +
59008 +#ifndef TESTCMD_H_
59009 +#define TESTCMD_H_
59010 +
59011 +#ifdef __cplusplus
59012 +extern "C" {
59013 +#endif
59014 +
59015 +typedef enum {
59016 + ZEROES_PATTERN = 0,
59017 + ONES_PATTERN,
59018 + REPEATING_10,
59019 + PN7_PATTERN,
59020 + PN9_PATTERN,
59021 + PN15_PATTERN
59022 +}TX_DATA_PATTERN;
59023 +
59024 +/* Continous tx
59025 + mode : TCMD_CONT_TX_OFF - Disabling continous tx
59026 + TCMD_CONT_TX_SINE - Enable continuous unmodulated tx
59027 + TCMD_CONT_TX_FRAME- Enable continuous modulated tx
59028 + freq : Channel freq in Mhz. (e.g 2412 for channel 1 in 11 g)
59029 +dataRate: 0 - 1 Mbps
59030 + 1 - 2 Mbps
59031 + 2 - 5.5 Mbps
59032 + 3 - 11 Mbps
59033 + 4 - 6 Mbps
59034 + 5 - 9 Mbps
59035 + 6 - 12 Mbps
59036 + 7 - 18 Mbps
59037 + 8 - 24 Mbps
59038 + 9 - 36 Mbps
59039 + 10 - 28 Mbps
59040 + 11 - 54 Mbps
59041 + txPwr: Tx power in dBm[5 -11] for unmod Tx, [5-14] for mod Tx
59042 +antenna: 1 - one antenna
59043 + 2 - two antenna
59044 +Note : Enable/disable continuous tx test cmd works only when target is awake.
59045 +*/
59046 +
59047 +typedef enum {
59048 + TCMD_CONT_TX_OFF = 0,
59049 + TCMD_CONT_TX_SINE,
59050 + TCMD_CONT_TX_FRAME,
59051 + TCMD_CONT_TX_TX99,
59052 + TCMD_CONT_TX_TX100
59053 +} TCMD_CONT_TX_MODE;
59054 +
59055 +typedef PREPACK struct {
59056 + A_UINT32 testCmdId;
59057 + A_UINT32 mode;
59058 + A_UINT32 freq;
59059 + A_UINT32 dataRate;
59060 + A_INT32 txPwr;
59061 + A_UINT32 antenna;
59062 + A_UINT32 enANI;
59063 + A_UINT32 scramblerOff;
59064 + A_UINT32 aifsn;
59065 + A_UINT16 pktSz;
59066 + A_UINT16 txPattern;
59067 +} POSTPACK TCMD_CONT_TX;
59068 +
59069 +#define TCMD_TXPATTERN_ZERONE 0x1
59070 +#define TCMD_TXPATTERN_ZERONE_DIS_SCRAMBLE 0x2
59071 +
59072 +/* Continuous Rx
59073 + act: TCMD_CONT_RX_PROMIS - promiscuous mode (accept all incoming frames)
59074 + TCMD_CONT_RX_FILTER - filter mode (accept only frames with dest
59075 + address equal specified
59076 + mac address (set via act =3)
59077 + TCMD_CONT_RX_REPORT off mode (disable cont rx mode and get the
59078 + report from the last cont
59079 + Rx test)
59080 +
59081 + TCMD_CONT_RX_SETMAC - set MacAddr mode (sets the MAC address for the
59082 + target. This Overrides
59083 + the default MAC address.)
59084 +
59085 +*/
59086 +typedef enum {
59087 + TCMD_CONT_RX_PROMIS =0,
59088 + TCMD_CONT_RX_FILTER,
59089 + TCMD_CONT_RX_REPORT,
59090 + TCMD_CONT_RX_SETMAC
59091 +} TCMD_CONT_RX_ACT;
59092 +
59093 +typedef PREPACK struct {
59094 + A_UINT32 testCmdId;
59095 + A_UINT32 act;
59096 + A_UINT32 enANI;
59097 + PREPACK union {
59098 + struct PREPACK TCMD_CONT_RX_PARA {
59099 + A_UINT32 freq;
59100 + A_UINT32 antenna;
59101 + } POSTPACK para;
59102 + struct PREPACK TCMD_CONT_RX_REPORT {
59103 + A_UINT32 totalPkt;
59104 + A_INT32 rssiInDBm;
59105 + } POSTPACK report;
59106 + struct PREPACK TCMD_CONT_RX_MAC {
59107 + A_UCHAR addr[ATH_MAC_LEN];
59108 + } POSTPACK mac;
59109 + } POSTPACK u;
59110 +} POSTPACK TCMD_CONT_RX;
59111 +
59112 +/* Force sleep/wake test cmd
59113 + mode: TCMD_PM_WAKEUP - Wakeup the target
59114 + TCMD_PM_SLEEP - Force the target to sleep.
59115 + */
59116 +typedef enum {
59117 + TCMD_PM_WAKEUP = 1, /* be consistent with target */
59118 + TCMD_PM_SLEEP
59119 +} TCMD_PM_MODE;
59120 +
59121 +typedef PREPACK struct {
59122 + A_UINT32 testCmdId;
59123 + A_UINT32 mode;
59124 +} POSTPACK TCMD_PM;
59125 +
59126 +typedef enum{
59127 + TCMD_CONT_TX_ID,
59128 + TCMD_CONT_RX_ID,
59129 + TCMD_PM_ID
59130 + } TCMD_ID;
59131 +
59132 +typedef PREPACK union {
59133 + TCMD_CONT_TX contTx;
59134 + TCMD_CONT_RX contRx;
59135 + TCMD_PM pm ;
59136 +} POSTPACK TEST_CMD;
59137 +
59138 +#ifdef __cplusplus
59139 +}
59140 +#endif
59141 +
59142 +#endif /* TESTCMD_H_ */
59143 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wlan_api.h
59144 ===================================================================
59145 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
59146 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wlan_api.h 2008-12-11 22:46:49.000000000 +0100
59147 @@ -0,0 +1,101 @@
59148 +#ifndef _HOST_WLAN_API_H_
59149 +#define _HOST_WLAN_API_H_
59150 +/*
59151 + * Copyright (c) 2004-2005 Atheros Communications Inc.
59152 + * All rights reserved.
59153 + *
59154 + * This file contains the API for the host wlan module
59155 + *
59156 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/wlan_api.h#1 $
59157 + *
59158 + *
59159 + * This program is free software; you can redistribute it and/or modify
59160 + * it under the terms of the GNU General Public License version 2 as
59161 + * published by the Free Software Foundation;
59162 + *
59163 + * Software distributed under the License is distributed on an "AS
59164 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
59165 + * implied. See the License for the specific language governing
59166 + * rights and limitations under the License.
59167 + *
59168 + *
59169 + *
59170 + */
59171 +
59172 +#ifdef __cplusplus
59173 +extern "C" {
59174 +#endif
59175 +
59176 +struct ieee80211_node_table;
59177 +struct ieee80211_frame;
59178 +
59179 +struct ieee80211_common_ie {
59180 + A_UINT16 ie_chan;
59181 + A_UINT8 *ie_tstamp;
59182 + A_UINT8 *ie_ssid;
59183 + A_UINT8 *ie_rates;
59184 + A_UINT8 *ie_xrates;
59185 + A_UINT8 *ie_country;
59186 + A_UINT8 *ie_wpa;
59187 + A_UINT8 *ie_rsn;
59188 + A_UINT8 *ie_wmm;
59189 + A_UINT8 *ie_ath;
59190 + A_UINT16 ie_capInfo;
59191 + A_UINT16 ie_beaconInt;
59192 + A_UINT8 *ie_tim;
59193 + A_UINT8 *ie_chswitch;
59194 + A_UINT8 ie_erp;
59195 + A_UINT8 *ie_wsc;
59196 +};
59197 +
59198 +typedef struct bss {
59199 + A_UINT8 ni_macaddr[6];
59200 + A_UINT8 ni_snr;
59201 + A_INT16 ni_rssi;
59202 + struct bss *ni_list_next;
59203 + struct bss *ni_list_prev;
59204 + struct bss *ni_hash_next;
59205 + struct bss *ni_hash_prev;
59206 + struct ieee80211_common_ie ni_cie;
59207 + A_UINT8 *ni_buf;
59208 + struct ieee80211_node_table *ni_table;
59209 + A_UINT32 ni_refcnt;
59210 + int ni_scangen;
59211 + A_UINT32 ni_tstamp;
59212 +} bss_t;
59213 +
59214 +typedef void wlan_node_iter_func(void *arg, bss_t *);
59215 +
59216 +bss_t *wlan_node_alloc(struct ieee80211_node_table *nt, int wh_size);
59217 +void wlan_node_free(bss_t *ni);
59218 +void wlan_setup_node(struct ieee80211_node_table *nt, bss_t *ni,
59219 + const A_UINT8 *macaddr);
59220 +bss_t *wlan_find_node(struct ieee80211_node_table *nt, const A_UINT8 *macaddr);
59221 +void wlan_node_reclaim(struct ieee80211_node_table *nt, bss_t *ni);
59222 +void wlan_free_allnodes(struct ieee80211_node_table *nt);
59223 +void wlan_iterate_nodes(struct ieee80211_node_table *nt, wlan_node_iter_func *f,
59224 + void *arg);
59225 +
59226 +void wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt);
59227 +void wlan_node_table_reset(struct ieee80211_node_table *nt);
59228 +void wlan_node_table_cleanup(struct ieee80211_node_table *nt);
59229 +
59230 +A_STATUS wlan_parse_beacon(A_UINT8 *buf, int framelen,
59231 + struct ieee80211_common_ie *cie);
59232 +
59233 +A_UINT16 wlan_ieee2freq(int chan);
59234 +A_UINT32 wlan_freq2ieee(A_UINT16 freq);
59235 +
59236 +
59237 +bss_t *
59238 +wlan_find_Ssidnode (struct ieee80211_node_table *nt, A_UCHAR *pSsid,
59239 + A_UINT32 ssidLength, A_BOOL bIsWPA2);
59240 +
59241 +void
59242 +wlan_node_return (struct ieee80211_node_table *nt, bss_t *ni);
59243 +
59244 +#ifdef __cplusplus
59245 +}
59246 +#endif
59247 +
59248 +#endif /* _HOST_WLAN_API_H_ */
59249 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wlan_dset.h
59250 ===================================================================
59251 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
59252 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wlan_dset.h 2008-12-11 22:46:49.000000000 +0100
59253 @@ -0,0 +1,20 @@
59254 +/*
59255 + * Copyright (c) 2007 Atheros Communications, Inc.
59256 + * All rights reserved.
59257 + *
59258 + *
59259 + * $ATH_LICENSE_HOSTSDK0_C$
59260 + *
59261 + */
59262 +
59263 +#ifndef __WLAN_DSET_H__
59264 +#define __WKAN_DSET_H__
59265 +
59266 +typedef PREPACK struct wow_config_dset {
59267 +
59268 + A_UINT8 valid_dset;
59269 + A_UINT8 gpio_enable;
59270 + A_UINT16 gpio_pin;
59271 +} POSTPACK WOW_CONFIG_DSET;
59272 +
59273 +#endif
59274 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wmi_api.h
59275 ===================================================================
59276 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
59277 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wmi_api.h 2008-12-11 22:46:49.000000000 +0100
59278 @@ -0,0 +1,260 @@
59279 +#ifndef _WMI_API_H_
59280 +#define _WMI_API_H_
59281 +/*
59282 + * Copyright (c) 2004-2006 Atheros Communications Inc.
59283 + * All rights reserved.
59284 + *
59285 + * This file contains the definitions for the Wireless Module Interface (WMI).
59286 + *
59287 + * $Id: //depot/sw/releases/olca2.0-GPL/host/include/wmi_api.h#2 $
59288 + *
59289 + *
59290 + * This program is free software; you can redistribute it and/or modify
59291 + * it under the terms of the GNU General Public License version 2 as
59292 + * published by the Free Software Foundation;
59293 + *
59294 + * Software distributed under the License is distributed on an "AS
59295 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
59296 + * implied. See the License for the specific language governing
59297 + * rights and limitations under the License.
59298 + *
59299 + *
59300 + *
59301 + */
59302 +
59303 +#ifdef __cplusplus
59304 +extern "C" {
59305 +#endif
59306 +
59307 +/*
59308 + * IP QoS Field definitions according to 802.1p
59309 + */
59310 +#define BEST_EFFORT_PRI 0
59311 +#define BACKGROUND_PRI 1
59312 +#define EXCELLENT_EFFORT_PRI 3
59313 +#define CONTROLLED_LOAD_PRI 4
59314 +#define VIDEO_PRI 5
59315 +#define VOICE_PRI 6
59316 +#define NETWORK_CONTROL_PRI 7
59317 +#define MAX_NUM_PRI 8
59318 +
59319 +#define UNDEFINED_PRI (0xff)
59320 +
59321 +/* simple mapping of IP TOS field to a WMI priority stream
59322 + * this mapping was taken from the original linux driver implementation
59323 + * The operation maps the following
59324 + *
59325 + * */
59326 +#define IP_TOS_TO_WMI_PRI(tos) \
59327 + ((WMI_PRI_STREAM_ID)(((tos) >> 1) & 0x03))
59328 +
59329 +#define WMI_IMPLICIT_PSTREAM_INACTIVITY_INT 5000 /* 5 seconds */
59330 +
59331 +
59332 +struct wmi_t;
59333 +
59334 +void *wmi_init(void *devt);
59335 +
59336 +void wmi_qos_state_init(struct wmi_t *wmip);
59337 +void wmi_shutdown(struct wmi_t *wmip);
59338 +A_UINT16 wmi_get_mapped_qos_queue(struct wmi_t *, A_UINT8);
59339 +A_STATUS wmi_dix_2_dot3(struct wmi_t *wmip, void *osbuf);
59340 +A_STATUS wmi_data_hdr_add(struct wmi_t *wmip, void *osbuf, A_UINT8 msgType);
59341 +A_STATUS wmi_dot3_2_dix(struct wmi_t *wmip, void *osbuf);
59342 +A_STATUS wmi_data_hdr_remove(struct wmi_t *wmip, void *osbuf);
59343 +A_STATUS wmi_syncpoint(struct wmi_t *wmip);
59344 +A_STATUS wmi_syncpoint_reset(struct wmi_t *wmip);
59345 +WMI_PRI_STREAM_ID wmi_get_stream_id(struct wmi_t *wmip, A_UINT8 trafficClass);
59346 +A_UINT8 wmi_implicit_create_pstream(struct wmi_t *wmip, void *osbuf, A_UINT8 dir, A_UINT8 up);
59347 +
59348 +A_STATUS wmi_control_rx(struct wmi_t *wmip, void *osbuf);
59349 +void wmi_iterate_nodes(struct wmi_t *wmip, wlan_node_iter_func *f, void *arg);
59350 +void wmi_free_allnodes(struct wmi_t *wmip);
59351 +bss_t *wmi_find_node(struct wmi_t *wmip, const A_UINT8 *macaddr);
59352 +
59353 +
59354 +typedef enum {
59355 + NO_SYNC_WMIFLAG = 0,
59356 + SYNC_BEFORE_WMIFLAG, /* transmit all queued data before cmd */
59357 + SYNC_AFTER_WMIFLAG, /* any new data waits until cmd execs */
59358 + SYNC_BOTH_WMIFLAG,
59359 + END_WMIFLAG /* end marker */
59360 +} WMI_SYNC_FLAG;
59361 +
59362 +A_STATUS wmi_cmd_send(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
59363 + WMI_SYNC_FLAG flag);
59364 +A_STATUS wmi_connect_cmd(struct wmi_t *wmip,
59365 + NETWORK_TYPE netType,
59366 + DOT11_AUTH_MODE dot11AuthMode,
59367 + AUTH_MODE authMode,
59368 + CRYPTO_TYPE pairwiseCrypto,
59369 + A_UINT8 pairwiseCryptoLen,
59370 + CRYPTO_TYPE groupCrypto,
59371 + A_UINT8 groupCryptoLen,
59372 + int ssidLength,
59373 + A_UCHAR *ssid,
59374 + A_UINT8 *bssid,
59375 + A_UINT16 channel,
59376 + A_UINT32 ctrl_flags);
59377 +A_STATUS wmi_reconnect_cmd(struct wmi_t *wmip,
59378 + A_UINT8 *bssid,
59379 + A_UINT16 channel);
59380 +A_STATUS wmi_disconnect_cmd(struct wmi_t *wmip);
59381 +A_STATUS wmi_getrev_cmd(struct wmi_t *wmip);
59382 +A_STATUS wmi_startscan_cmd(struct wmi_t *wmip, WMI_SCAN_TYPE scanType,
59383 + A_BOOL forceFgScan, A_BOOL isLegacy,
59384 + A_UINT32 homeDwellTime, A_UINT32 forceScanInterval);
59385 +A_STATUS wmi_scanparams_cmd(struct wmi_t *wmip, A_UINT16 fg_start_sec,
59386 + A_UINT16 fg_end_sec, A_UINT16 bg_sec,
59387 + A_UINT16 minact_chdw_msec,
59388 + A_UINT16 maxact_chdw_msec, A_UINT16 pas_chdw_msec,
59389 + A_UINT8 shScanRatio, A_UINT8 scanCtrlFlags,
59390 + A_UINT32 max_dfsch_act_time);
59391 +A_STATUS wmi_bssfilter_cmd(struct wmi_t *wmip, A_UINT8 filter, A_UINT32 ieMask);
59392 +A_STATUS wmi_probedSsid_cmd(struct wmi_t *wmip, A_UINT8 index, A_UINT8 flag,
59393 + A_UINT8 ssidLength, A_UCHAR *ssid);
59394 +A_STATUS wmi_listeninterval_cmd(struct wmi_t *wmip, A_UINT16 listenInterval, A_UINT16 listenBeacons);
59395 +A_STATUS wmi_bmisstime_cmd(struct wmi_t *wmip, A_UINT16 bmisstime, A_UINT16 bmissbeacons);
59396 +A_STATUS wmi_associnfo_cmd(struct wmi_t *wmip, A_UINT8 ieType,
59397 + A_UINT8 ieLen, A_UINT8 *ieInfo);
59398 +A_STATUS wmi_powermode_cmd(struct wmi_t *wmip, A_UINT8 powerMode);
59399 +A_STATUS wmi_ibsspmcaps_cmd(struct wmi_t *wmip, A_UINT8 pmEnable, A_UINT8 ttl,
59400 + A_UINT16 atim_windows, A_UINT16 timeout_value);
59401 +A_STATUS wmi_pmparams_cmd(struct wmi_t *wmip, A_UINT16 idlePeriod,
59402 + A_UINT16 psPollNum, A_UINT16 dtimPolicy);
59403 +A_STATUS wmi_disctimeout_cmd(struct wmi_t *wmip, A_UINT8 timeout);
59404 +A_STATUS wmi_sync_cmd(struct wmi_t *wmip, A_UINT8 syncNumber);
59405 +A_STATUS wmi_create_pstream_cmd(struct wmi_t *wmip, WMI_CREATE_PSTREAM_CMD *pstream);
59406 +A_STATUS wmi_delete_pstream_cmd(struct wmi_t *wmip, A_UINT8 trafficClass, A_UINT8 streamID);
59407 +A_STATUS wmi_set_bitrate_cmd(struct wmi_t *wmip, A_INT32 rate);
59408 +A_STATUS wmi_get_bitrate_cmd(struct wmi_t *wmip);
59409 +A_INT8 wmi_validate_bitrate(struct wmi_t *wmip, A_INT32 rate);
59410 +A_STATUS wmi_get_regDomain_cmd(struct wmi_t *wmip);
59411 +A_STATUS wmi_get_channelList_cmd(struct wmi_t *wmip);
59412 +A_STATUS wmi_set_channelParams_cmd(struct wmi_t *wmip, A_UINT8 scanParam,
59413 + WMI_PHY_MODE mode, A_INT8 numChan,
59414 + A_UINT16 *channelList);
59415 +
59416 +A_STATUS wmi_set_snr_threshold_params(struct wmi_t *wmip,
59417 + WMI_SNR_THRESHOLD_PARAMS_CMD *snrCmd);
59418 +A_STATUS wmi_set_rssi_threshold_params(struct wmi_t *wmip,
59419 + WMI_RSSI_THRESHOLD_PARAMS_CMD *rssiCmd);
59420 +A_STATUS wmi_clr_rssi_snr(struct wmi_t *wmip);
59421 +A_STATUS wmi_set_lq_threshold_params(struct wmi_t *wmip,
59422 + WMI_LQ_THRESHOLD_PARAMS_CMD *lqCmd);
59423 +A_STATUS wmi_set_rts_cmd(struct wmi_t *wmip, A_UINT16 threshold);
59424 +A_STATUS wmi_set_lpreamble_cmd(struct wmi_t *wmip, A_UINT8 status);
59425 +
59426 +A_STATUS wmi_set_error_report_bitmask(struct wmi_t *wmip, A_UINT32 bitmask);
59427 +
59428 +A_STATUS wmi_get_challenge_resp_cmd(struct wmi_t *wmip, A_UINT32 cookie,
59429 + A_UINT32 source);
59430 +A_STATUS wmi_config_debug_module_cmd(struct wmi_t *wmip, A_UINT16 mmask,
59431 + A_UINT16 tsr, A_BOOL rep, A_UINT16 size,
59432 + A_UINT32 valid);
59433 +A_STATUS wmi_get_stats_cmd(struct wmi_t *wmip);
59434 +A_STATUS wmi_addKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex,
59435 + CRYPTO_TYPE keyType, A_UINT8 keyUsage,
59436 + A_UINT8 keyLength,A_UINT8 *keyRSC,
59437 + A_UINT8 *keyMaterial, A_UINT8 key_op_ctrl,
59438 + WMI_SYNC_FLAG sync_flag);
59439 +A_STATUS wmi_add_krk_cmd(struct wmi_t *wmip, A_UINT8 *krk);
59440 +A_STATUS wmi_delete_krk_cmd(struct wmi_t *wmip);
59441 +A_STATUS wmi_deleteKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex);
59442 +A_STATUS wmi_set_akmp_params_cmd(struct wmi_t *wmip,
59443 + WMI_SET_AKMP_PARAMS_CMD *akmpParams);
59444 +A_STATUS wmi_get_pmkid_list_cmd(struct wmi_t *wmip);
59445 +A_STATUS wmi_set_pmkid_list_cmd(struct wmi_t *wmip,
59446 + WMI_SET_PMKID_LIST_CMD *pmkInfo);
59447 +A_STATUS wmi_set_txPwr_cmd(struct wmi_t *wmip, A_UINT8 dbM);
59448 +A_STATUS wmi_get_txPwr_cmd(struct wmi_t *wmip);
59449 +A_STATUS wmi_switch_radio(struct wmi_t *wmip, A_UINT8 on);
59450 +A_STATUS wmi_addBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex, A_UINT8 *bssid);
59451 +A_STATUS wmi_deleteBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex);
59452 +A_STATUS wmi_set_tkip_countermeasures_cmd(struct wmi_t *wmip, A_BOOL en);
59453 +A_STATUS wmi_setPmkid_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT8 *pmkId,
59454 + A_BOOL set);
59455 +A_STATUS wmi_set_access_params_cmd(struct wmi_t *wmip, A_UINT16 txop,
59456 + A_UINT8 eCWmin, A_UINT8 eCWmax,
59457 + A_UINT8 aifsn);
59458 +A_STATUS wmi_set_retry_limits_cmd(struct wmi_t *wmip, A_UINT8 frameType,
59459 + A_UINT8 trafficClass, A_UINT8 maxRetries,
59460 + A_UINT8 enableNotify);
59461 +
59462 +void wmi_get_current_bssid(struct wmi_t *wmip, A_UINT8 *bssid);
59463 +
59464 +A_STATUS wmi_get_roam_tbl_cmd(struct wmi_t *wmip);
59465 +A_STATUS wmi_get_roam_data_cmd(struct wmi_t *wmip, A_UINT8 roamDataType);
59466 +A_STATUS wmi_set_roam_ctrl_cmd(struct wmi_t *wmip, WMI_SET_ROAM_CTRL_CMD *p,
59467 + A_UINT8 size);
59468 +A_STATUS wmi_set_powersave_timers_cmd(struct wmi_t *wmip,
59469 + WMI_POWERSAVE_TIMERS_POLICY_CMD *pCmd,
59470 + A_UINT8 size);
59471 +
59472 +A_STATUS wmi_set_opt_mode_cmd(struct wmi_t *wmip, A_UINT8 optMode);
59473 +A_STATUS wmi_opt_tx_frame_cmd(struct wmi_t *wmip,
59474 + A_UINT8 frmType,
59475 + A_UINT8 *dstMacAddr,
59476 + A_UINT8 *bssid,
59477 + A_UINT16 optIEDataLen,
59478 + A_UINT8 *optIEData);
59479 +
59480 +A_STATUS wmi_set_adhoc_bconIntvl_cmd(struct wmi_t *wmip, A_UINT16 intvl);
59481 +A_STATUS wmi_set_voice_pkt_size_cmd(struct wmi_t *wmip, A_UINT16 voicePktSize);
59482 +A_STATUS wmi_set_max_sp_len_cmd(struct wmi_t *wmip, A_UINT8 maxSpLen);
59483 +A_UINT8 convert_userPriority_to_trafficClass(A_UINT8 userPriority);
59484 +A_UINT8 wmi_get_power_mode_cmd(struct wmi_t *wmip);
59485 +A_STATUS wmi_verify_tspec_params(WMI_CREATE_PSTREAM_CMD *pCmd, A_BOOL tspecCompliance);
59486 +
59487 +#ifdef CONFIG_HOST_TCMD_SUPPORT
59488 +A_STATUS wmi_test_cmd(struct wmi_t *wmip, A_UINT8 *buf, A_UINT32 len);
59489 +#endif
59490 +
59491 +A_STATUS wmi_set_bt_status_cmd(struct wmi_t *wmip, A_UINT8 streamType, A_UINT8 status);
59492 +A_STATUS wmi_set_bt_params_cmd(struct wmi_t *wmip, WMI_SET_BT_PARAMS_CMD* cmd);
59493 +
59494 +
59495 +/*
59496 + * This function is used to configure the fix rates mask to the target.
59497 + */
59498 +A_STATUS wmi_set_fixrates_cmd(struct wmi_t *wmip, A_INT16 fixRatesMask);
59499 +A_STATUS wmi_get_ratemask_cmd(struct wmi_t *wmip);
59500 +
59501 +A_STATUS wmi_set_authmode_cmd(struct wmi_t *wmip, A_UINT8 mode);
59502 +
59503 +A_STATUS wmi_set_reassocmode_cmd(struct wmi_t *wmip, A_UINT8 mode);
59504 +
59505 +A_STATUS wmi_set_wmm_cmd(struct wmi_t *wmip, WMI_WMM_STATUS status);
59506 +A_STATUS wmi_set_wmm_txop(struct wmi_t *wmip, WMI_TXOP_CFG txEnable);
59507 +
59508 +A_STATUS wmi_get_keepalive_configured(struct wmi_t *wmip);
59509 +A_UINT8 wmi_get_keepalive_cmd(struct wmi_t *wmip);
59510 +A_STATUS wmi_set_keepalive_cmd(struct wmi_t *wmip, A_UINT8 keepaliveInterval);
59511 +
59512 +A_STATUS wmi_set_appie_cmd(struct wmi_t *wmip, A_UINT8 mgmtFrmType,
59513 + A_UINT8 ieLen,A_UINT8 *ieInfo);
59514 +
59515 +A_STATUS wmi_set_halparam_cmd(struct wmi_t *wmip, A_UINT8 *cmd, A_UINT16 dataLen);
59516 +A_INT32 wmi_get_rate(A_INT8 rateindex);
59517 +
59518 +/*Wake on Wireless WMI commands*/
59519 +A_STATUS wmi_set_host_sleep_mode_cmd(struct wmi_t *wmip, WMI_SET_HOST_SLEEP_MODE_CMD *cmd);
59520 +A_STATUS wmi_set_wow_mode_cmd(struct wmi_t *wmip, WMI_SET_WOW_MODE_CMD *cmd);
59521 +A_STATUS wmi_get_wow_list_cmd(struct wmi_t *wmip, WMI_GET_WOW_LIST_CMD *cmd);
59522 +A_STATUS wmi_add_wow_pattern_cmd(struct wmi_t *wmip,
59523 + WMI_ADD_WOW_PATTERN_CMD *cmd, A_UINT8* pattern, A_UINT8* mask, A_UINT8 pattern_size);
59524 +A_STATUS wmi_del_wow_pattern_cmd(struct wmi_t *wmip,
59525 + WMI_DEL_WOW_PATTERN_CMD *cmd);
59526 +A_STATUS wmi_set_wsc_status_cmd(struct wmi_t *wmip, A_UINT32 status);
59527 +
59528 +bss_t *
59529 +wmi_find_Ssidnode (struct wmi_t *wmip, A_UCHAR *pSsid,
59530 + A_UINT32 ssidLength, A_BOOL bIsWPA2);
59531 +
59532 +void
59533 +wmi_node_return (struct wmi_t *wmip, bss_t *bss);
59534 +#ifdef __cplusplus
59535 +}
59536 +#endif
59537 +
59538 +#endif /* _WMI_API_H_ */
59539 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wmi.h
59540 ===================================================================
59541 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
59542 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wmi.h 2008-12-11 22:46:49.000000000 +0100
59543 @@ -0,0 +1,1743 @@
59544 +/*
59545 + * Copyright (c) 2004-2006 Atheros Communications Inc.
59546 + * All rights reserved.
59547 + *
59548 + *
59549 + * $ATH_LICENSE_HOSTSDK0_C$
59550 + *
59551 + * This file contains the definitions of the WMI protocol specified in the
59552 + * Wireless Module Interface (WMI). It includes definitions of all the
59553 + * commands and events. Commands are messages from the host to the WM.
59554 + * Events and Replies are messages from the WM to the host.
59555 + *
59556 + * Ownership of correctness in regards to WMI commands
59557 + * belongs to the host driver and the WM is not required to validate
59558 + * parameters for value, proper range, or any other checking.
59559 + *
59560 + */
59561 +
59562 +#ifndef _WMI_H_
59563 +#define _WMI_H_
59564 +
59565 +#ifndef ATH_TARGET
59566 +#include "athstartpack.h"
59567 +#endif
59568 +
59569 +#include "wmix.h"
59570 +
59571 +#ifdef __cplusplus
59572 +extern "C" {
59573 +#endif
59574 +
59575 +#define WMI_PROTOCOL_VERSION 0x0002
59576 +#define WMI_PROTOCOL_REVISION 0x0000
59577 +
59578 +#define ATH_MAC_LEN 6 /* length of mac in bytes */
59579 +#define WMI_CMD_MAX_LEN 100
59580 +#define WMI_CONTROL_MSG_MAX_LEN 256
59581 +#define WMI_OPT_CONTROL_MSG_MAX_LEN 1536
59582 +#define IS_ETHERTYPE(_typeOrLen) ((_typeOrLen) >= 0x0600)
59583 +#define RFC1042OUI {0x00, 0x00, 0x00}
59584 +
59585 +#define IP_ETHERTYPE 0x0800
59586 +
59587 +#define WMI_IMPLICIT_PSTREAM 0xFF
59588 +#define WMI_MAX_THINSTREAM 15
59589 +
59590 +struct host_app_area_s {
59591 + A_UINT32 wmi_protocol_ver;
59592 +};
59593 +
59594 +/*
59595 + * Data Path
59596 + */
59597 +typedef PREPACK struct {
59598 + A_UINT8 dstMac[ATH_MAC_LEN];
59599 + A_UINT8 srcMac[ATH_MAC_LEN];
59600 + A_UINT16 typeOrLen;
59601 +} POSTPACK ATH_MAC_HDR;
59602 +
59603 +typedef PREPACK struct {
59604 + A_UINT8 dsap;
59605 + A_UINT8 ssap;
59606 + A_UINT8 cntl;
59607 + A_UINT8 orgCode[3];
59608 + A_UINT16 etherType;
59609 +} POSTPACK ATH_LLC_SNAP_HDR;
59610 +
59611 +typedef enum {
59612 + DATA_MSGTYPE = 0x0,
59613 + CNTL_MSGTYPE,
59614 + SYNC_MSGTYPE
59615 +} WMI_MSG_TYPE;
59616 +
59617 +
59618 +typedef PREPACK struct {
59619 + A_INT8 rssi;
59620 + A_UINT8 info; /* WMI_MSG_TYPE in lower 2 bits - b1b0 */
59621 + /* UP in next 3 bits - b4b3b2 */
59622 +#define WMI_DATA_HDR_MSG_TYPE_MASK 0x03
59623 +#define WMI_DATA_HDR_MSG_TYPE_SHIFT 0
59624 +#define WMI_DATA_HDR_UP_MASK 0x07
59625 +#define WMI_DATA_HDR_UP_SHIFT 2
59626 +#define WMI_DATA_HDR_IS_MSG_TYPE(h, t) (((h)->info & (WMI_DATA_HDR_MSG_TYPE_MASK)) == (t))
59627 +} POSTPACK WMI_DATA_HDR;
59628 +
59629 +
59630 +#define WMI_DATA_HDR_SET_MSG_TYPE(h, t) (h)->info = (((h)->info & ~(WMI_DATA_HDR_MSG_TYPE_MASK << WMI_DATA_HDR_MSG_TYPE_SHIFT)) | (t << WMI_DATA_HDR_MSG_TYPE_SHIFT))
59631 +#define WMI_DATA_HDR_SET_UP(h, p) (h)->info = (((h)->info & ~(WMI_DATA_HDR_UP_MASK << WMI_DATA_HDR_UP_SHIFT)) | (p << WMI_DATA_HDR_UP_SHIFT))
59632 +
59633 +/*
59634 + * Control Path
59635 + */
59636 +typedef PREPACK struct {
59637 + A_UINT16 commandId;
59638 +} POSTPACK WMI_CMD_HDR; /* used for commands and events */
59639 +
59640 +/*
59641 + * List of Commnands
59642 + */
59643 +typedef enum {
59644 + WMI_CONNECT_CMDID = 0x0001,
59645 + WMI_RECONNECT_CMDID,
59646 + WMI_DISCONNECT_CMDID,
59647 + WMI_SYNCHRONIZE_CMDID,
59648 + WMI_CREATE_PSTREAM_CMDID,
59649 + WMI_DELETE_PSTREAM_CMDID,
59650 + WMI_START_SCAN_CMDID,
59651 + WMI_SET_SCAN_PARAMS_CMDID,
59652 + WMI_SET_BSS_FILTER_CMDID,
59653 + WMI_SET_PROBED_SSID_CMDID,
59654 + WMI_SET_LISTEN_INT_CMDID,
59655 + WMI_SET_BMISS_TIME_CMDID,
59656 + WMI_SET_DISC_TIMEOUT_CMDID,
59657 + WMI_GET_CHANNEL_LIST_CMDID,
59658 + WMI_SET_BEACON_INT_CMDID,
59659 + WMI_GET_STATISTICS_CMDID,
59660 + WMI_SET_CHANNEL_PARAMS_CMDID,
59661 + WMI_SET_POWER_MODE_CMDID,
59662 + WMI_SET_IBSS_PM_CAPS_CMDID,
59663 + WMI_SET_POWER_PARAMS_CMDID,
59664 + WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID,
59665 + WMI_ADD_CIPHER_KEY_CMDID,
59666 + WMI_DELETE_CIPHER_KEY_CMDID,
59667 + WMI_ADD_KRK_CMDID,
59668 + WMI_DELETE_KRK_CMDID,
59669 + WMI_SET_PMKID_CMDID,
59670 + WMI_SET_TX_PWR_CMDID,
59671 + WMI_GET_TX_PWR_CMDID,
59672 + WMI_SET_ASSOC_INFO_CMDID,
59673 + WMI_ADD_BAD_AP_CMDID,
59674 + WMI_DELETE_BAD_AP_CMDID,
59675 + WMI_SET_TKIP_COUNTERMEASURES_CMDID,
59676 + WMI_RSSI_THRESHOLD_PARAMS_CMDID,
59677 + WMI_TARGET_ERROR_REPORT_BITMASK_CMDID,
59678 + WMI_SET_ACCESS_PARAMS_CMDID,
59679 + WMI_SET_RETRY_LIMITS_CMDID,
59680 + WMI_SET_OPT_MODE_CMDID,
59681 + WMI_OPT_TX_FRAME_CMDID,
59682 + WMI_SET_VOICE_PKT_SIZE_CMDID,
59683 + WMI_SET_MAX_SP_LEN_CMDID,
59684 + WMI_SET_ROAM_CTRL_CMDID,
59685 + WMI_GET_ROAM_TBL_CMDID,
59686 + WMI_GET_ROAM_DATA_CMDID,
59687 + WMI_ENABLE_RM_CMDID,
59688 + WMI_SET_MAX_OFFHOME_DURATION_CMDID,
59689 + WMI_EXTENSION_CMDID, /* Non-wireless extensions */
59690 + WMI_SNR_THRESHOLD_PARAMS_CMDID,
59691 + WMI_LQ_THRESHOLD_PARAMS_CMDID,
59692 + WMI_SET_LPREAMBLE_CMDID,
59693 + WMI_SET_RTS_CMDID,
59694 + WMI_CLR_RSSI_SNR_CMDID,
59695 + WMI_SET_FIXRATES_CMDID,
59696 + WMI_GET_FIXRATES_CMDID,
59697 + WMI_SET_AUTH_MODE_CMDID,
59698 + WMI_SET_REASSOC_MODE_CMDID,
59699 + WMI_SET_WMM_CMDID,
59700 + WMI_SET_WMM_TXOP_CMDID,
59701 + WMI_TEST_CMDID,
59702 + WMI_SET_BT_STATUS_CMDID,
59703 + WMI_SET_BT_PARAMS_CMDID,
59704 +
59705 + WMI_SET_KEEPALIVE_CMDID,
59706 + WMI_GET_KEEPALIVE_CMDID,
59707 + WMI_SET_APPIE_CMDID,
59708 + WMI_GET_APPIE_CMDID,
59709 + WMI_SET_WSC_STATUS_CMDID,
59710 +
59711 + /* Wake on Wireless */
59712 + WMI_SET_HOST_SLEEP_MODE_CMDID,
59713 + WMI_SET_WOW_MODE_CMDID,
59714 + WMI_GET_WOW_LIST_CMDID,
59715 + WMI_ADD_WOW_PATTERN_CMDID,
59716 + WMI_DEL_WOW_PATTERN_CMDID,
59717 + WMI_SET_MAC_ADDRESS_CMDID,
59718 + WMI_SET_AKMP_PARAMS_CMDID,
59719 + WMI_SET_PMKID_LIST_CMDID,
59720 + WMI_GET_PMKID_LIST_CMDID,
59721 +
59722 + /*
59723 + * Developer commands starts at 0xF000
59724 + */
59725 + WMI_SET_BITRATE_CMDID = 0xF000,
59726 + WMI_GET_BITRATE_CMDID,
59727 + WMI_SET_WHALPARAM_CMDID,
59728 +
59729 +} WMI_COMMAND_ID;
59730 +
59731 +/*
59732 + * Frame Types
59733 + */
59734 +typedef enum {
59735 + WMI_FRAME_BEACON = 0,
59736 + WMI_FRAME_PROBE_REQ,
59737 + WMI_FRAME_PROBE_RESP,
59738 + WMI_FRAME_ASSOC_REQ,
59739 + WMI_FRAME_ASSOC_RESP,
59740 + WMI_NUM_MGMT_FRAME
59741 +} WMI_MGMT_FRAME_TYPE;
59742 +
59743 +/*
59744 + * Connect Command
59745 + */
59746 +typedef enum {
59747 + INFRA_NETWORK = 0x01,
59748 + ADHOC_NETWORK = 0x02,
59749 + ADHOC_CREATOR = 0x04,
59750 +} NETWORK_TYPE;
59751 +
59752 +typedef enum {
59753 + OPEN_AUTH = 0x01,
59754 + SHARED_AUTH = 0x02,
59755 + LEAP_AUTH = 0x04, /* different from IEEE_AUTH_MODE definitions */
59756 +} DOT11_AUTH_MODE;
59757 +
59758 +typedef enum {
59759 + NONE_AUTH = 0x01,
59760 + WPA_AUTH = 0x02,
59761 + WPA_PSK_AUTH = 0x03,
59762 + WPA2_AUTH = 0x04,
59763 + WPA2_PSK_AUTH = 0x05,
59764 + WPA_AUTH_CCKM = 0x06,
59765 + WPA2_AUTH_CCKM = 0x07,
59766 +} AUTH_MODE;
59767 +
59768 +typedef enum {
59769 + NONE_CRYPT = 0x01,
59770 + WEP_CRYPT = 0x02,
59771 + TKIP_CRYPT = 0x03,
59772 + AES_CRYPT = 0x04,
59773 +} CRYPTO_TYPE;
59774 +
59775 +#define WMI_MIN_CRYPTO_TYPE NONE_CRYPT
59776 +#define WMI_MAX_CRYPTO_TYPE (AES_CRYPT + 1)
59777 +
59778 +#define WMI_MIN_KEY_INDEX 0
59779 +#define WMI_MAX_KEY_INDEX 3
59780 +
59781 +#define WMI_MAX_KEY_LEN 32
59782 +
59783 +#define WMI_MAX_SSID_LEN 32
59784 +
59785 +typedef enum {
59786 + CONNECT_ASSOC_POLICY_USER = 0x0001,
59787 + CONNECT_SEND_REASSOC = 0x0002,
59788 + CONNECT_IGNORE_WPAx_GROUP_CIPHER = 0x0004,
59789 + CONNECT_PROFILE_MATCH_DONE = 0x0008,
59790 + CONNECT_IGNORE_AAC_BEACON = 0x0010,
59791 + CONNECT_CSA_FOLLOW_BSS = 0x0020,
59792 +} WMI_CONNECT_CTRL_FLAGS_BITS;
59793 +
59794 +#define DEFAULT_CONNECT_CTRL_FLAGS (CONNECT_CSA_FOLLOW_BSS)
59795 +
59796 +typedef PREPACK struct {
59797 + A_UINT8 networkType;
59798 + A_UINT8 dot11AuthMode;
59799 + A_UINT8 authMode;
59800 + A_UINT8 pairwiseCryptoType;
59801 + A_UINT8 pairwiseCryptoLen;
59802 + A_UINT8 groupCryptoType;
59803 + A_UINT8 groupCryptoLen;
59804 + A_UINT8 ssidLength;
59805 + A_UCHAR ssid[WMI_MAX_SSID_LEN];
59806 + A_UINT16 channel;
59807 + A_UINT8 bssid[ATH_MAC_LEN];
59808 + A_UINT32 ctrl_flags;
59809 +} POSTPACK WMI_CONNECT_CMD;
59810 +
59811 +/*
59812 + * WMI_RECONNECT_CMDID
59813 + */
59814 +typedef PREPACK struct {
59815 + A_UINT16 channel; /* hint */
59816 + A_UINT8 bssid[ATH_MAC_LEN]; /* mandatory if set */
59817 +} POSTPACK WMI_RECONNECT_CMD;
59818 +
59819 +/*
59820 + * WMI_ADD_CIPHER_KEY_CMDID
59821 + */
59822 +typedef enum {
59823 + PAIRWISE_USAGE = 0x00,
59824 + GROUP_USAGE = 0x01,
59825 + TX_USAGE = 0x02, /* default Tx Key - Static WEP only */
59826 +} KEY_USAGE;
59827 +
59828 +/*
59829 + * Bit Flag
59830 + * Bit 0 - Initialise TSC - default is Initialize
59831 + */
59832 +#define KEY_OP_INIT_TSC 0x01
59833 +#define KEY_OP_INIT_RSC 0x02
59834 +
59835 +#define KEY_OP_INIT_VAL 0x03 /* Default Initialise the TSC & RSC */
59836 +#define KEY_OP_VALID_MASK 0x03
59837 +
59838 +typedef PREPACK struct {
59839 + A_UINT8 keyIndex;
59840 + A_UINT8 keyType;
59841 + A_UINT8 keyUsage; /* KEY_USAGE */
59842 + A_UINT8 keyLength;
59843 + A_UINT8 keyRSC[8]; /* key replay sequence counter */
59844 + A_UINT8 key[WMI_MAX_KEY_LEN];
59845 + A_UINT8 key_op_ctrl; /* Additional Key Control information */
59846 +} POSTPACK WMI_ADD_CIPHER_KEY_CMD;
59847 +
59848 +/*
59849 + * WMI_DELETE_CIPHER_KEY_CMDID
59850 + */
59851 +typedef PREPACK struct {
59852 + A_UINT8 keyIndex;
59853 +} POSTPACK WMI_DELETE_CIPHER_KEY_CMD;
59854 +
59855 +#define WMI_KRK_LEN 16
59856 +/*
59857 + * WMI_ADD_KRK_CMDID
59858 + */
59859 +typedef PREPACK struct {
59860 + A_UINT8 krk[WMI_KRK_LEN];
59861 +} POSTPACK WMI_ADD_KRK_CMD;
59862 +
59863 +/*
59864 + * WMI_SET_TKIP_COUNTERMEASURES_CMDID
59865 + */
59866 +typedef enum {
59867 + WMI_TKIP_CM_DISABLE = 0x0,
59868 + WMI_TKIP_CM_ENABLE = 0x1,
59869 +} WMI_TKIP_CM_CONTROL;
59870 +
59871 +typedef PREPACK struct {
59872 + A_UINT8 cm_en; /* WMI_TKIP_CM_CONTROL */
59873 +} POSTPACK WMI_SET_TKIP_COUNTERMEASURES_CMD;
59874 +
59875 +/*
59876 + * WMI_SET_PMKID_CMDID
59877 + */
59878 +
59879 +#define WMI_PMKID_LEN 16
59880 +
59881 +typedef enum {
59882 + PMKID_DISABLE = 0,
59883 + PMKID_ENABLE = 1,
59884 +} PMKID_ENABLE_FLG;
59885 +
59886 +typedef PREPACK struct {
59887 + A_UINT8 bssid[ATH_MAC_LEN];
59888 + A_UINT8 enable; /* PMKID_ENABLE_FLG */
59889 + A_UINT8 pmkid[WMI_PMKID_LEN];
59890 +} POSTPACK WMI_SET_PMKID_CMD;
59891 +
59892 +/*
59893 + * WMI_START_SCAN_CMD
59894 + */
59895 +typedef enum {
59896 + WMI_LONG_SCAN = 0,
59897 + WMI_SHORT_SCAN = 1,
59898 +} WMI_SCAN_TYPE;
59899 +
59900 +typedef PREPACK struct {
59901 + A_BOOL forceFgScan;
59902 + A_BOOL isLegacy; /* For Legacy Cisco AP compatibility */
59903 + A_UINT32 homeDwellTime; /* Maximum duration in the home channel(milliseconds) */
59904 + A_UINT32 forceScanInterval; /* Time interval between scans (milliseconds)*/
59905 + A_UINT8 scanType; /* WMI_SCAN_TYPE */
59906 +} POSTPACK WMI_START_SCAN_CMD;
59907 +
59908 +/*
59909 + * WMI_SET_SCAN_PARAMS_CMDID
59910 + */
59911 +#define WMI_SHORTSCANRATIO_DEFAULT 3
59912 +typedef enum {
59913 + CONNECT_SCAN_CTRL_FLAGS = 0x01, /* set if can scan in the Connect cmd */
59914 + SCAN_CONNECTED_CTRL_FLAGS = 0x02, /* set if scan for the SSID it is */
59915 + /* already connected to */
59916 + ACTIVE_SCAN_CTRL_FLAGS = 0x04, /* set if enable active scan */
59917 + ROAM_SCAN_CTRL_FLAGS = 0x08, /* set if enable roam scan when bmiss and lowrssi */
59918 + REPORT_BSSINFO_CTRL_FLAGS = 0x10, /* set if follows customer BSSINFO reporting rule */
59919 + ENABLE_AUTO_CTRL_FLAGS = 0x20, /* if disabled, target doesn't
59920 + scan after a disconnect event */
59921 + ENABLE_SCAN_ABORT_EVENT = 0x40 /* Scan complete event with canceled status will be generated when a scan is prempted before it gets completed */
59922 +
59923 +} WMI_SCAN_CTRL_FLAGS_BITS;
59924 +
59925 +#define CAN_SCAN_IN_CONNECT(flags) (flags & CONNECT_SCAN_CTRL_FLAGS)
59926 +#define CAN_SCAN_CONNECTED(flags) (flags & SCAN_CONNECTED_CTRL_FLAGS)
59927 +#define ENABLE_ACTIVE_SCAN(flags) (flags & ACTIVE_SCAN_CTRL_FLAGS)
59928 +#define ENABLE_ROAM_SCAN(flags) (flags & ROAM_SCAN_CTRL_FLAGS)
59929 +#define CONFIG_REPORT_BSSINFO(flags) (flags & REPORT_BSSINFO_CTRL_FLAGS)
59930 +#define IS_AUTO_SCAN_ENABLED(flags) (flags & ENABLE_AUTO_CTRL_FLAGS)
59931 +#define SCAN_ABORT_EVENT_ENABLED(flags) (flags & ENABLE_SCAN_ABORT_EVENT)
59932 +
59933 +#define DEFAULT_SCAN_CTRL_FLAGS (CONNECT_SCAN_CTRL_FLAGS| SCAN_CONNECTED_CTRL_FLAGS| ACTIVE_SCAN_CTRL_FLAGS| ROAM_SCAN_CTRL_FLAGS | ENABLE_AUTO_CTRL_FLAGS)
59934 +
59935 +
59936 +typedef PREPACK struct {
59937 + A_UINT16 fg_start_period; /* seconds */
59938 + A_UINT16 fg_end_period; /* seconds */
59939 + A_UINT16 bg_period; /* seconds */
59940 + A_UINT16 maxact_chdwell_time; /* msec */
59941 + A_UINT16 pas_chdwell_time; /* msec */
59942 + A_UINT8 shortScanRatio; /* how many shorts scan for one long */
59943 + A_UINT8 scanCtrlFlags;
59944 + A_UINT16 minact_chdwell_time; /* msec */
59945 + A_UINT32 max_dfsch_act_time; /* msecs */
59946 +} POSTPACK WMI_SCAN_PARAMS_CMD;
59947 +
59948 +/*
59949 + * WMI_SET_BSS_FILTER_CMDID
59950 + */
59951 +typedef enum {
59952 + NONE_BSS_FILTER = 0x0, /* no beacons forwarded */
59953 + ALL_BSS_FILTER, /* all beacons forwarded */
59954 + PROFILE_FILTER, /* only beacons matching profile */
59955 + ALL_BUT_PROFILE_FILTER, /* all but beacons matching profile */
59956 + CURRENT_BSS_FILTER, /* only beacons matching current BSS */
59957 + ALL_BUT_BSS_FILTER, /* all but beacons matching BSS */
59958 + PROBED_SSID_FILTER, /* beacons matching probed ssid */
59959 + LAST_BSS_FILTER, /* marker only */
59960 +} WMI_BSS_FILTER;
59961 +
59962 +typedef PREPACK struct {
59963 + A_UINT8 bssFilter; /* see WMI_BSS_FILTER */
59964 + A_UINT32 ieMask;
59965 +} POSTPACK WMI_BSS_FILTER_CMD;
59966 +
59967 +/*
59968 + * WMI_SET_PROBED_SSID_CMDID
59969 + */
59970 +#define MAX_PROBED_SSID_INDEX 5
59971 +
59972 +typedef enum {
59973 + DISABLE_SSID_FLAG = 0, /* disables entry */
59974 + SPECIFIC_SSID_FLAG = 0x01, /* probes specified ssid */
59975 + ANY_SSID_FLAG = 0x02, /* probes for any ssid */
59976 +} WMI_SSID_FLAG;
59977 +
59978 +typedef PREPACK struct {
59979 + A_UINT8 entryIndex; /* 0 to MAX_PROBED_SSID_INDEX */
59980 + A_UINT8 flag; /* WMI_SSID_FLG */
59981 + A_UINT8 ssidLength;
59982 + A_UINT8 ssid[32];
59983 +} POSTPACK WMI_PROBED_SSID_CMD;
59984 +
59985 +/*
59986 + * WMI_SET_LISTEN_INT_CMDID
59987 + * The Listen interval is between 15 and 3000 TUs
59988 + */
59989 +#define MIN_LISTEN_INTERVAL 15
59990 +#define MAX_LISTEN_INTERVAL 5000
59991 +#define MIN_LISTEN_BEACONS 1
59992 +#define MAX_LISTEN_BEACONS 50
59993 +
59994 +typedef PREPACK struct {
59995 + A_UINT16 listenInterval;
59996 + A_UINT16 numBeacons;
59997 +} POSTPACK WMI_LISTEN_INT_CMD;
59998 +
59999 +/*
60000 + * WMI_SET_BEACON_INT_CMDID
60001 + */
60002 +typedef PREPACK struct {
60003 + A_UINT16 beaconInterval;
60004 +} POSTPACK WMI_BEACON_INT_CMD;
60005 +
60006 +/*
60007 + * WMI_SET_BMISS_TIME_CMDID
60008 + * valid values are between 1000 and 5000 TUs
60009 + */
60010 +
60011 +#define MIN_BMISS_TIME 1000
60012 +#define MAX_BMISS_TIME 5000
60013 +#define MIN_BMISS_BEACONS 1
60014 +#define MAX_BMISS_BEACONS 50
60015 +
60016 +typedef PREPACK struct {
60017 + A_UINT16 bmissTime;
60018 + A_UINT16 numBeacons;
60019 +} POSTPACK WMI_BMISS_TIME_CMD;
60020 +
60021 +/*
60022 + * WMI_SET_POWER_MODE_CMDID
60023 + */
60024 +typedef enum {
60025 + REC_POWER = 0x01,
60026 + MAX_PERF_POWER,
60027 +} WMI_POWER_MODE;
60028 +
60029 +typedef PREPACK struct {
60030 + A_UINT8 powerMode; /* WMI_POWER_MODE */
60031 +} POSTPACK WMI_POWER_MODE_CMD;
60032 +
60033 +/*
60034 + * WMI_SET_POWER_PARAMS_CMDID
60035 + */
60036 +typedef enum {
60037 + IGNORE_DTIM = 0x01,
60038 + NORMAL_DTIM = 0x02,
60039 + STICK_DTIM = 0x03,
60040 +} WMI_DTIM_POLICY;
60041 +
60042 +typedef PREPACK struct {
60043 + A_UINT16 idle_period; /* msec */
60044 + A_UINT16 pspoll_number;
60045 + A_UINT16 dtim_policy;
60046 +} POSTPACK WMI_POWER_PARAMS_CMD;
60047 +
60048 +typedef PREPACK struct {
60049 + A_UINT8 power_saving;
60050 + A_UINT8 ttl; /* number of beacon periods */
60051 + A_UINT16 atim_windows; /* msec */
60052 + A_UINT16 timeout_value; /* msec */
60053 +} POSTPACK WMI_IBSS_PM_CAPS_CMD;
60054 +
60055 +/*
60056 + * WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID
60057 + */
60058 +typedef enum {
60059 + IGNORE_TIM_ALL_QUEUES_APSD = 0,
60060 + PROCESS_TIM_ALL_QUEUES_APSD = 1,
60061 + IGNORE_TIM_SIMULATED_APSD = 2,
60062 + PROCESS_TIM_SIMULATED_APSD = 3,
60063 +} APSD_TIM_POLICY;
60064 +
60065 +typedef PREPACK struct {
60066 + A_UINT16 psPollTimeout; /* msec */
60067 + A_UINT16 triggerTimeout; /* msec */
60068 + A_UINT32 apsdTimPolicy; /* TIM behavior with ques APSD enabled. Default is IGNORE_TIM_ALL_QUEUES_APSD */
60069 + A_UINT32 simulatedAPSDTimPolicy; /* TIM behavior with simulated APSD enabled. Default is PROCESS_TIM_SIMULATED_APSD */
60070 +} POSTPACK WMI_POWERSAVE_TIMERS_POLICY_CMD;
60071 +
60072 +/*
60073 + * WMI_SET_VOICE_PKT_SIZE_CMDID
60074 + */
60075 +typedef PREPACK struct {
60076 + A_UINT16 voicePktSize;
60077 +} POSTPACK WMI_SET_VOICE_PKT_SIZE_CMD;
60078 +
60079 +/*
60080 + * WMI_SET_MAX_SP_LEN_CMDID
60081 + */
60082 +typedef enum {
60083 + DELIVER_ALL_PKT = 0x0,
60084 + DELIVER_2_PKT = 0x1,
60085 + DELIVER_4_PKT = 0x2,
60086 + DELIVER_6_PKT = 0x3,
60087 +} APSD_SP_LEN_TYPE;
60088 +
60089 +typedef PREPACK struct {
60090 + A_UINT8 maxSPLen;
60091 +} POSTPACK WMI_SET_MAX_SP_LEN_CMD;
60092 +
60093 +/*
60094 + * WMI_SET_DISC_TIMEOUT_CMDID
60095 + */
60096 +typedef PREPACK struct {
60097 + A_UINT8 disconnectTimeout; /* seconds */
60098 +} POSTPACK WMI_DISC_TIMEOUT_CMD;
60099 +
60100 +typedef enum {
60101 + UPLINK_TRAFFIC = 0,
60102 + DNLINK_TRAFFIC = 1,
60103 + BIDIR_TRAFFIC = 2,
60104 +} DIR_TYPE;
60105 +
60106 +typedef enum {
60107 + DISABLE_FOR_THIS_AC = 0,
60108 + ENABLE_FOR_THIS_AC = 1,
60109 + ENABLE_FOR_ALL_AC = 2,
60110 +} VOICEPS_CAP_TYPE;
60111 +
60112 +typedef enum {
60113 + TRAFFIC_TYPE_APERIODIC = 0,
60114 + TRAFFIC_TYPE_PERIODIC = 1,
60115 +}TRAFFIC_TYPE;
60116 +
60117 +/*
60118 + * WMI_CREATE_PSTREAM_CMDID
60119 + */
60120 +typedef PREPACK struct {
60121 + A_UINT32 minServiceInt; /* in milli-sec */
60122 + A_UINT32 maxServiceInt; /* in milli-sec */
60123 + A_UINT32 inactivityInt; /* in milli-sec */
60124 + A_UINT32 suspensionInt; /* in milli-sec */
60125 + A_UINT32 serviceStartTime;
60126 + A_UINT32 minDataRate; /* in bps */
60127 + A_UINT32 meanDataRate; /* in bps */
60128 + A_UINT32 peakDataRate; /* in bps */
60129 + A_UINT32 maxBurstSize;
60130 + A_UINT32 delayBound;
60131 + A_UINT32 minPhyRate; /* in bps */
60132 + A_UINT32 sba;
60133 + A_UINT32 mediumTime;
60134 + A_UINT16 nominalMSDU; /* in octects */
60135 + A_UINT16 maxMSDU; /* in octects */
60136 + A_UINT8 trafficClass;
60137 + A_UINT8 trafficType; /* TRAFFIC_TYPE */
60138 + A_UINT8 trafficDirection; /* TRAFFIC_DIR */
60139 + A_UINT8 voicePSCapability; /* VOICEPS_CAP_TYPE */
60140 + A_UINT8 tsid;
60141 + A_UINT8 userPriority; /* 802.1D user priority */
60142 +} POSTPACK WMI_CREATE_PSTREAM_CMD;
60143 +
60144 +/*
60145 + * WMI_DELETE_PSTREAM_CMDID
60146 + */
60147 +typedef PREPACK struct {
60148 + A_UINT8 trafficClass;
60149 + A_UINT8 tsid;
60150 +} POSTPACK WMI_DELETE_PSTREAM_CMD;
60151 +
60152 +/*
60153 + * WMI_SET_CHANNEL_PARAMS_CMDID
60154 + */
60155 +typedef enum {
60156 + WMI_11A_MODE = 0x1,
60157 + WMI_11G_MODE = 0x2,
60158 + WMI_11AG_MODE = 0x3,
60159 + WMI_11B_MODE = 0x4,
60160 + WMI_11GONLY_MODE = 0x5,
60161 +} WMI_PHY_MODE;
60162 +
60163 +#define WMI_MAX_CHANNELS 32
60164 +
60165 +typedef PREPACK struct {
60166 + A_UINT8 reserved1;
60167 + A_UINT8 scanParam; /* set if enable scan */
60168 + A_UINT8 phyMode; /* see WMI_PHY_MODE */
60169 + A_UINT8 numChannels; /* how many channels follow */
60170 + A_UINT16 channelList[1]; /* channels in Mhz */
60171 +} POSTPACK WMI_CHANNEL_PARAMS_CMD;
60172 +
60173 +
60174 +/*
60175 + * WMI_RSSI_THRESHOLD_PARAMS_CMDID
60176 + * Setting the polltime to 0 would disable polling.
60177 + * Threshold values are in the ascending order, and should agree to:
60178 + * (lowThreshold_lowerVal < lowThreshold_upperVal < highThreshold_lowerVal
60179 + * < highThreshold_upperVal)
60180 + */
60181 +
60182 +typedef PREPACK struct WMI_RSSI_THRESHOLD_PARAMS{
60183 + A_UINT32 pollTime; /* Polling time as a factor of LI */
60184 + A_INT16 thresholdAbove1_Val; /* lowest of upper */
60185 + A_INT16 thresholdAbove2_Val;
60186 + A_INT16 thresholdAbove3_Val;
60187 + A_INT16 thresholdAbove4_Val;
60188 + A_INT16 thresholdAbove5_Val;
60189 + A_INT16 thresholdAbove6_Val; /* highest of upper */
60190 + A_INT16 thresholdBelow1_Val; /* lowest of bellow */
60191 + A_INT16 thresholdBelow2_Val;
60192 + A_INT16 thresholdBelow3_Val;
60193 + A_INT16 thresholdBelow4_Val;
60194 + A_INT16 thresholdBelow5_Val;
60195 + A_INT16 thresholdBelow6_Val; /* highest of bellow */
60196 + A_UINT8 weight; /* "alpha" */
60197 + A_UINT8 reserved[3];
60198 +} POSTPACK WMI_RSSI_THRESHOLD_PARAMS_CMD;
60199 +
60200 +/*
60201 + * WMI_SNR_THRESHOLD_PARAMS_CMDID
60202 + * Setting the polltime to 0 would disable polling.
60203 + */
60204 +
60205 +typedef PREPACK struct WMI_SNR_THRESHOLD_PARAMS{
60206 + A_UINT32 pollTime; /* Polling time as a factor of LI */
60207 + A_UINT8 weight; /* "alpha" */
60208 + A_UINT8 thresholdAbove1_Val; /* lowest of uppper*/
60209 + A_UINT8 thresholdAbove2_Val;
60210 + A_UINT8 thresholdAbove3_Val;
60211 + A_UINT8 thresholdAbove4_Val; /* highest of upper */
60212 + A_UINT8 thresholdBelow1_Val; /* lowest of bellow */
60213 + A_UINT8 thresholdBelow2_Val;
60214 + A_UINT8 thresholdBelow3_Val;
60215 + A_UINT8 thresholdBelow4_Val; /* highest of bellow */
60216 + A_UINT8 reserved[3];
60217 +} POSTPACK WMI_SNR_THRESHOLD_PARAMS_CMD;
60218 +
60219 +/*
60220 + * WMI_LQ_THRESHOLD_PARAMS_CMDID
60221 + */
60222 +typedef PREPACK struct WMI_LQ_THRESHOLD_PARAMS {
60223 + A_UINT8 enable;
60224 + A_UINT8 thresholdAbove1_Val;
60225 + A_UINT8 thresholdAbove2_Val;
60226 + A_UINT8 thresholdAbove3_Val;
60227 + A_UINT8 thresholdAbove4_Val;
60228 + A_UINT8 thresholdBelow1_Val;
60229 + A_UINT8 thresholdBelow2_Val;
60230 + A_UINT8 thresholdBelow3_Val;
60231 + A_UINT8 thresholdBelow4_Val;
60232 + A_UINT8 reserved[3];
60233 +} POSTPACK WMI_LQ_THRESHOLD_PARAMS_CMD;
60234 +
60235 +typedef enum {
60236 + WMI_LPREAMBLE_DISABLED = 0,
60237 + WMI_LPREAMBLE_ENABLED
60238 +} WMI_LPREAMBLE_STATUS;
60239 +
60240 +typedef PREPACK struct {
60241 + A_UINT8 status;
60242 +}POSTPACK WMI_SET_LPREAMBLE_CMD;
60243 +
60244 +typedef PREPACK struct {
60245 + A_UINT16 threshold;
60246 +}POSTPACK WMI_SET_RTS_CMD;
60247 +
60248 +/*
60249 + * WMI_TARGET_ERROR_REPORT_BITMASK_CMDID
60250 + * Sets the error reporting event bitmask in target. Target clears it
60251 + * upon an error. Subsequent errors are counted, but not reported
60252 + * via event, unless the bitmask is set again.
60253 + */
60254 +typedef PREPACK struct {
60255 + A_UINT32 bitmask;
60256 +} POSTPACK WMI_TARGET_ERROR_REPORT_BITMASK;
60257 +
60258 +/*
60259 + * WMI_SET_TX_PWR_CMDID
60260 + */
60261 +typedef PREPACK struct {
60262 + A_UINT8 dbM; /* in dbM units */
60263 +} POSTPACK WMI_SET_TX_PWR_CMD, WMI_TX_PWR_REPLY;
60264 +
60265 +/*
60266 + * WMI_SET_ASSOC_INFO_CMDID
60267 + *
60268 + * A maximum of 2 private IEs can be sent in the [Re]Assoc request.
60269 + * A 3rd one, the CCX version IE can also be set from the host.
60270 + */
60271 +#define WMI_MAX_ASSOC_INFO_TYPE 2
60272 +#define WMI_CCX_VER_IE 2 /* ieType to set CCX Version IE */
60273 +
60274 +#define WMI_MAX_ASSOC_INFO_LEN 240
60275 +
60276 +typedef PREPACK struct {
60277 + A_UINT8 ieType;
60278 + A_UINT8 bufferSize;
60279 + A_UINT8 assocInfo[1]; /* up to WMI_MAX_ASSOC_INFO_LEN */
60280 +} POSTPACK WMI_SET_ASSOC_INFO_CMD;
60281 +
60282 +
60283 +/*
60284 + * WMI_GET_TX_PWR_CMDID does not take any parameters
60285 + */
60286 +
60287 +/*
60288 + * WMI_ADD_BAD_AP_CMDID
60289 + */
60290 +#define WMI_MAX_BAD_AP_INDEX 1
60291 +
60292 +typedef PREPACK struct {
60293 + A_UINT8 badApIndex; /* 0 to WMI_MAX_BAD_AP_INDEX */
60294 + A_UINT8 bssid[ATH_MAC_LEN];
60295 +} POSTPACK WMI_ADD_BAD_AP_CMD;
60296 +
60297 +/*
60298 + * WMI_DELETE_BAD_AP_CMDID
60299 + */
60300 +typedef PREPACK struct {
60301 + A_UINT8 badApIndex; /* 0 to WMI_MAX_BAD_AP_INDEX */
60302 +} POSTPACK WMI_DELETE_BAD_AP_CMD;
60303 +
60304 +/*
60305 + * WMI_SET_ACCESS_PARAMS_CMDID
60306 + */
60307 +#define WMI_DEFAULT_TXOP_ACPARAM 0 /* implies one MSDU */
60308 +#define WMI_DEFAULT_ECWMIN_ACPARAM 4 /* corresponds to CWmin of 15 */
60309 +#define WMI_DEFAULT_ECWMAX_ACPARAM 10 /* corresponds to CWmax of 1023 */
60310 +#define WMI_MAX_CW_ACPARAM 15 /* maximum eCWmin or eCWmax */
60311 +#define WMI_DEFAULT_AIFSN_ACPARAM 2
60312 +#define WMI_MAX_AIFSN_ACPARAM 15
60313 +typedef PREPACK struct {
60314 + A_UINT16 txop; /* in units of 32 usec */
60315 + A_UINT8 eCWmin;
60316 + A_UINT8 eCWmax;
60317 + A_UINT8 aifsn;
60318 +} POSTPACK WMI_SET_ACCESS_PARAMS_CMD;
60319 +
60320 +
60321 +/*
60322 + * WMI_SET_RETRY_LIMITS_CMDID
60323 + *
60324 + * This command is used to customize the number of retries the
60325 + * wlan device will perform on a given frame.
60326 + */
60327 +#define WMI_MIN_RETRIES 2
60328 +#define WMI_MAX_RETRIES 13
60329 +typedef enum {
60330 + MGMT_FRAMETYPE = 0,
60331 + CONTROL_FRAMETYPE = 1,
60332 + DATA_FRAMETYPE = 2
60333 +} WMI_FRAMETYPE;
60334 +
60335 +typedef PREPACK struct {
60336 + A_UINT8 frameType; /* WMI_FRAMETYPE */
60337 + A_UINT8 trafficClass; /* applies only to DATA_FRAMETYPE */
60338 + A_UINT8 maxRetries;
60339 + A_UINT8 enableNotify;
60340 +} POSTPACK WMI_SET_RETRY_LIMITS_CMD;
60341 +
60342 +/*
60343 + * WMI_SET_ROAM_CTRL_CMDID
60344 + *
60345 + * This command is used to influence the Roaming behaviour
60346 + * Set the host biases of the BSSs before setting the roam mode as bias
60347 + * based.
60348 + */
60349 +
60350 +/*
60351 + * Different types of Roam Control
60352 + */
60353 +
60354 +typedef enum {
60355 + WMI_FORCE_ROAM = 1, /* Roam to the specified BSSID */
60356 + WMI_SET_ROAM_MODE = 2, /* default ,progd bias, no roam */
60357 + WMI_SET_HOST_BIAS = 3, /* Set the Host Bias */
60358 + WMI_SET_LOWRSSI_SCAN_PARAMS = 4, /* Set lowrssi Scan parameters */
60359 +} WMI_ROAM_CTRL_TYPE;
60360 +
60361 +#define WMI_MIN_ROAM_CTRL_TYPE WMI_FORCE_ROAM
60362 +#define WMI_MAX_ROAM_CTRL_TYPE WMI_SET_LOWRSSI_SCAN_PARAMS
60363 +
60364 +/*
60365 + * ROAM MODES
60366 + */
60367 +
60368 +typedef enum {
60369 + WMI_DEFAULT_ROAM_MODE = 1, /* RSSI based ROAM */
60370 + WMI_HOST_BIAS_ROAM_MODE = 2, /* HOST BIAS based ROAM */
60371 + WMI_LOCK_BSS_MODE = 3 /* Lock to the Current BSS - no Roam */
60372 +} WMI_ROAM_MODE;
60373 +
60374 +/*
60375 + * BSS HOST BIAS INFO
60376 + */
60377 +
60378 +typedef PREPACK struct {
60379 + A_UINT8 bssid[ATH_MAC_LEN];
60380 + A_INT8 bias;
60381 +} POSTPACK WMI_BSS_BIAS;
60382 +
60383 +typedef PREPACK struct {
60384 + A_UINT8 numBss;
60385 + WMI_BSS_BIAS bssBias[1];
60386 +} POSTPACK WMI_BSS_BIAS_INFO;
60387 +
60388 +typedef PREPACK struct WMI_LOWRSSI_SCAN_PARAMS {
60389 + A_UINT16 lowrssi_scan_period;
60390 + A_INT16 lowrssi_scan_threshold;
60391 + A_INT16 lowrssi_roam_threshold;
60392 + A_UINT8 roam_rssi_floor;
60393 + A_UINT8 reserved[1]; /* For alignment */
60394 +} POSTPACK WMI_LOWRSSI_SCAN_PARAMS;
60395 +
60396 +typedef PREPACK struct {
60397 + PREPACK union {
60398 + A_UINT8 bssid[ATH_MAC_LEN]; /* WMI_FORCE_ROAM */
60399 + A_UINT8 roamMode; /* WMI_SET_ROAM_MODE */
60400 + WMI_BSS_BIAS_INFO bssBiasInfo; /* WMI_SET_HOST_BIAS */
60401 + WMI_LOWRSSI_SCAN_PARAMS lrScanParams;
60402 + } POSTPACK info;
60403 + A_UINT8 roamCtrlType ;
60404 +} POSTPACK WMI_SET_ROAM_CTRL_CMD;
60405 +
60406 +/*
60407 + * WMI_ENABLE_RM_CMDID
60408 + */
60409 +typedef PREPACK struct {
60410 + A_BOOL enable_radio_measurements;
60411 +} POSTPACK WMI_ENABLE_RM_CMD;
60412 +
60413 +/*
60414 + * WMI_SET_MAX_OFFHOME_DURATION_CMDID
60415 + */
60416 +typedef PREPACK struct {
60417 + A_UINT8 max_offhome_duration;
60418 +} POSTPACK WMI_SET_MAX_OFFHOME_DURATION_CMD;
60419 +
60420 +typedef PREPACK struct {
60421 + A_UINT32 frequency;
60422 + A_UINT8 threshold;
60423 +} POSTPACK WMI_SET_HB_CHALLENGE_RESP_PARAMS_CMD;
60424 +
60425 +typedef enum {
60426 + BT_STREAM_UNDEF = 0,
60427 + BT_STREAM_SCO, /* SCO stream */
60428 + BT_STREAM_A2DP, /* A2DP stream */
60429 + BT_STREAM_MAX
60430 +} BT_STREAM_TYPE;
60431 +
60432 +typedef enum {
60433 + BT_PARAM_SCO = 1, /* SCO stream parameters */
60434 + BT_PARAM_A2DP, /* A2DP stream parameters */
60435 + BT_PARAM_MISC, /* miscellaneous parameters */
60436 + BT_PARAM_REGS, /* co-existence register parameters */
60437 + BT_PARAM_MAX
60438 +} BT_PARAM_TYPE;
60439 +
60440 +typedef enum {
60441 + BT_STATUS_UNDEF = 0,
60442 + BT_STATUS_START,
60443 + BT_STATUS_STOP,
60444 + BT_STATUS_RESUME,
60445 + BT_STATUS_SUSPEND,
60446 + BT_STATUS_MAX
60447 +} BT_STREAM_STATUS;
60448 +
60449 +typedef PREPACK struct {
60450 + A_UINT8 streamType;
60451 + A_UINT8 status;
60452 +} POSTPACK WMI_SET_BT_STATUS_CMD;
60453 +
60454 +typedef PREPACK struct {
60455 + A_UINT8 noSCOPkts;
60456 + A_UINT8 pspollTimeout;
60457 + A_UINT8 stompbt;
60458 +} POSTPACK BT_PARAMS_SCO;
60459 +
60460 +typedef PREPACK struct {
60461 + A_UINT32 period;
60462 + A_UINT32 dutycycle;
60463 + A_UINT8 stompbt;
60464 +} POSTPACK BT_PARAMS_A2DP;
60465 +
60466 +typedef PREPACK struct {
60467 + A_UINT32 mode;
60468 + A_UINT32 scoWghts;
60469 + A_UINT32 a2dpWghts;
60470 + A_UINT32 genWghts;
60471 + A_UINT32 mode2;
60472 + A_UINT8 setVal;
60473 +} POSTPACK BT_COEX_REGS;
60474 +
60475 +typedef enum {
60476 + WLAN_PROTECT_POLICY = 1,
60477 + WLAN_COEX_CTRL_FLAGS
60478 +} BT_PARAMS_MISC_TYPE;
60479 +
60480 +typedef enum {
60481 + WLAN_PROTECT_PER_STREAM = 0x01, /* default */
60482 + WLAN_PROTECT_ANY_TX = 0x02
60483 +} WLAN_PROTECT_FLAGS;
60484 +
60485 +
60486 +#define WLAN_DISABLE_COEX_IN_DISCONNECT 0x01 /* default */
60487 +#define WLAN_KEEP_COEX_IN_DISCONNECT 0x02
60488 +#define WLAN_STOMPBT_IN_DISCONNECT 0x04
60489 +
60490 +#define WLAN_DISABLE_COEX_IN_ROAM 0x10 /* default */
60491 +#define WLAN_KEEP_COEX_IN_ROAM 0x20
60492 +#define WLAN_STOMPBT_IN_ROAM 0x40
60493 +
60494 +#define WLAN_DISABLE_COEX_IN_SCAN 0x100 /* default */
60495 +#define WLAN_KEEP_COEX_IN_SCAN 0x200
60496 +#define WLAN_STOMPBT_IN_SCAN 0x400
60497 +
60498 +#define WLAN_DISABLE_COEX_BT_OFF 0x1000 /* default */
60499 +#define WLAN_KEEP_COEX_BT_OFF 0x2000
60500 +#define WLAN_STOMPBT_BT_OFF 0x4000
60501 +
60502 +typedef PREPACK struct {
60503 + A_UINT32 period;
60504 + A_UINT32 dutycycle;
60505 + A_UINT8 stompbt;
60506 + A_UINT8 policy;
60507 +} POSTPACK WLAN_PROTECT_POLICY_TYPE;
60508 +
60509 +typedef PREPACK struct {
60510 + PREPACK union {
60511 + WLAN_PROTECT_POLICY_TYPE protectParams;
60512 + A_UINT16 wlanCtrlFlags;
60513 + } POSTPACK info;
60514 + A_UINT8 paramType;
60515 +} POSTPACK BT_PARAMS_MISC;
60516 +
60517 +typedef PREPACK struct {
60518 + PREPACK union {
60519 + BT_PARAMS_SCO scoParams;
60520 + BT_PARAMS_A2DP a2dpParams;
60521 + BT_PARAMS_MISC miscParams;
60522 + BT_COEX_REGS regs;
60523 + } POSTPACK info;
60524 + A_UINT8 paramType;
60525 +} POSTPACK WMI_SET_BT_PARAMS_CMD;
60526 +
60527 +/*
60528 + * Command Replies
60529 + */
60530 +
60531 +/*
60532 + * WMI_GET_CHANNEL_LIST_CMDID reply
60533 + */
60534 +typedef PREPACK struct {
60535 + A_UINT8 reserved1;
60536 + A_UINT8 numChannels; /* number of channels in reply */
60537 + A_UINT16 channelList[1]; /* channel in Mhz */
60538 +} POSTPACK WMI_CHANNEL_LIST_REPLY;
60539 +
60540 +typedef enum {
60541 + A_SUCCEEDED = A_OK,
60542 + A_FAILED_DELETE_STREAM_DOESNOT_EXIST=250,
60543 + A_SUCCEEDED_MODIFY_STREAM=251,
60544 + A_FAILED_INVALID_STREAM = 252,
60545 + A_FAILED_MAX_THINSTREAMS = 253,
60546 + A_FAILED_CREATE_REMOVE_PSTREAM_FIRST = 254,
60547 +} PSTREAM_REPLY_STATUS;
60548 +
60549 +/*
60550 + * List of Events (target to host)
60551 + */
60552 +typedef enum {
60553 + WMI_READY_EVENTID = 0x1001,
60554 + WMI_CONNECT_EVENTID,
60555 + WMI_DISCONNECT_EVENTID,
60556 + WMI_BSSINFO_EVENTID,
60557 + WMI_CMDERROR_EVENTID,
60558 + WMI_REGDOMAIN_EVENTID,
60559 + WMI_PSTREAM_TIMEOUT_EVENTID,
60560 + WMI_NEIGHBOR_REPORT_EVENTID,
60561 + WMI_TKIP_MICERR_EVENTID,
60562 + WMI_SCAN_COMPLETE_EVENTID,
60563 + WMI_REPORT_STATISTICS_EVENTID,
60564 + WMI_RSSI_THRESHOLD_EVENTID,
60565 + WMI_ERROR_REPORT_EVENTID,
60566 + WMI_OPT_RX_FRAME_EVENTID,
60567 + WMI_REPORT_ROAM_TBL_EVENTID,
60568 + WMI_EXTENSION_EVENTID,
60569 + WMI_CAC_EVENTID,
60570 + WMI_SNR_THRESHOLD_EVENTID,
60571 + WMI_LQ_THRESHOLD_EVENTID,
60572 + WMI_TX_RETRY_ERR_EVENTID,
60573 + WMI_REPORT_ROAM_DATA_EVENTID,
60574 + WMI_TEST_EVENTID,
60575 + WMI_APLIST_EVENTID,
60576 + WMI_GET_WOW_LIST_EVENTID,
60577 + WMI_GET_PMKID_LIST_EVENTID
60578 +} WMI_EVENT_ID;
60579 +
60580 +typedef enum {
60581 + WMI_11A_CAPABILITY = 1,
60582 + WMI_11G_CAPABILITY = 2,
60583 + WMI_11AG_CAPABILITY = 3,
60584 +} WMI_PHY_CAPABILITY;
60585 +
60586 +typedef PREPACK struct {
60587 + A_UINT8 macaddr[ATH_MAC_LEN];
60588 + A_UINT8 phyCapability; /* WMI_PHY_CAPABILITY */
60589 +} POSTPACK WMI_READY_EVENT;
60590 +
60591 +/*
60592 + * Connect Event
60593 + */
60594 +typedef PREPACK struct {
60595 + A_UINT16 channel;
60596 + A_UINT8 bssid[ATH_MAC_LEN];
60597 + A_UINT16 listenInterval;
60598 + A_UINT16 beaconInterval;
60599 + A_UINT32 networkType;
60600 + A_UINT8 beaconIeLen;
60601 + A_UINT8 assocReqLen;
60602 + A_UINT8 assocRespLen;
60603 + A_UINT8 assocInfo[1];
60604 +} POSTPACK WMI_CONNECT_EVENT;
60605 +
60606 +/*
60607 + * Disconnect Event
60608 + */
60609 +typedef enum {
60610 + NO_NETWORK_AVAIL = 0x01,
60611 + LOST_LINK = 0x02, /* bmiss */
60612 + DISCONNECT_CMD = 0x03,
60613 + BSS_DISCONNECTED = 0x04,
60614 + AUTH_FAILED = 0x05,
60615 + ASSOC_FAILED = 0x06,
60616 + NO_RESOURCES_AVAIL = 0x07,
60617 + CSERV_DISCONNECT = 0x08,
60618 + INVALID_PROFILE = 0x0a,
60619 + DOT11H_CHANNEL_SWITCH = 0x0b,
60620 +} WMI_DISCONNECT_REASON;
60621 +
60622 +typedef PREPACK struct {
60623 + A_UINT16 protocolReasonStatus; /* reason code, see 802.11 spec. */
60624 + A_UINT8 bssid[ATH_MAC_LEN]; /* set if known */
60625 + A_UINT8 disconnectReason ; /* see WMI_DISCONNECT_REASON */
60626 + A_UINT8 assocRespLen;
60627 + A_UINT8 assocInfo[1];
60628 +} POSTPACK WMI_DISCONNECT_EVENT;
60629 +
60630 +/*
60631 + * BSS Info Event.
60632 + * Mechanism used to inform host of the presence and characteristic of
60633 + * wireless networks present. Consists of bss info header followed by
60634 + * the beacon or probe-response frame body. The 802.11 header is not included.
60635 + */
60636 +typedef enum {
60637 + BEACON_FTYPE = 0x1,
60638 + PROBERESP_FTYPE,
60639 + ACTION_MGMT_FTYPE,
60640 +} WMI_BI_FTYPE;
60641 +
60642 +enum {
60643 + BSS_ELEMID_CHANSWITCH = 0x01,
60644 + BSS_ELEMID_ATHEROS = 0x02,
60645 +};
60646 +
60647 +typedef PREPACK struct {
60648 + A_UINT16 channel;
60649 + A_UINT8 frameType; /* see WMI_BI_FTYPE */
60650 + A_UINT8 snr;
60651 + A_INT16 rssi;
60652 + A_UINT8 bssid[ATH_MAC_LEN];
60653 + A_UINT32 ieMask;
60654 +} POSTPACK WMI_BSS_INFO_HDR;
60655 +
60656 +/*
60657 + * Command Error Event
60658 + */
60659 +typedef enum {
60660 + INVALID_PARAM = 0x01,
60661 + ILLEGAL_STATE = 0x02,
60662 + INTERNAL_ERROR = 0x03,
60663 +} WMI_ERROR_CODE;
60664 +
60665 +typedef PREPACK struct {
60666 + A_UINT16 commandId;
60667 + A_UINT8 errorCode;
60668 +} POSTPACK WMI_CMD_ERROR_EVENT;
60669 +
60670 +/*
60671 + * New Regulatory Domain Event
60672 + */
60673 +typedef PREPACK struct {
60674 + A_UINT32 regDomain;
60675 +} POSTPACK WMI_REG_DOMAIN_EVENT;
60676 +
60677 +typedef PREPACK struct {
60678 + A_UINT8 trafficClass;
60679 +} POSTPACK WMI_PSTREAM_TIMEOUT_EVENT;
60680 +
60681 +/*
60682 + * The WMI_NEIGHBOR_REPORT Event is generated by the target to inform
60683 + * the host of BSS's it has found that matches the current profile.
60684 + * It can be used by the host to cache PMKs and/to initiate pre-authentication
60685 + * if the BSS supports it. The first bssid is always the current associated
60686 + * BSS.
60687 + * The bssid and bssFlags information repeats according to the number
60688 + * or APs reported.
60689 + */
60690 +typedef enum {
60691 + WMI_DEFAULT_BSS_FLAGS = 0x00,
60692 + WMI_PREAUTH_CAPABLE_BSS = 0x01,
60693 + WMI_PMKID_VALID_BSS = 0x02,
60694 +} WMI_BSS_FLAGS;
60695 +
60696 +typedef PREPACK struct {
60697 + A_UINT8 bssid[ATH_MAC_LEN];
60698 + A_UINT8 bssFlags; /* see WMI_BSS_FLAGS */
60699 +} POSTPACK WMI_NEIGHBOR_INFO;
60700 +
60701 +typedef PREPACK struct {
60702 + A_INT8 numberOfAps;
60703 + WMI_NEIGHBOR_INFO neighbor[1];
60704 +} POSTPACK WMI_NEIGHBOR_REPORT_EVENT;
60705 +
60706 +/*
60707 + * TKIP MIC Error Event
60708 + */
60709 +typedef PREPACK struct {
60710 + A_UINT8 keyid;
60711 + A_UINT8 ismcast;
60712 +} POSTPACK WMI_TKIP_MICERR_EVENT;
60713 +
60714 +/*
60715 + * WMI_SCAN_COMPLETE_EVENTID - no parameters (old), staus parameter (new)
60716 + */
60717 +typedef PREPACK struct {
60718 + A_STATUS status;
60719 +} POSTPACK WMI_SCAN_COMPLETE_EVENT;
60720 +
60721 +#define MAX_OPT_DATA_LEN 1400
60722 +
60723 +/*
60724 + * WMI_SET_ADHOC_BSSID_CMDID
60725 + */
60726 +typedef PREPACK struct {
60727 + A_UINT8 bssid[ATH_MAC_LEN];
60728 +} POSTPACK WMI_SET_ADHOC_BSSID_CMD;
60729 +
60730 +/*
60731 + * WMI_SET_OPT_MODE_CMDID
60732 + */
60733 +typedef enum {
60734 + SPECIAL_OFF,
60735 + SPECIAL_ON,
60736 +} OPT_MODE_TYPE;
60737 +
60738 +typedef PREPACK struct {
60739 + A_UINT8 optMode;
60740 +} POSTPACK WMI_SET_OPT_MODE_CMD;
60741 +
60742 +/*
60743 + * WMI_TX_OPT_FRAME_CMDID
60744 + */
60745 +typedef enum {
60746 + OPT_PROBE_REQ = 0x01,
60747 + OPT_PROBE_RESP = 0x02,
60748 + OPT_CPPP_START = 0x03,
60749 + OPT_CPPP_STOP = 0x04,
60750 +} WMI_OPT_FTYPE;
60751 +
60752 +typedef PREPACK struct {
60753 + A_UINT16 optIEDataLen;
60754 + A_UINT8 frmType;
60755 + A_UINT8 dstAddr[ATH_MAC_LEN];
60756 + A_UINT8 bssid[ATH_MAC_LEN];
60757 + A_UINT8 reserved; /* For alignment */
60758 + A_UINT8 optIEData[1];
60759 +} POSTPACK WMI_OPT_TX_FRAME_CMD;
60760 +
60761 +/*
60762 + * Special frame receive Event.
60763 + * Mechanism used to inform host of the receiption of the special frames.
60764 + * Consists of special frame info header followed by special frame body.
60765 + * The 802.11 header is not included.
60766 + */
60767 +typedef PREPACK struct {
60768 + A_UINT16 channel;
60769 + A_UINT8 frameType; /* see WMI_OPT_FTYPE */
60770 + A_INT8 snr;
60771 + A_UINT8 srcAddr[ATH_MAC_LEN];
60772 + A_UINT8 bssid[ATH_MAC_LEN];
60773 +} POSTPACK WMI_OPT_RX_INFO_HDR;
60774 +
60775 +/*
60776 + * Reporting statistics.
60777 + */
60778 +typedef PREPACK struct {
60779 + A_UINT32 tx_packets;
60780 + A_UINT32 tx_bytes;
60781 + A_UINT32 tx_unicast_pkts;
60782 + A_UINT32 tx_unicast_bytes;
60783 + A_UINT32 tx_multicast_pkts;
60784 + A_UINT32 tx_multicast_bytes;
60785 + A_UINT32 tx_broadcast_pkts;
60786 + A_UINT32 tx_broadcast_bytes;
60787 + A_UINT32 tx_rts_success_cnt;
60788 + A_UINT32 tx_packet_per_ac[4];
60789 + A_UINT32 tx_errors_per_ac[4];
60790 +
60791 + A_UINT32 tx_errors;
60792 + A_UINT32 tx_failed_cnt;
60793 + A_UINT32 tx_retry_cnt;
60794 + A_UINT32 tx_rts_fail_cnt;
60795 + A_INT32 tx_unicast_rate;
60796 +}POSTPACK tx_stats_t;
60797 +
60798 +typedef PREPACK struct {
60799 + A_UINT32 rx_packets;
60800 + A_UINT32 rx_bytes;
60801 + A_UINT32 rx_unicast_pkts;
60802 + A_UINT32 rx_unicast_bytes;
60803 + A_UINT32 rx_multicast_pkts;
60804 + A_UINT32 rx_multicast_bytes;
60805 + A_UINT32 rx_broadcast_pkts;
60806 + A_UINT32 rx_broadcast_bytes;
60807 + A_UINT32 rx_fragment_pkt;
60808 +
60809 + A_UINT32 rx_errors;
60810 + A_UINT32 rx_crcerr;
60811 + A_UINT32 rx_key_cache_miss;
60812 + A_UINT32 rx_decrypt_err;
60813 + A_UINT32 rx_duplicate_frames;
60814 + A_INT32 rx_unicast_rate;
60815 +}POSTPACK rx_stats_t;
60816 +
60817 +typedef PREPACK struct {
60818 + A_UINT32 tkip_local_mic_failure;
60819 + A_UINT32 tkip_counter_measures_invoked;
60820 + A_UINT32 tkip_replays;
60821 + A_UINT32 tkip_format_errors;
60822 + A_UINT32 ccmp_format_errors;
60823 + A_UINT32 ccmp_replays;
60824 +}POSTPACK tkip_ccmp_stats_t;
60825 +
60826 +typedef PREPACK struct {
60827 + A_UINT32 power_save_failure_cnt;
60828 +}POSTPACK pm_stats_t;
60829 +
60830 +typedef PREPACK struct {
60831 + A_UINT32 cs_bmiss_cnt;
60832 + A_UINT32 cs_lowRssi_cnt;
60833 + A_UINT16 cs_connect_cnt;
60834 + A_UINT16 cs_disconnect_cnt;
60835 + A_INT16 cs_aveBeacon_rssi;
60836 + A_UINT16 cs_roam_count;
60837 + A_UINT16 cs_rssi;
60838 + A_UINT8 cs_snr;
60839 + A_UINT8 cs_aveBeacon_snr;
60840 + A_UINT8 cs_lastRoam_msec;
60841 +} POSTPACK cserv_stats_t;
60842 +
60843 +typedef PREPACK struct {
60844 + tx_stats_t tx_stats;
60845 + rx_stats_t rx_stats;
60846 + tkip_ccmp_stats_t tkipCcmpStats;
60847 +}POSTPACK wlan_net_stats_t;
60848 +
60849 +typedef PREPACK struct {
60850 + A_UINT32 wow_num_pkts_dropped;
60851 + A_UINT16 wow_num_events_discarded;
60852 + A_UINT8 wow_num_host_pkt_wakeups;
60853 + A_UINT8 wow_num_host_event_wakeups;
60854 +} POSTPACK wlan_wow_stats_t;
60855 +
60856 +typedef PREPACK struct {
60857 + A_UINT32 lqVal;
60858 + A_INT32 noise_floor_calibation;
60859 + pm_stats_t pmStats;
60860 + wlan_net_stats_t txrxStats;
60861 + wlan_wow_stats_t wowStats;
60862 + cserv_stats_t cservStats;
60863 +} POSTPACK WMI_TARGET_STATS;
60864 +
60865 +/*
60866 + * WMI_RSSI_THRESHOLD_EVENTID.
60867 + * Indicate the RSSI events to host. Events are indicated when we breach a
60868 + * thresold value.
60869 + */
60870 +typedef enum{
60871 + WMI_RSSI_THRESHOLD1_ABOVE = 0,
60872 + WMI_RSSI_THRESHOLD2_ABOVE,
60873 + WMI_RSSI_THRESHOLD3_ABOVE,
60874 + WMI_RSSI_THRESHOLD4_ABOVE,
60875 + WMI_RSSI_THRESHOLD5_ABOVE,
60876 + WMI_RSSI_THRESHOLD6_ABOVE,
60877 + WMI_RSSI_THRESHOLD1_BELOW,
60878 + WMI_RSSI_THRESHOLD2_BELOW,
60879 + WMI_RSSI_THRESHOLD3_BELOW,
60880 + WMI_RSSI_THRESHOLD4_BELOW,
60881 + WMI_RSSI_THRESHOLD5_BELOW,
60882 + WMI_RSSI_THRESHOLD6_BELOW
60883 +}WMI_RSSI_THRESHOLD_VAL;
60884 +
60885 +typedef PREPACK struct {
60886 + A_INT16 rssi;
60887 + A_UINT8 range;
60888 +}POSTPACK WMI_RSSI_THRESHOLD_EVENT;
60889 +
60890 +/*
60891 + * WMI_ERROR_REPORT_EVENTID
60892 + */
60893 +typedef enum{
60894 + WMI_TARGET_PM_ERR_FAIL = 0x00000001,
60895 + WMI_TARGET_KEY_NOT_FOUND = 0x00000002,
60896 + WMI_TARGET_DECRYPTION_ERR = 0x00000004,
60897 + WMI_TARGET_BMISS = 0x00000008,
60898 + WMI_PSDISABLE_NODE_JOIN = 0x00000010,
60899 + WMI_TARGET_COM_ERR = 0x00000020,
60900 + WMI_TARGET_FATAL_ERR = 0x00000040
60901 +} WMI_TARGET_ERROR_VAL;
60902 +
60903 +typedef PREPACK struct {
60904 + A_UINT32 errorVal;
60905 +}POSTPACK WMI_TARGET_ERROR_REPORT_EVENT;
60906 +
60907 +typedef PREPACK struct {
60908 + A_UINT8 retrys;
60909 +}POSTPACK WMI_TX_RETRY_ERR_EVENT;
60910 +
60911 +typedef enum{
60912 + WMI_SNR_THRESHOLD1_ABOVE = 1,
60913 + WMI_SNR_THRESHOLD1_BELOW,
60914 + WMI_SNR_THRESHOLD2_ABOVE,
60915 + WMI_SNR_THRESHOLD2_BELOW,
60916 + WMI_SNR_THRESHOLD3_ABOVE,
60917 + WMI_SNR_THRESHOLD3_BELOW,
60918 + WMI_SNR_THRESHOLD4_ABOVE,
60919 + WMI_SNR_THRESHOLD4_BELOW
60920 +} WMI_SNR_THRESHOLD_VAL;
60921 +
60922 +typedef PREPACK struct {
60923 + A_UINT8 range; /* WMI_SNR_THRESHOLD_VAL */
60924 + A_UINT8 snr;
60925 +}POSTPACK WMI_SNR_THRESHOLD_EVENT;
60926 +
60927 +typedef enum{
60928 + WMI_LQ_THRESHOLD1_ABOVE = 1,
60929 + WMI_LQ_THRESHOLD1_BELOW,
60930 + WMI_LQ_THRESHOLD2_ABOVE,
60931 + WMI_LQ_THRESHOLD2_BELOW,
60932 + WMI_LQ_THRESHOLD3_ABOVE,
60933 + WMI_LQ_THRESHOLD3_BELOW,
60934 + WMI_LQ_THRESHOLD4_ABOVE,
60935 + WMI_LQ_THRESHOLD4_BELOW
60936 +} WMI_LQ_THRESHOLD_VAL;
60937 +
60938 +typedef PREPACK struct {
60939 + A_INT32 lq;
60940 + A_UINT8 range; /* WMI_LQ_THRESHOLD_VAL */
60941 +}POSTPACK WMI_LQ_THRESHOLD_EVENT;
60942 +/*
60943 + * WMI_REPORT_ROAM_TBL_EVENTID
60944 + */
60945 +#define MAX_ROAM_TBL_CAND 5
60946 +
60947 +typedef PREPACK struct {
60948 + A_INT32 roam_util;
60949 + A_UINT8 bssid[ATH_MAC_LEN];
60950 + A_INT8 rssi;
60951 + A_INT8 rssidt;
60952 + A_INT8 last_rssi;
60953 + A_INT8 util;
60954 + A_INT8 bias;
60955 + A_UINT8 reserved; /* For alignment */
60956 +} POSTPACK WMI_BSS_ROAM_INFO;
60957 +
60958 +
60959 +typedef PREPACK struct {
60960 + A_UINT16 roamMode;
60961 + A_UINT16 numEntries;
60962 + WMI_BSS_ROAM_INFO bssRoamInfo[1];
60963 +} POSTPACK WMI_TARGET_ROAM_TBL;
60964 +
60965 +/*
60966 + * WMI_CAC_EVENTID
60967 + */
60968 +typedef enum {
60969 + CAC_INDICATION_ADMISSION = 0x00,
60970 + CAC_INDICATION_ADMISSION_RESP = 0x01,
60971 + CAC_INDICATION_DELETE = 0x02,
60972 + CAC_INDICATION_NO_RESP = 0x03,
60973 +}CAC_INDICATION;
60974 +
60975 +#define WMM_TSPEC_IE_LEN 63
60976 +
60977 +typedef PREPACK struct {
60978 + A_UINT8 ac;
60979 + A_UINT8 cac_indication;
60980 + A_UINT8 statusCode;
60981 + A_UINT8 tspecSuggestion[WMM_TSPEC_IE_LEN];
60982 +}POSTPACK WMI_CAC_EVENT;
60983 +
60984 +/*
60985 + * WMI_APLIST_EVENTID
60986 + */
60987 +
60988 +typedef enum {
60989 + APLIST_VER1 = 1,
60990 +} APLIST_VER;
60991 +
60992 +typedef PREPACK struct {
60993 + A_UINT8 bssid[ATH_MAC_LEN];
60994 + A_UINT16 channel;
60995 +} POSTPACK WMI_AP_INFO_V1;
60996 +
60997 +typedef PREPACK union {
60998 + WMI_AP_INFO_V1 apInfoV1;
60999 +} POSTPACK WMI_AP_INFO;
61000 +
61001 +typedef PREPACK struct {
61002 + A_UINT8 apListVer;
61003 + A_UINT8 numAP;
61004 + WMI_AP_INFO apList[1];
61005 +} POSTPACK WMI_APLIST_EVENT;
61006 +
61007 +/*
61008 + * developer commands
61009 + */
61010 +
61011 +/*
61012 + * WMI_SET_BITRATE_CMDID
61013 + *
61014 + * Get bit rate cmd uses same definition as set bit rate cmd
61015 + */
61016 +typedef enum {
61017 + RATE_AUTO = -1,
61018 + RATE_1Mb = 0,
61019 + RATE_2Mb = 1,
61020 + RATE_5_5Mb = 2,
61021 + RATE_11Mb = 3,
61022 + RATE_6Mb = 4,
61023 + RATE_9Mb = 5,
61024 + RATE_12Mb = 6,
61025 + RATE_18Mb = 7,
61026 + RATE_24Mb = 8,
61027 + RATE_36Mb = 9,
61028 + RATE_48Mb = 10,
61029 + RATE_54Mb = 11,
61030 +} WMI_BIT_RATE;
61031 +
61032 +typedef PREPACK struct {
61033 + A_INT8 rateIndex; /* see WMI_BIT_RATE */
61034 +} POSTPACK WMI_BIT_RATE_CMD, WMI_BIT_RATE_REPLY;
61035 +
61036 +/*
61037 + * WMI_SET_FIXRATES_CMDID
61038 + *
61039 + * Get fix rates cmd uses same definition as set fix rates cmd
61040 + */
61041 +typedef enum {
61042 + FIX_RATE_1Mb = 0x1,
61043 + FIX_RATE_2Mb = 0x2,
61044 + FIX_RATE_5_5Mb = 0x4,
61045 + FIX_RATE_11Mb = 0x8,
61046 + FIX_RATE_6Mb = 0x10,
61047 + FIX_RATE_9Mb = 0x20,
61048 + FIX_RATE_12Mb = 0x40,
61049 + FIX_RATE_18Mb = 0x80,
61050 + FIX_RATE_24Mb = 0x100,
61051 + FIX_RATE_36Mb = 0x200,
61052 + FIX_RATE_48Mb = 0x400,
61053 + FIX_RATE_54Mb = 0x800,
61054 +} WMI_FIX_RATES_MASK;
61055 +
61056 +typedef PREPACK struct {
61057 + A_UINT16 fixRateMask; /* see WMI_BIT_RATE */
61058 +} POSTPACK WMI_FIX_RATES_CMD, WMI_FIX_RATES_REPLY;
61059 +
61060 +/*
61061 + * WMI_SET_RECONNECT_AUTH_MODE_CMDID
61062 + *
61063 + * Set authentication mode
61064 + */
61065 +typedef enum {
61066 + RECONN_DO_AUTH = 0x00,
61067 + RECONN_NOT_AUTH = 0x01
61068 +} WMI_AUTH_MODE;
61069 +
61070 +typedef PREPACK struct {
61071 + A_UINT8 mode;
61072 +} POSTPACK WMI_SET_AUTH_MODE_CMD;
61073 +
61074 +/*
61075 + * WMI_SET_REASSOC_MODE_CMDID
61076 + *
61077 + * Set authentication mode
61078 + */
61079 +typedef enum {
61080 + REASSOC_DO_DISASSOC = 0x00,
61081 + REASSOC_DONOT_DISASSOC = 0x01
61082 +} WMI_REASSOC_MODE;
61083 +
61084 +typedef PREPACK struct {
61085 + A_UINT8 mode;
61086 +}POSTPACK WMI_SET_REASSOC_MODE_CMD;
61087 +
61088 +typedef enum {
61089 + ROAM_DATA_TIME = 1, /* Get The Roam Time Data */
61090 +} ROAM_DATA_TYPE;
61091 +
61092 +typedef PREPACK struct {
61093 + A_UINT32 disassoc_time;
61094 + A_UINT32 no_txrx_time;
61095 + A_UINT32 assoc_time;
61096 + A_UINT32 allow_txrx_time;
61097 + A_UINT32 last_data_txrx_time;
61098 + A_UINT32 first_data_txrx_time;
61099 + A_UINT8 disassoc_bssid[ATH_MAC_LEN];
61100 + A_INT8 disassoc_bss_rssi;
61101 + A_UINT8 assoc_bssid[ATH_MAC_LEN];
61102 + A_INT8 assoc_bss_rssi;
61103 +} POSTPACK WMI_TARGET_ROAM_TIME;
61104 +
61105 +typedef PREPACK struct {
61106 + PREPACK union {
61107 + WMI_TARGET_ROAM_TIME roamTime;
61108 + } POSTPACK u;
61109 + A_UINT8 roamDataType ;
61110 +} POSTPACK WMI_TARGET_ROAM_DATA;
61111 +
61112 +typedef enum {
61113 + WMI_WMM_DISABLED = 0,
61114 + WMI_WMM_ENABLED
61115 +} WMI_WMM_STATUS;
61116 +
61117 +typedef PREPACK struct {
61118 + A_UINT8 status;
61119 +}POSTPACK WMI_SET_WMM_CMD;
61120 +
61121 +typedef enum {
61122 + WMI_TXOP_DISABLED = 0,
61123 + WMI_TXOP_ENABLED
61124 +} WMI_TXOP_CFG;
61125 +
61126 +typedef PREPACK struct {
61127 + A_UINT8 txopEnable;
61128 +}POSTPACK WMI_SET_WMM_TXOP_CMD;
61129 +
61130 +typedef PREPACK struct {
61131 + A_UINT8 keepaliveInterval;
61132 +} POSTPACK WMI_SET_KEEPALIVE_CMD;
61133 +
61134 +typedef PREPACK struct {
61135 + A_BOOL configured;
61136 + A_UINT8 keepaliveInterval;
61137 +} POSTPACK WMI_GET_KEEPALIVE_CMD;
61138 +
61139 +/*
61140 + * Add Application specified IE to a management frame
61141 + */
61142 +#define WMI_MAX_IE_LEN 78
61143 +
61144 +typedef PREPACK struct {
61145 + A_UINT8 mgmtFrmType; /* one of WMI_MGMT_FRAME_TYPE */
61146 + A_UINT8 ieLen; /* Length of the IE that should be added to the MGMT frame */
61147 + A_UINT8 ieInfo[1];
61148 +} POSTPACK WMI_SET_APPIE_CMD;
61149 +
61150 +/*
61151 + * Notify the WSC registration status to the target
61152 + */
61153 +#define WSC_REG_ACTIVE 1
61154 +#define WSC_REG_INACTIVE 0
61155 +/* Generic Hal Interface for setting hal paramters. */
61156 +/* Add new Set HAL Param cmdIds here for newer params */
61157 +typedef enum {
61158 + WHAL_SETCABTO_CMDID = 1,
61159 +}WHAL_CMDID;
61160 +
61161 +typedef PREPACK struct {
61162 + A_UINT8 cabTimeOut;
61163 +} POSTPACK WHAL_SETCABTO_PARAM;
61164 +
61165 +typedef PREPACK struct {
61166 + A_UINT8 whalCmdId;
61167 + A_UINT8 data[1];
61168 +} POSTPACK WHAL_PARAMCMD;
61169 +
61170 +
61171 +#define WOW_MAX_FILTER_LISTS 1 /*4*/
61172 +#define WOW_MAX_FILTERS_PER_LIST 4
61173 +#define WOW_PATTERN_SIZE 64
61174 +#define WOW_MASK_SIZE 64
61175 +
61176 +typedef PREPACK struct {
61177 + A_UINT8 wow_valid_filter;
61178 + A_UINT8 wow_filter_id;
61179 + A_UINT8 wow_filter_size;
61180 + A_UINT8 wow_filter_offset;
61181 + A_UINT8 wow_filter_mask[WOW_MASK_SIZE];
61182 + A_UINT8 wow_filter_pattern[WOW_PATTERN_SIZE];
61183 +} POSTPACK WOW_FILTER;
61184 +
61185 +
61186 +typedef PREPACK struct {
61187 + A_UINT8 wow_valid_list;
61188 + A_UINT8 wow_list_id;
61189 + A_UINT8 wow_num_filters;
61190 + A_UINT8 wow_total_list_size;
61191 + WOW_FILTER list[WOW_MAX_FILTERS_PER_LIST];
61192 +} POSTPACK WOW_FILTER_LIST;
61193 +
61194 +typedef PREPACK struct {
61195 + A_BOOL awake;
61196 + A_BOOL asleep;
61197 +} POSTPACK WMI_SET_HOST_SLEEP_MODE_CMD;
61198 +
61199 +typedef PREPACK struct {
61200 + A_BOOL enable_wow;
61201 +} POSTPACK WMI_SET_WOW_MODE_CMD;
61202 +
61203 +typedef PREPACK struct {
61204 + A_UINT8 filter_list_id;
61205 +} POSTPACK WMI_GET_WOW_LIST_CMD;
61206 +
61207 +/*
61208 + * WMI_GET_WOW_LIST_CMD reply
61209 + */
61210 +typedef PREPACK struct {
61211 + A_UINT8 num_filters; /* number of patterns in reply */
61212 + A_UINT8 this_filter_num; /* this is filter # x of total num_filters */
61213 + A_UINT8 wow_mode;
61214 + A_UINT8 host_mode;
61215 + WOW_FILTER wow_filters[1];
61216 +} POSTPACK WMI_GET_WOW_LIST_REPLY;
61217 +
61218 +typedef PREPACK struct {
61219 + A_UINT8 filter_list_id;
61220 + A_UINT8 filter_size;
61221 + A_UINT8 filter_offset;
61222 + A_UINT8 filter[1];
61223 +} POSTPACK WMI_ADD_WOW_PATTERN_CMD;
61224 +
61225 +typedef PREPACK struct {
61226 + A_UINT16 filter_list_id;
61227 + A_UINT16 filter_id;
61228 +} POSTPACK WMI_DEL_WOW_PATTERN_CMD;
61229 +
61230 +typedef PREPACK struct {
61231 + A_UINT8 macaddr[ATH_MAC_LEN];
61232 +} POSTPACK WMI_SET_MAC_ADDRESS_CMD;
61233 +
61234 +/*
61235 + * WMI_SET_AKMP_PARAMS_CMD
61236 + */
61237 +
61238 +#define WMI_AKMP_MULTI_PMKID_EN 0x000001
61239 +
61240 +typedef PREPACK struct {
61241 + A_UINT32 akmpInfo;
61242 +} POSTPACK WMI_SET_AKMP_PARAMS_CMD;
61243 +
61244 +typedef PREPACK struct {
61245 + A_UINT8 pmkid[WMI_PMKID_LEN];
61246 +} POSTPACK WMI_PMKID;
61247 +
61248 +/*
61249 + * WMI_SET_PMKID_LIST_CMD
61250 + */
61251 +#define WMI_MAX_PMKID_CACHE 8
61252 +
61253 +typedef PREPACK struct {
61254 + A_UINT32 numPMKID;
61255 + WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
61256 +} POSTPACK WMI_SET_PMKID_LIST_CMD;
61257 +
61258 +/*
61259 + * WMI_GET_PMKID_LIST_CMD Reply
61260 + * Following the Number of PMKIDs is the list of PMKIDs
61261 + */
61262 +typedef PREPACK struct {
61263 + A_UINT32 numPMKID;
61264 + WMI_PMKID pmkidList[1];
61265 +} POSTPACK WMI_PMKID_LIST_REPLY;
61266 +
61267 +/* index used for priority streams */
61268 +typedef enum {
61269 + WMI_NOT_MAPPED = -1,
61270 + WMI_CONTROL_PRI = 0,
61271 + WMI_BEST_EFFORT_PRI = 1,
61272 + WMI_LOW_PRI = 2,
61273 + WMI_HIGH_PRI = 3,
61274 + WMI_HIGHEST_PRI,
61275 + WMI_PRI_MAX_COUNT
61276 +} WMI_PRI_STREAM_ID;
61277 +
61278 +#ifndef ATH_TARGET
61279 +#include "athendpack.h"
61280 +#endif
61281 +
61282 +#ifdef __cplusplus
61283 +}
61284 +#endif
61285 +
61286 +#endif /* _WMI_H_ */
61287 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wmix.h
61288 ===================================================================
61289 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
61290 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/include/wmix.h 2008-12-11 22:46:49.000000000 +0100
61291 @@ -0,0 +1,233 @@
61292 +/*
61293 + * Copyright (c) 2004-2005 Atheros Communications Inc.
61294 + * All rights reserved.
61295 + *
61296 + *
61297 + * $ATH_LICENSE_HOSTSDK0_C$
61298 + *
61299 + * This file contains extensions of the WMI protocol specified in the
61300 + * Wireless Module Interface (WMI). It includes definitions of all
61301 + * extended commands and events. Extensions include useful commands
61302 + * that are not directly related to wireless activities. They may
61303 + * be hardware-specific, and they might not be supported on all
61304 + * implementations.
61305 + *
61306 + * Extended WMIX commands are encapsulated in a WMI message with
61307 + * cmd=WMI_EXTENSION_CMD.
61308 + *
61309 + */
61310 +
61311 +#ifndef _WMIX_H_
61312 +#define _WMIX_H_
61313 +
61314 +#ifdef __cplusplus
61315 +extern "C" {
61316 +#endif
61317 +
61318 +#ifndef ATH_TARGET
61319 +#include "athstartpack.h"
61320 +#endif
61321 +
61322 +#include "dbglog.h"
61323 +
61324 +/*
61325 + * Extended WMI commands are those that are needed during wireless
61326 + * operation, but which are not really wireless commands. This allows,
61327 + * for instance, platform-specific commands. Extended WMI commands are
61328 + * embedded in a WMI command message with WMI_COMMAND_ID=WMI_EXTENSION_CMDID.
61329 + * Extended WMI events are similarly embedded in a WMI event message with
61330 + * WMI_EVENT_ID=WMI_EXTENSION_EVENTID.
61331 + */
61332 +typedef PREPACK struct {
61333 + A_UINT32 commandId;
61334 +} POSTPACK WMIX_CMD_HDR;
61335 +
61336 +typedef enum {
61337 + WMIX_DSETOPEN_REPLY_CMDID = 0x2001,
61338 + WMIX_DSETDATA_REPLY_CMDID,
61339 + WMIX_GPIO_OUTPUT_SET_CMDID,
61340 + WMIX_GPIO_INPUT_GET_CMDID,
61341 + WMIX_GPIO_REGISTER_SET_CMDID,
61342 + WMIX_GPIO_REGISTER_GET_CMDID,
61343 + WMIX_GPIO_INTR_ACK_CMDID,
61344 + WMIX_HB_CHALLENGE_RESP_CMDID,
61345 + WMIX_DBGLOG_CFG_MODULE_CMDID,
61346 +} WMIX_COMMAND_ID;
61347 +
61348 +typedef enum {
61349 + WMIX_DSETOPENREQ_EVENTID = 0x3001,
61350 + WMIX_DSETCLOSE_EVENTID,
61351 + WMIX_DSETDATAREQ_EVENTID,
61352 + WMIX_GPIO_INTR_EVENTID,
61353 + WMIX_GPIO_DATA_EVENTID,
61354 + WMIX_GPIO_ACK_EVENTID,
61355 + WMIX_HB_CHALLENGE_RESP_EVENTID,
61356 + WMIX_DBGLOG_EVENTID,
61357 +} WMIX_EVENT_ID;
61358 +
61359 +/*
61360 + * =============DataSet support=================
61361 + */
61362 +
61363 +/*
61364 + * WMIX_DSETOPENREQ_EVENTID
61365 + * DataSet Open Request Event
61366 + */
61367 +typedef PREPACK struct {
61368 + A_UINT32 dset_id;
61369 + A_UINT32 targ_dset_handle; /* echo'ed, not used by Host, */
61370 + A_UINT32 targ_reply_fn; /* echo'ed, not used by Host, */
61371 + A_UINT32 targ_reply_arg; /* echo'ed, not used by Host, */
61372 +} POSTPACK WMIX_DSETOPENREQ_EVENT;
61373 +
61374 +/*
61375 + * WMIX_DSETCLOSE_EVENTID
61376 + * DataSet Close Event
61377 + */
61378 +typedef PREPACK struct {
61379 + A_UINT32 access_cookie;
61380 +} POSTPACK WMIX_DSETCLOSE_EVENT;
61381 +
61382 +/*
61383 + * WMIX_DSETDATAREQ_EVENTID
61384 + * DataSet Data Request Event
61385 + */
61386 +typedef PREPACK struct {
61387 + A_UINT32 access_cookie;
61388 + A_UINT32 offset;
61389 + A_UINT32 length;
61390 + A_UINT32 targ_buf; /* echo'ed, not used by Host, */
61391 + A_UINT32 targ_reply_fn; /* echo'ed, not used by Host, */
61392 + A_UINT32 targ_reply_arg; /* echo'ed, not used by Host, */
61393 +} POSTPACK WMIX_DSETDATAREQ_EVENT;
61394 +
61395 +typedef PREPACK struct {
61396 + A_UINT32 status;
61397 + A_UINT32 targ_dset_handle;
61398 + A_UINT32 targ_reply_fn;
61399 + A_UINT32 targ_reply_arg;
61400 + A_UINT32 access_cookie;
61401 + A_UINT32 size;
61402 + A_UINT32 version;
61403 +} POSTPACK WMIX_DSETOPEN_REPLY_CMD;
61404 +
61405 +typedef PREPACK struct {
61406 + A_UINT32 status;
61407 + A_UINT32 targ_buf;
61408 + A_UINT32 targ_reply_fn;
61409 + A_UINT32 targ_reply_arg;
61410 + A_UINT32 length;
61411 + A_UINT8 buf[1];
61412 +} POSTPACK WMIX_DSETDATA_REPLY_CMD;
61413 +
61414 +
61415 +/*
61416 + * =============GPIO support=================
61417 + * All masks are 18-bit masks with bit N operating on GPIO pin N.
61418 + */
61419 +
61420 +#include "gpio.h"
61421 +
61422 +/*
61423 + * Set GPIO pin output state.
61424 + * In order for output to be driven, a pin must be enabled for output.
61425 + * This can be done during initialization through the GPIO Configuration
61426 + * DataSet, or during operation with the enable_mask.
61427 + *
61428 + * If a request is made to simultaneously set/clear or set/disable or
61429 + * clear/disable or disable/enable, results are undefined.
61430 + */
61431 +typedef PREPACK struct {
61432 + A_UINT32 set_mask; /* pins to set */
61433 + A_UINT32 clear_mask; /* pins to clear */
61434 + A_UINT32 enable_mask; /* pins to enable for output */
61435 + A_UINT32 disable_mask; /* pins to disable/tristate */
61436 +} POSTPACK WMIX_GPIO_OUTPUT_SET_CMD;
61437 +
61438 +/*
61439 + * Set a GPIO register. For debug/exceptional cases.
61440 + * Values for gpioreg_id are GPIO_REGISTER_IDs, defined in a
61441 + * platform-dependent header.
61442 + */
61443 +typedef PREPACK struct {
61444 + A_UINT32 gpioreg_id; /* GPIO register ID */
61445 + A_UINT32 value; /* value to write */
61446 +} POSTPACK WMIX_GPIO_REGISTER_SET_CMD;
61447 +
61448 +/* Get a GPIO register. For debug/exceptional cases. */
61449 +typedef PREPACK struct {
61450 + A_UINT32 gpioreg_id; /* GPIO register to read */
61451 +} POSTPACK WMIX_GPIO_REGISTER_GET_CMD;
61452 +
61453 +/*
61454 + * Host acknowledges and re-arms GPIO interrupts. A single
61455 + * message should be used to acknowledge all interrupts that
61456 + * were delivered in an earlier WMIX_GPIO_INTR_EVENT message.
61457 + */
61458 +typedef PREPACK struct {
61459 + A_UINT32 ack_mask; /* interrupts to acknowledge */
61460 +} POSTPACK WMIX_GPIO_INTR_ACK_CMD;
61461 +
61462 +/*
61463 + * Target informs Host of GPIO interrupts that have ocurred since the
61464 + * last WMIX_GIPO_INTR_ACK_CMD was received. Additional information --
61465 + * the current GPIO input values is provided -- in order to support
61466 + * use of a GPIO interrupt as a Data Valid signal for other GPIO pins.
61467 + */
61468 +typedef PREPACK struct {
61469 + A_UINT32 intr_mask; /* pending GPIO interrupts */
61470 + A_UINT32 input_values; /* recent GPIO input values */
61471 +} POSTPACK WMIX_GPIO_INTR_EVENT;
61472 +
61473 +/*
61474 + * Target responds to Host's earlier WMIX_GPIO_INPUT_GET_CMDID request
61475 + * using a GPIO_DATA_EVENT with
61476 + * value set to the mask of GPIO pin inputs and
61477 + * reg_id set to GPIO_ID_NONE
61478 + *
61479 + *
61480 + * Target responds to Hosts's earlier WMIX_GPIO_REGISTER_GET_CMDID request
61481 + * using a GPIO_DATA_EVENT with
61482 + * value set to the value of the requested register and
61483 + * reg_id identifying the register (reflects the original request)
61484 + * NB: reg_id supports the future possibility of unsolicited
61485 + * WMIX_GPIO_DATA_EVENTs (for polling GPIO input), and it may
61486 + * simplify Host GPIO support.
61487 + */
61488 +typedef PREPACK struct {
61489 + A_UINT32 value;
61490 + A_UINT32 reg_id;
61491 +} POSTPACK WMIX_GPIO_DATA_EVENT;
61492 +
61493 +/*
61494 + * =============Error Detection support=================
61495 + */
61496 +
61497 +/*
61498 + * WMIX_HB_CHALLENGE_RESP_CMDID
61499 + * Heartbeat Challenge Response command
61500 + */
61501 +typedef PREPACK struct {
61502 + A_UINT32 cookie;
61503 + A_UINT32 source;
61504 +} POSTPACK WMIX_HB_CHALLENGE_RESP_CMD;
61505 +
61506 +/*
61507 + * WMIX_HB_CHALLENGE_RESP_EVENTID
61508 + * Heartbeat Challenge Response Event
61509 + */
61510 +#define WMIX_HB_CHALLENGE_RESP_EVENT WMIX_HB_CHALLENGE_RESP_CMD
61511 +
61512 +typedef PREPACK struct {
61513 + struct dbglog_config_s config;
61514 +} POSTPACK WMIX_DBGLOG_CFG_MODULE_CMD;
61515 +
61516 +#ifndef ATH_TARGET
61517 +#include "athendpack.h"
61518 +#endif
61519 +
61520 +#ifdef __cplusplus
61521 +}
61522 +#endif
61523 +
61524 +#endif /* _WMIX_H_ */
61525 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/Makefile
61526 ===================================================================
61527 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
61528 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/Makefile 2008-12-11 22:46:49.000000000 +0100
61529 @@ -0,0 +1,38 @@
61530 +REV ?= 2
61531 +
61532 +PWD := $(shell pwd)
61533 +
61534 +EXTRA_CFLAGS += -I$(src)/include
61535 +
61536 +EXTRA_CFLAGS += -DLINUX -D__KERNEL__ -DHTC_RAW_INTERFACE\
61537 + -DTCMD -DUSER_KEYS \
61538 + -DNO_SYNC_FLUSH #\
61539 + -DMULTIPLE_FRAMES_PER_INTERRUPT -DAR6000REV$(REV) \
61540 + -DBLOCK_TX_PATH_FLAG \
61541 + -DSDIO \
61542 +
61543 +EXTRA_CFLAGS += -DKERNEL_2_6
61544 +
61545 +obj-$(CONFIG_SDIO_AR6000_WLAN) += ar6000.o
61546 +
61547 +ar6000-objs += htc/ar6k.o \
61548 + htc/ar6k_events.o \
61549 + htc/htc_send.o \
61550 + htc/htc_recv.o \
61551 + htc/htc_services.o \
61552 + htc/htc.o \
61553 + hif/hif.o \
61554 + bmi/bmi.o \
61555 + ar6000/ar6000_drv.o \
61556 + ar6000/ar6000_raw_if.o \
61557 + ar6000/netbuf.o \
61558 + ar6000/wireless_ext.o \
61559 + ar6000/ioctl.o \
61560 + miscdrv/common_drv.o \
61561 + miscdrv/credit_dist.o \
61562 + wmi/wmi.o \
61563 + wlan/wlan_node.o \
61564 + wlan/wlan_recv_beacon.o \
61565 + wlan/wlan_utils.o
61566 +
61567 +
61568 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/miscdrv/common_drv.c
61569 ===================================================================
61570 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
61571 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/miscdrv/common_drv.c 2008-12-11 22:46:49.000000000 +0100
61572 @@ -0,0 +1,467 @@
61573 +
61574 +/*
61575 + *
61576 + * Copyright (c) 2004-2007 Atheros Communications Inc.
61577 + * All rights reserved.
61578 + *
61579 + *
61580 + * This program is free software; you can redistribute it and/or modify
61581 + * it under the terms of the GNU General Public License version 2 as
61582 + * published by the Free Software Foundation;
61583 + *
61584 + * Software distributed under the License is distributed on an "AS
61585 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
61586 + * implied. See the License for the specific language governing
61587 + * rights and limitations under the License.
61588 + *
61589 + *
61590 + *
61591 + */
61592 +
61593 +#include "a_config.h"
61594 +#include "athdefs.h"
61595 +#include "a_types.h"
61596 +#include "AR6Khwreg.h"
61597 +#include "targaddrs.h"
61598 +#include "a_osapi.h"
61599 +#include "hif.h"
61600 +#include "htc_api.h"
61601 +#include "bmi.h"
61602 +#include "bmi_msg.h"
61603 +#include "common_drv.h"
61604 +#include "a_debug.h"
61605 +#include "targaddrs.h"
61606 +
61607 +#define HOST_INTEREST_ITEM_ADDRESS(target, item) \
61608 +(((TargetType) == TARGET_TYPE_AR6001) ? \
61609 + AR6001_HOST_INTEREST_ITEM_ADDRESS(item) : \
61610 + AR6002_HOST_INTEREST_ITEM_ADDRESS(item))
61611 +
61612 +
61613 +/* Compile the 4BYTE version of the window register setup routine,
61614 + * This mitigates host interconnect issues with non-4byte aligned bus requests, some
61615 + * interconnects use bus adapters that impose strict limitations.
61616 + * Since diag window access is not intended for performance critical operations, the 4byte mode should
61617 + * be satisfactory even though it generates 4X the bus activity. */
61618 +
61619 +#ifdef USE_4BYTE_REGISTER_ACCESS
61620 +
61621 + /* set the window address register (using 4-byte register access ). */
61622 +A_STATUS ar6000_SetAddressWindowRegister(HIF_DEVICE *hifDevice, A_UINT32 RegisterAddr, A_UINT32 Address)
61623 +{
61624 + A_STATUS status;
61625 + A_UINT8 addrValue[4];
61626 + int i;
61627 +
61628 + /* write bytes 1,2,3 of the register to set the upper address bytes, the LSB is written
61629 + * last to initiate the access cycle */
61630 +
61631 + for (i = 1; i <= 3; i++) {
61632 + /* fill the buffer with the address byte value we want to hit 4 times*/
61633 + addrValue[0] = ((A_UINT8 *)&Address)[i];
61634 + addrValue[1] = addrValue[0];
61635 + addrValue[2] = addrValue[0];
61636 + addrValue[3] = addrValue[0];
61637 +
61638 + /* hit each byte of the register address with a 4-byte write operation to the same address,
61639 + * this is a harmless operation */
61640 + status = HIFReadWrite(hifDevice,
61641 + RegisterAddr+i,
61642 + addrValue,
61643 + 4,
61644 + HIF_WR_SYNC_BYTE_FIX,
61645 + NULL);
61646 + if (status != A_OK) {
61647 + break;
61648 + }
61649 + }
61650 +
61651 + if (status != A_OK) {
61652 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write initial bytes of 0x%x to window reg: 0x%X \n",
61653 + RegisterAddr, Address));
61654 + return status;
61655 + }
61656 +
61657 + /* write the address register again, this time write the whole 4-byte value.
61658 + * The effect here is that the LSB write causes the cycle to start, the extra
61659 + * 3 byte write to bytes 1,2,3 has no effect since we are writing the same values again */
61660 + status = HIFReadWrite(hifDevice,
61661 + RegisterAddr,
61662 + (A_UCHAR *)(&Address),
61663 + 4,
61664 + HIF_WR_SYNC_BYTE_INC,
61665 + NULL);
61666 +
61667 + if (status != A_OK) {
61668 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to window reg: 0x%X \n",
61669 + RegisterAddr, Address));
61670 + return status;
61671 + }
61672 +
61673 + return A_OK;
61674 +
61675 +
61676 +
61677 +}
61678 +
61679 +
61680 +#else
61681 +
61682 + /* set the window address register */
61683 +A_STATUS ar6000_SetAddressWindowRegister(HIF_DEVICE *hifDevice, A_UINT32 RegisterAddr, A_UINT32 Address)
61684 +{
61685 + A_STATUS status;
61686 +
61687 + /* write bytes 1,2,3 of the register to set the upper address bytes, the LSB is written
61688 + * last to initiate the access cycle */
61689 + status = HIFReadWrite(hifDevice,
61690 + RegisterAddr+1, /* write upper 3 bytes */
61691 + ((A_UCHAR *)(&Address))+1,
61692 + sizeof(A_UINT32)-1,
61693 + HIF_WR_SYNC_BYTE_INC,
61694 + NULL);
61695 +
61696 + if (status != A_OK) {
61697 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write initial bytes of 0x%x to window reg: 0x%X \n",
61698 + RegisterAddr, Address));
61699 + return status;
61700 + }
61701 +
61702 + /* write the LSB of the register, this initiates the operation */
61703 + status = HIFReadWrite(hifDevice,
61704 + RegisterAddr,
61705 + (A_UCHAR *)(&Address),
61706 + sizeof(A_UINT8),
61707 + HIF_WR_SYNC_BYTE_INC,
61708 + NULL);
61709 +
61710 + if (status != A_OK) {
61711 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to window reg: 0x%X \n",
61712 + RegisterAddr, Address));
61713 + return status;
61714 + }
61715 +
61716 + return A_OK;
61717 +}
61718 +
61719 +#endif
61720 +
61721 +/*
61722 + * Read from the AR6000 through its diagnostic window.
61723 + * No cooperation from the Target is required for this.
61724 + */
61725 +A_STATUS
61726 +ar6000_ReadRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data)
61727 +{
61728 + A_STATUS status;
61729 +
61730 + /* set window register to start read cycle */
61731 + status = ar6000_SetAddressWindowRegister(hifDevice,
61732 + WINDOW_READ_ADDR_ADDRESS,
61733 + *address);
61734 +
61735 + if (status != A_OK) {
61736 + return status;
61737 + }
61738 +
61739 + /* read the data */
61740 + status = HIFReadWrite(hifDevice,
61741 + WINDOW_DATA_ADDRESS,
61742 + (A_UCHAR *)data,
61743 + sizeof(A_UINT32),
61744 + HIF_RD_SYNC_BYTE_INC,
61745 + NULL);
61746 + if (status != A_OK) {
61747 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot read from WINDOW_DATA_ADDRESS\n"));
61748 + return status;
61749 + }
61750 +
61751 + return status;
61752 +}
61753 +
61754 +
61755 +/*
61756 + * Write to the AR6000 through its diagnostic window.
61757 + * No cooperation from the Target is required for this.
61758 + */
61759 +A_STATUS
61760 +ar6000_WriteRegDiag(HIF_DEVICE *hifDevice, A_UINT32 *address, A_UINT32 *data)
61761 +{
61762 + A_STATUS status;
61763 +
61764 + /* set write data */
61765 + status = HIFReadWrite(hifDevice,
61766 + WINDOW_DATA_ADDRESS,
61767 + (A_UCHAR *)data,
61768 + sizeof(A_UINT32),
61769 + HIF_WR_SYNC_BYTE_INC,
61770 + NULL);
61771 + if (status != A_OK) {
61772 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot write 0x%x to WINDOW_DATA_ADDRESS\n", *data));
61773 + return status;
61774 + }
61775 +
61776 + /* set window register, which starts the write cycle */
61777 + return ar6000_SetAddressWindowRegister(hifDevice,
61778 + WINDOW_WRITE_ADDR_ADDRESS,
61779 + *address);
61780 +}
61781 +
61782 +A_STATUS
61783 +ar6000_ReadDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
61784 + A_UCHAR *data, A_UINT32 length)
61785 +{
61786 + A_UINT32 count;
61787 + A_STATUS status = A_OK;
61788 +
61789 + for (count = 0; count < length; count += 4, address += 4) {
61790 + if ((status = ar6000_ReadRegDiag(hifDevice, &address,
61791 + (A_UINT32 *)&data[count])) != A_OK)
61792 + {
61793 + break;
61794 + }
61795 + }
61796 +
61797 + return status;
61798 +}
61799 +
61800 +A_STATUS
61801 +ar6000_WriteDataDiag(HIF_DEVICE *hifDevice, A_UINT32 address,
61802 + A_UCHAR *data, A_UINT32 length)
61803 +{
61804 + A_UINT32 count;
61805 + A_STATUS status = A_OK;
61806 +
61807 + for (count = 0; count < length; count += 4, address += 4) {
61808 + if ((status = ar6000_WriteRegDiag(hifDevice, &address,
61809 + (A_UINT32 *)&data[count])) != A_OK)
61810 + {
61811 + break;
61812 + }
61813 + }
61814 +
61815 + return status;
61816 +}
61817 +
61818 +A_STATUS
61819 +ar6000_reset_device_skipflash(HIF_DEVICE *hifDevice)
61820 +{
61821 + int i;
61822 + struct forceROM_s {
61823 + A_UINT32 addr;
61824 + A_UINT32 data;
61825 + };
61826 + struct forceROM_s *ForceROM;
61827 + int szForceROM;
61828 + A_UINT32 instruction;
61829 +
61830 + static struct forceROM_s ForceROM_REV2[] = {
61831 + /* NB: This works for old REV2 ROM (old). */
61832 + {0x00001ff0, 0x175b0027}, /* jump instruction at 0xa0001ff0 */
61833 + {0x00001ff4, 0x00000000}, /* nop instruction at 0xa0001ff4 */
61834 +
61835 + {MC_REMAP_TARGET_ADDRESS, 0x00001ff0}, /* remap to 0xa0001ff0 */
61836 + {MC_REMAP_COMPARE_ADDRESS, 0x01000040},/* ...from 0xbfc00040 */
61837 + {MC_REMAP_SIZE_ADDRESS, 0x00000000}, /* ...1 cache line */
61838 + {MC_REMAP_VALID_ADDRESS, 0x00000001}, /* ...remap is valid */
61839 +
61840 + {LOCAL_COUNT_ADDRESS+0x10, 0}, /* clear BMI credit counter */
61841 +
61842 + {RESET_CONTROL_ADDRESS, RESET_CONTROL_WARM_RST_MASK},
61843 + };
61844 +
61845 + static struct forceROM_s ForceROM_NEW[] = {
61846 + /* NB: This works for AR6000 ROM REV3 and beyond. */
61847 + {LOCAL_SCRATCH_ADDRESS, AR6K_OPTION_IGNORE_FLASH},
61848 + {LOCAL_COUNT_ADDRESS+0x10, 0}, /* clear BMI credit counter */
61849 + {RESET_CONTROL_ADDRESS, RESET_CONTROL_WARM_RST_MASK},
61850 + };
61851 +
61852 + /*
61853 + * Examine a semi-arbitrary instruction that's different
61854 + * in REV2 and other revisions.
61855 + * NB: If a Host port does not require simultaneous support
61856 + * for multiple revisions of Target ROM, this code can be elided.
61857 + */
61858 + (void)ar6000_ReadDataDiag(hifDevice, 0x01000040,
61859 + (A_UCHAR *)&instruction, 4);
61860 +
61861 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("instruction=0x%x\n", instruction));
61862 +
61863 + if (instruction == 0x3c1aa200) {
61864 + /* It's an old ROM */
61865 + ForceROM = ForceROM_REV2;
61866 + szForceROM = sizeof(ForceROM_REV2)/sizeof(*ForceROM);
61867 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Using OLD method\n"));
61868 + } else {
61869 + ForceROM = ForceROM_NEW;
61870 + szForceROM = sizeof(ForceROM_NEW)/sizeof(*ForceROM);
61871 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Using NEW method\n"));
61872 + }
61873 +
61874 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Force Target to execute from ROM....\n"));
61875 + for (i = 0; i < szForceROM; i++)
61876 + {
61877 + if (ar6000_WriteRegDiag(hifDevice,
61878 + &ForceROM[i].addr,
61879 + &ForceROM[i].data) != A_OK)
61880 + {
61881 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Cannot force Target to execute ROM!\n"));
61882 + return A_ERROR;
61883 + }
61884 + }
61885 +
61886 + A_MDELAY(50); /* delay to allow dragon to come to BMI phase */
61887 + return A_OK;
61888 +}
61889 +
61890 +/* reset device */
61891 +A_STATUS ar6000_reset_device(HIF_DEVICE *hifDevice, A_UINT32 TargetType)
61892 +{
61893 +
61894 +#if !defined(DWSIM)
61895 + A_STATUS status = A_OK;
61896 + A_UINT32 address;
61897 + A_UINT32 data;
61898 +
61899 + do {
61900 +
61901 + // address = RESET_CONTROL_ADDRESS;
61902 + data = RESET_CONTROL_COLD_RST_MASK;
61903 +
61904 + /* Hardcode the address of RESET_CONTROL_ADDRESS based on the target type */
61905 + if (TargetType == TARGET_TYPE_AR6001) {
61906 + address = 0x0C000000;
61907 + } else {
61908 + if (TargetType == TARGET_TYPE_AR6002) {
61909 + address = 0x00004000;
61910 + } else {
61911 + A_ASSERT(0);
61912 + }
61913 + }
61914 +
61915 + status = ar6000_WriteRegDiag(hifDevice, &address, &data);
61916 +
61917 + if (A_FAILED(status)) {
61918 + break;
61919 + }
61920 +
61921 + /*
61922 + * Read back the RESET CAUSE register to ensure that the cold reset
61923 + * went through.
61924 + */
61925 + A_MDELAY(2000); /* 2 second delay to allow things to settle down */
61926 +
61927 +
61928 + // address = RESET_CAUSE_ADDRESS;
61929 + /* Hardcode the address of RESET_CAUSE_ADDRESS based on the target type */
61930 + if (TargetType == TARGET_TYPE_AR6001) {
61931 + address = 0x0C0000CC;
61932 + } else {
61933 + if (TargetType == TARGET_TYPE_AR6002) {
61934 + address = 0x000040C0;
61935 + } else {
61936 + A_ASSERT(0);
61937 + }
61938 + }
61939 +
61940 + data = 0;
61941 + status = ar6000_ReadRegDiag(hifDevice, &address, &data);
61942 +
61943 + if (A_FAILED(status)) {
61944 + break;
61945 + }
61946 +
61947 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Reset Cause readback: 0x%X \n",data));
61948 + data &= RESET_CAUSE_LAST_MASK;
61949 + if (data != 2) {
61950 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Unable to cold reset the target \n"));
61951 + }
61952 +
61953 + } while (FALSE);
61954 +
61955 + if (A_FAILED(status)) {
61956 + AR_DEBUG_PRINTF(ATH_LOG_ERR, ("Failed to reset target \n"));
61957 + }
61958 +#endif
61959 + return A_OK;
61960 +}
61961 +
61962 +#define REG_DUMP_COUNT_AR6001 38 /* WORDs, derived from AR6001_regdump.h */
61963 +#define REG_DUMP_COUNT_AR6002 32 /* WORDs, derived from AR6002_regdump.h */
61964 +
61965 +
61966 +#if REG_DUMP_COUNT_AR6001 <= REG_DUMP_COUNT_AR6002
61967 +#define REGISTER_DUMP_LEN_MAX REG_DUMP_COUNT_AR6002
61968 +#else
61969 +#define REGISTER_DUMP_LEN_MAX REG_DUMP_COUNT_AR6001
61970 +#endif
61971 +
61972 +void ar6000_dump_target_assert_info(HIF_DEVICE *hifDevice, A_UINT32 TargetType)
61973 +{
61974 + A_UINT32 address;
61975 + A_UINT32 regDumpArea = 0;
61976 + A_STATUS status;
61977 + A_UINT32 regDumpValues[REGISTER_DUMP_LEN_MAX];
61978 + A_UINT32 regDumpCount = 0;
61979 + A_UINT32 i;
61980 +
61981 + do {
61982 +
61983 + /* the reg dump pointer is copied to the host interest area */
61984 + address = HOST_INTEREST_ITEM_ADDRESS(TargetType, hi_failure_state);
61985 +
61986 + if (TargetType == TARGET_TYPE_AR6001) {
61987 + /* for AR6001, this is a fixed location because the ptr is actually stuck in cache,
61988 + * this may be fixed in later firmware versions */
61989 + address = 0x18a0;
61990 + regDumpCount = REG_DUMP_COUNT_AR6001;
61991 +
61992 + } else if (TargetType == TARGET_TYPE_AR6002) {
61993 +
61994 + regDumpCount = REG_DUMP_COUNT_AR6002;
61995 +
61996 + } else {
61997 + A_ASSERT(0);
61998 + }
61999 +
62000 + /* read RAM location through diagnostic window */
62001 + status = ar6000_ReadRegDiag(hifDevice, &address, &regDumpArea);
62002 +
62003 + if (A_FAILED(status)) {
62004 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Failed to get ptr to register dump area \n"));
62005 + break;
62006 + }
62007 +
62008 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Location of register dump data: 0x%X \n",regDumpArea));
62009 +
62010 + if (regDumpArea == 0) {
62011 + /* no reg dump */
62012 + break;
62013 + }
62014 +
62015 + if (TargetType == TARGET_TYPE_AR6001) {
62016 + regDumpArea &= 0x0FFFFFFF; /* convert to physical address in target memory */
62017 + }
62018 +
62019 + /* fetch register dump data */
62020 + status = ar6000_ReadDataDiag(hifDevice,
62021 + regDumpArea,
62022 + (A_UCHAR *)&regDumpValues[0],
62023 + regDumpCount * (sizeof(A_UINT32)));
62024 +
62025 + if (A_FAILED(status)) {
62026 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Failed to get register dump \n"));
62027 + break;
62028 + }
62029 +
62030 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("AR6K: Register Dump: \n"));
62031 +
62032 + for (i = 0; i < regDumpCount; i++) {
62033 + AR_DEBUG_PRINTF(ATH_DEBUG_ERR,(" %d : 0x%8.8X \n",i, regDumpValues[i]));
62034 + }
62035 +
62036 + } while (FALSE);
62037 +
62038 +}
62039 +
62040 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/miscdrv/credit_dist.c
62041 ===================================================================
62042 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
62043 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/miscdrv/credit_dist.c 2008-12-11 22:46:49.000000000 +0100
62044 @@ -0,0 +1,346 @@
62045 +
62046 +/*
62047 + *
62048 + * Copyright (c) 2004-2007 Atheros Communications Inc.
62049 + * All rights reserved.
62050 + *
62051 + *
62052 + * This program is free software; you can redistribute it and/or modify
62053 + * it under the terms of the GNU General Public License version 2 as
62054 + * published by the Free Software Foundation;
62055 + *
62056 + * Software distributed under the License is distributed on an "AS
62057 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
62058 + * implied. See the License for the specific language governing
62059 + * rights and limitations under the License.
62060 + *
62061 + *
62062 + *
62063 + */
62064 +
62065 +#include "a_config.h"
62066 +#include "athdefs.h"
62067 +#include "a_types.h"
62068 +#include "a_osapi.h"
62069 +#include "a_debug.h"
62070 +#include "htc_api.h"
62071 +#include "common_drv.h"
62072 +
62073 +/********* CREDIT DISTRIBUTION FUNCTIONS ******************************************/
62074 +
62075 +#define NO_VO_SERVICE 1 /* currently WMI only uses 3 data streams, so we leave VO service inactive */
62076 +
62077 +#ifdef NO_VO_SERVICE
62078 +#define DATA_SVCS_USED 3
62079 +#else
62080 +#define DATA_SVCS_USED 4
62081 +#endif
62082 +
62083 +static void RedistributeCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
62084 + HTC_ENDPOINT_CREDIT_DIST *pEPDistList);
62085 +
62086 +static void SeekCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
62087 + HTC_ENDPOINT_CREDIT_DIST *pEPDistList);
62088 +
62089 +/* reduce an ep's credits back to a set limit */
62090 +static INLINE void ReduceCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
62091 + HTC_ENDPOINT_CREDIT_DIST *pEpDist,
62092 + int Limit)
62093 +{
62094 + int credits;
62095 +
62096 + /* set the new limit */
62097 + pEpDist->TxCreditsAssigned = Limit;
62098 +
62099 + if (pEpDist->TxCredits <= Limit) {
62100 + return;
62101 + }
62102 +
62103 + /* figure out how much to take away */
62104 + credits = pEpDist->TxCredits - Limit;
62105 + /* take them away */
62106 + pEpDist->TxCredits -= credits;
62107 + pCredInfo->CurrentFreeCredits += credits;
62108 +}
62109 +
62110 +/* give an endpoint some credits from the free credit pool */
62111 +#define GiveCredits(pCredInfo,pEpDist,credits) \
62112 +{ \
62113 + (pEpDist)->TxCredits += (credits); \
62114 + (pEpDist)->TxCreditsAssigned += (credits); \
62115 + (pCredInfo)->CurrentFreeCredits -= (credits); \
62116 +}
62117 +
62118 +
62119 +/* default credit init callback.
62120 + * This function is called in the context of HTCStart() to setup initial (application-specific)
62121 + * credit distributions */
62122 +static void ar6000_credit_init(void *Context,
62123 + HTC_ENDPOINT_CREDIT_DIST *pEPList,
62124 + int TotalCredits)
62125 +{
62126 + HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
62127 + int count;
62128 + COMMON_CREDIT_STATE_INFO *pCredInfo = (COMMON_CREDIT_STATE_INFO *)Context;
62129 +
62130 + pCredInfo->CurrentFreeCredits = TotalCredits;
62131 + pCredInfo->TotalAvailableCredits = TotalCredits;
62132 +
62133 + pCurEpDist = pEPList;
62134 +
62135 + /* run through the list and initialize */
62136 + while (pCurEpDist != NULL) {
62137 +
62138 + /* set minimums for each endpoint */
62139 + pCurEpDist->TxCreditsMin = pCurEpDist->TxCreditsPerMaxMsg;
62140 +
62141 + if (pCurEpDist->ServiceID == WMI_CONTROL_SVC) {
62142 + /* give control service some credits */
62143 + GiveCredits(pCredInfo,pCurEpDist,pCurEpDist->TxCreditsMin);
62144 + /* control service is always marked active, it never goes inactive EVER */
62145 + SET_EP_ACTIVE(pCurEpDist);
62146 + } else if (pCurEpDist->ServiceID == WMI_DATA_BK_SVC) {
62147 + /* this is the lowest priority data endpoint, save this off for easy access */
62148 + pCredInfo->pLowestPriEpDist = pCurEpDist;
62149 + }
62150 +
62151 + /* Streams have to be created (explicit | implicit)for all kinds
62152 + * of traffic. BE endpoints are also inactive in the beginning.
62153 + * When BE traffic starts it creates implicit streams that
62154 + * redistributes credits.
62155 + */
62156 +
62157 + /* note, all other endpoints have minimums set but are initially given NO credits.
62158 + * Credits will be distributed as traffic activity demands */
62159 + pCurEpDist = pCurEpDist->pNext;
62160 + }
62161 +
62162 + if (pCredInfo->CurrentFreeCredits <= 0) {
62163 + AR_DEBUG_PRINTF(ATH_LOG_INF, ("Not enough credits (%d) to do credit distributions \n", TotalCredits));
62164 + A_ASSERT(FALSE);
62165 + return;
62166 + }
62167 +
62168 + /* reset list */
62169 + pCurEpDist = pEPList;
62170 + /* now run through the list and set max operating credit limits for everyone */
62171 + while (pCurEpDist != NULL) {
62172 + if (pCurEpDist->ServiceID == WMI_CONTROL_SVC) {
62173 + /* control service max is just 1 max message */
62174 + pCurEpDist->TxCreditsNorm = pCurEpDist->TxCreditsPerMaxMsg;
62175 + } else {
62176 + /* for the remaining data endpoints, we assume that each TxCreditsPerMaxMsg are
62177 + * the same.
62178 + * We use a simple calculation here, we take the remaining credits and
62179 + * determine how many max messages this can cover and then set each endpoint's
62180 + * normal value equal to half this amount.
62181 + * */
62182 + count = (pCredInfo->CurrentFreeCredits/pCurEpDist->TxCreditsPerMaxMsg) * pCurEpDist->TxCreditsPerMaxMsg;
62183 + count = count >> 1;
62184 + count = max(count,pCurEpDist->TxCreditsPerMaxMsg);
62185 + /* set normal */
62186 + pCurEpDist->TxCreditsNorm = count;
62187 +
62188 + }
62189 + pCurEpDist = pCurEpDist->pNext;
62190 + }
62191 +
62192 +}
62193 +
62194 +
62195 +/* default credit distribution callback
62196 + * This callback is invoked whenever endpoints require credit distributions.
62197 + * A lock is held while this function is invoked, this function shall NOT block.
62198 + * The pEPDistList is a list of distribution structures in prioritized order as
62199 + * defined by the call to the HTCSetCreditDistribution() api.
62200 + *
62201 + */
62202 +static void ar6000_credit_distribute(void *Context,
62203 + HTC_ENDPOINT_CREDIT_DIST *pEPDistList,
62204 + HTC_CREDIT_DIST_REASON Reason)
62205 +{
62206 + HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
62207 + COMMON_CREDIT_STATE_INFO *pCredInfo = (COMMON_CREDIT_STATE_INFO *)Context;
62208 +
62209 + switch (Reason) {
62210 + case HTC_CREDIT_DIST_SEND_COMPLETE :
62211 + pCurEpDist = pEPDistList;
62212 + /* we are given the start of the endpoint distribution list.
62213 + * There may be one or more endpoints to service.
62214 + * Run through the list and distribute credits */
62215 + while (pCurEpDist != NULL) {
62216 +
62217 + if (pCurEpDist->TxCreditsToDist > 0) {
62218 + /* return the credits back to the endpoint */
62219 + pCurEpDist->TxCredits += pCurEpDist->TxCreditsToDist;
62220 + /* always zero out when we are done */
62221 + pCurEpDist->TxCreditsToDist = 0;
62222 +
62223 + if (pCurEpDist->TxCredits > pCurEpDist->TxCreditsAssigned) {
62224 + /* reduce to the assigned limit, previous credit reductions
62225 + * could have caused the limit to change */
62226 + ReduceCredits(pCredInfo, pCurEpDist, pCurEpDist->TxCreditsAssigned);
62227 + }
62228 +
62229 + if (pCurEpDist->TxCredits > pCurEpDist->TxCreditsNorm) {
62230 + /* oversubscribed endpoints need to reduce back to normal */
62231 + ReduceCredits(pCredInfo, pCurEpDist, pCurEpDist->TxCreditsNorm);
62232 + }
62233 + }
62234 +
62235 + pCurEpDist = pCurEpDist->pNext;
62236 + }
62237 +
62238 + A_ASSERT(pCredInfo->CurrentFreeCredits <= pCredInfo->TotalAvailableCredits);
62239 +
62240 + break;
62241 +
62242 + case HTC_CREDIT_DIST_ACTIVITY_CHANGE :
62243 + RedistributeCredits(pCredInfo,pEPDistList);
62244 + break;
62245 + case HTC_CREDIT_DIST_SEEK_CREDITS :
62246 + SeekCredits(pCredInfo,pEPDistList);
62247 + break;
62248 + case HTC_DUMP_CREDIT_STATE :
62249 + AR_DEBUG_PRINTF(ATH_LOG_INF, ("Credit Distribution, total : %d, free : %d\n",
62250 + pCredInfo->TotalAvailableCredits, pCredInfo->CurrentFreeCredits));
62251 + break;
62252 + default:
62253 + break;
62254 +
62255 + }
62256 +
62257 +}
62258 +
62259 +/* redistribute credits based on activity change */
62260 +static void RedistributeCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
62261 + HTC_ENDPOINT_CREDIT_DIST *pEPDistList)
62262 +{
62263 + HTC_ENDPOINT_CREDIT_DIST *pCurEpDist = pEPDistList;
62264 +
62265 + /* walk through the list and remove credits from inactive endpoints */
62266 + while (pCurEpDist != NULL) {
62267 +
62268 + if (pCurEpDist->ServiceID != WMI_CONTROL_SVC) {
62269 + if (!IS_EP_ACTIVE(pCurEpDist)) {
62270 + /* EP is inactive, reduce credits back to zero */
62271 + ReduceCredits(pCredInfo, pCurEpDist, 0);
62272 + }
62273 + }
62274 +
62275 + /* NOTE in the active case, we do not need to do anything further,
62276 + * when an EP goes active and needs credits, HTC will call into
62277 + * our distribution function using a reason code of HTC_CREDIT_DIST_SEEK_CREDITS */
62278 +
62279 + pCurEpDist = pCurEpDist->pNext;
62280 + }
62281 +
62282 + A_ASSERT(pCredInfo->CurrentFreeCredits <= pCredInfo->TotalAvailableCredits);
62283 +
62284 +}
62285 +
62286 +/* HTC has an endpoint that needs credits, pEPDist is the endpoint in question */
62287 +static void SeekCredits(COMMON_CREDIT_STATE_INFO *pCredInfo,
62288 + HTC_ENDPOINT_CREDIT_DIST *pEPDist)
62289 +{
62290 + HTC_ENDPOINT_CREDIT_DIST *pCurEpDist;
62291 + int credits = 0;
62292 + int need;
62293 +
62294 + do {
62295 +
62296 + if (pEPDist->ServiceID == WMI_CONTROL_SVC) {
62297 + /* we never oversubscribe on the control service, this is not
62298 + * a high performance path and the target never holds onto control
62299 + * credits for too long */
62300 + break;
62301 + }
62302 +
62303 + /* for all other services, we follow a simple algorithm of
62304 + * 1. checking the free pool for credits
62305 + * 2. checking lower priority endpoints for credits to take */
62306 +
62307 + if (pCredInfo->CurrentFreeCredits >= 2 * pEPDist->TxCreditsSeek) {
62308 + /* try to give more credits than it needs */
62309 + credits = 2 * pEPDist->TxCreditsSeek;
62310 + } else {
62311 + /* give what we can */
62312 + credits = min(pCredInfo->CurrentFreeCredits,pEPDist->TxCreditsSeek);
62313 + }
62314 +
62315 + if (credits >= pEPDist->TxCreditsSeek) {
62316 + /* we found some to fullfill the seek request */
62317 + break;
62318 + }
62319 +
62320 + /* we don't have enough in the free pool, try taking away from lower priority services
62321 + *
62322 + * The rule for taking away credits:
62323 + * 1. Only take from lower priority endpoints
62324 + * 2. Only take what is allocated above the minimum (never starve an endpoint completely)
62325 + * 3. Only take what you need.
62326 + *
62327 + * */
62328 +
62329 + /* starting at the lowest priority */
62330 + pCurEpDist = pCredInfo->pLowestPriEpDist;
62331 +
62332 + /* work backwards until we hit the endpoint again */
62333 + while (pCurEpDist != pEPDist) {
62334 + /* calculate how many we need so far */
62335 + need = pEPDist->TxCreditsSeek - pCredInfo->CurrentFreeCredits;
62336 +
62337 + if ((pCurEpDist->TxCreditsAssigned - need) > pCurEpDist->TxCreditsMin) {
62338 + /* the current one has been allocated more than it's minimum and it
62339 + * has enough credits assigned above it's minimum to fullfill our need
62340 + * try to take away just enough to fullfill our need */
62341 + ReduceCredits(pCredInfo,
62342 + pCurEpDist,
62343 + pCurEpDist->TxCreditsAssigned - need);
62344 +
62345 + if (pCredInfo->CurrentFreeCredits >= pEPDist->TxCreditsSeek) {
62346 + /* we have enough */
62347 + break;
62348 + }
62349 + }
62350 +
62351 + pCurEpDist = pCurEpDist->pPrev;
62352 + }
62353 +
62354 + /* return what we can get */
62355 + credits = min(pCredInfo->CurrentFreeCredits,pEPDist->TxCreditsSeek);
62356 +
62357 + } while (FALSE);
62358 +
62359 + /* did we find some credits? */
62360 + if (credits) {
62361 + /* give what we can */
62362 + GiveCredits(pCredInfo, pEPDist, credits);
62363 + }
62364 +
62365 +}
62366 +
62367 +/* initialize and setup credit distribution */
62368 +A_STATUS ar6000_setup_credit_dist(HTC_HANDLE HTCHandle, COMMON_CREDIT_STATE_INFO *pCredInfo)
62369 +{
62370 + HTC_SERVICE_ID servicepriority[5];
62371 +
62372 + A_MEMZERO(pCredInfo,sizeof(COMMON_CREDIT_STATE_INFO));
62373 +
62374 + servicepriority[0] = WMI_CONTROL_SVC; /* highest */
62375 + servicepriority[1] = WMI_DATA_VO_SVC;
62376 + servicepriority[2] = WMI_DATA_VI_SVC;
62377 + servicepriority[3] = WMI_DATA_BE_SVC;
62378 + servicepriority[4] = WMI_DATA_BK_SVC; /* lowest */
62379 +
62380 + /* set callbacks and priority list */
62381 + HTCSetCreditDistribution(HTCHandle,
62382 + pCredInfo,
62383 + ar6000_credit_distribute,
62384 + ar6000_credit_init,
62385 + servicepriority,
62386 + 5);
62387 +
62388 + return A_OK;
62389 +}
62390 +
62391 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wlan/wlan_node.c
62392 ===================================================================
62393 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
62394 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wlan/wlan_node.c 2008-12-11 22:46:49.000000000 +0100
62395 @@ -0,0 +1,371 @@
62396 +/*-
62397 + * Copyright (c) 2001 Atsushi Onoe
62398 + * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
62399 + * Copyright (c) 2004-2005 Atheros Communications
62400 + * All rights reserved.
62401 + *
62402 + * Redistribution and use in source and binary forms, with or without
62403 + * modification, are permitted provided that the following conditions
62404 + * are met:
62405 + * 1. Redistributions of source code must retain the above copyright
62406 + * notice, this list of conditions and the following disclaimer.
62407 + * 2. Redistributions in binary form must reproduce the above copyright
62408 + * notice, this list of conditions and the following disclaimer in the
62409 + * documentation and/or other materials provided with the distribution.
62410 + * 3. The name of the author may not be used to endorse or promote products
62411 + * derived from this software without specific prior written permission.
62412 + *
62413 + * Alternatively, this software may be distributed under the terms of the
62414 + * GNU General Public License ("GPL") version 2 as published by the Free
62415 + * Software Foundation.
62416 + *
62417 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
62418 + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
62419 + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
62420 + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
62421 + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
62422 + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
62423 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
62424 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62425 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
62426 + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62427 + *
62428 + * $Id: //depot/sw/releases/olca2.0-GPL/host/wlan/src/wlan_node.c#1 $
62429 + */
62430 +/*
62431 + * IEEE 802.11 node handling support.
62432 + */
62433 +#include <a_config.h>
62434 +#include <athdefs.h>
62435 +#include <a_types.h>
62436 +#include <a_osapi.h>
62437 +#include <a_debug.h>
62438 +#include <ieee80211.h>
62439 +#include <wlan_api.h>
62440 +#include <ieee80211_node.h>
62441 +#include <htc_api.h>
62442 +#include <wmi.h>
62443 +#include <wmi_api.h>
62444 +
62445 +static void wlan_node_timeout(A_ATH_TIMER arg);
62446 +static bss_t * _ieee80211_find_node(struct ieee80211_node_table *nt,
62447 + const A_UINT8 *macaddr);
62448 +
62449 +bss_t *
62450 +wlan_node_alloc(struct ieee80211_node_table *nt, int wh_size)
62451 +{
62452 + bss_t *ni;
62453 +
62454 + ni = A_MALLOC_NOWAIT(sizeof(bss_t));
62455 +
62456 + if (ni != NULL) {
62457 + ni->ni_buf = A_MALLOC_NOWAIT(wh_size);
62458 + if (ni->ni_buf == NULL) {
62459 + A_FREE(ni);
62460 + ni = NULL;
62461 + return ni;
62462 + }
62463 + } else {
62464 + return ni;
62465 + }
62466 +
62467 + /* Make sure our lists are clean */
62468 + ni->ni_list_next = NULL;
62469 + ni->ni_list_prev = NULL;
62470 + ni->ni_hash_next = NULL;
62471 + ni->ni_hash_prev = NULL;
62472 +
62473 + //
62474 + // ni_scangen never initialized before and during suspend/resume of winmobile, customer (LG/SEMCO) identified
62475 + // that some junk has been stored in this, due to this scan list didn't properly updated
62476 + //
62477 + ni->ni_scangen = 0;
62478 +
62479 + return ni;
62480 +}
62481 +
62482 +void
62483 +wlan_node_free(bss_t *ni)
62484 +{
62485 + if (ni->ni_buf != NULL) {
62486 + A_FREE(ni->ni_buf);
62487 + }
62488 + A_FREE(ni);
62489 +}
62490 +
62491 +void
62492 +wlan_setup_node(struct ieee80211_node_table *nt, bss_t *ni,
62493 + const A_UINT8 *macaddr)
62494 +{
62495 + int hash;
62496 +
62497 + A_MEMCPY(ni->ni_macaddr, macaddr, IEEE80211_ADDR_LEN);
62498 + hash = IEEE80211_NODE_HASH(macaddr);
62499 + ieee80211_node_initref(ni); /* mark referenced */
62500 +
62501 + ni->ni_tstamp = A_GET_MS(WLAN_NODE_INACT_TIMEOUT_MSEC);
62502 + IEEE80211_NODE_LOCK_BH(nt);
62503 +
62504 + /* Insert at the end of the node list */
62505 + ni->ni_list_next = NULL;
62506 + ni->ni_list_prev = nt->nt_node_last;
62507 + if(nt->nt_node_last != NULL)
62508 + {
62509 + nt->nt_node_last->ni_list_next = ni;
62510 + }
62511 + nt->nt_node_last = ni;
62512 + if(nt->nt_node_first == NULL)
62513 + {
62514 + nt->nt_node_first = ni;
62515 + }
62516 +
62517 + /* Insert into the hash list i.e. the bucket */
62518 + if((ni->ni_hash_next = nt->nt_hash[hash]) != NULL)
62519 + {
62520 + nt->nt_hash[hash]->ni_hash_prev = ni;
62521 + }
62522 + ni->ni_hash_prev = NULL;
62523 + nt->nt_hash[hash] = ni;
62524 +
62525 + if (!nt->isTimerArmed) {
62526 + A_TIMEOUT_MS(&nt->nt_inact_timer, WLAN_NODE_INACT_TIMEOUT_MSEC, 0);
62527 + nt->isTimerArmed = TRUE;
62528 + }
62529 +
62530 + IEEE80211_NODE_UNLOCK_BH(nt);
62531 +}
62532 +
62533 +static bss_t *
62534 +_ieee80211_find_node(struct ieee80211_node_table *nt,
62535 + const A_UINT8 *macaddr)
62536 +{
62537 + bss_t *ni;
62538 + int hash;
62539 +
62540 + IEEE80211_NODE_LOCK_ASSERT(nt);
62541 +
62542 + hash = IEEE80211_NODE_HASH(macaddr);
62543 + for(ni = nt->nt_hash[hash]; ni; ni = ni->ni_hash_next) {
62544 + if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr)) {
62545 + ieee80211_node_incref(ni); /* mark referenced */
62546 + return ni;
62547 + }
62548 + }
62549 + return NULL;
62550 +}
62551 +
62552 +bss_t *
62553 +wlan_find_node(struct ieee80211_node_table *nt, const A_UINT8 *macaddr)
62554 +{
62555 + bss_t *ni;
62556 +
62557 + IEEE80211_NODE_LOCK(nt);
62558 + ni = _ieee80211_find_node(nt, macaddr);
62559 + IEEE80211_NODE_UNLOCK(nt);
62560 + return ni;
62561 +}
62562 +
62563 +/*
62564 + * Reclaim a node. If this is the last reference count then
62565 + * do the normal free work. Otherwise remove it from the node
62566 + * table and mark it gone by clearing the back-reference.
62567 + */
62568 +void
62569 +wlan_node_reclaim(struct ieee80211_node_table *nt, bss_t *ni)
62570 +{
62571 + IEEE80211_NODE_LOCK(nt);
62572 +
62573 + if(ni->ni_list_prev == NULL)
62574 + {
62575 + /* First in list so fix the list head */
62576 + nt->nt_node_first = ni->ni_list_next;
62577 + }
62578 + else
62579 + {
62580 + ni->ni_list_prev->ni_list_next = ni->ni_list_next;
62581 + }
62582 +
62583 + if(ni->ni_list_next == NULL)
62584 + {
62585 + /* Last in list so fix list tail */
62586 + nt->nt_node_last = ni->ni_list_prev;
62587 + }
62588 + else
62589 + {
62590 + ni->ni_list_next->ni_list_prev = ni->ni_list_prev;
62591 + }
62592 +
62593 + if(ni->ni_hash_prev == NULL)
62594 + {
62595 + /* First in list so fix the list head */
62596 + int hash;
62597 + hash = IEEE80211_NODE_HASH(ni->ni_macaddr);
62598 + nt->nt_hash[hash] = ni->ni_hash_next;
62599 + }
62600 + else
62601 + {
62602 + ni->ni_hash_prev->ni_hash_next = ni->ni_hash_next;
62603 + }
62604 +
62605 + if(ni->ni_hash_next != NULL)
62606 + {
62607 + ni->ni_hash_next->ni_hash_prev = ni->ni_hash_prev;
62608 + }
62609 + wlan_node_free(ni);
62610 +
62611 + IEEE80211_NODE_UNLOCK(nt);
62612 +}
62613 +
62614 +static void
62615 +wlan_node_dec_free(bss_t *ni)
62616 +{
62617 + if (ieee80211_node_dectestref(ni)) {
62618 + wlan_node_free(ni);
62619 + }
62620 +}
62621 +
62622 +void
62623 +wlan_free_allnodes(struct ieee80211_node_table *nt)
62624 +{
62625 + bss_t *ni;
62626 +
62627 + while ((ni = nt->nt_node_first) != NULL) {
62628 + wlan_node_reclaim(nt, ni);
62629 + }
62630 +}
62631 +
62632 +void
62633 +wlan_iterate_nodes(struct ieee80211_node_table *nt, wlan_node_iter_func *f,
62634 + void *arg)
62635 +{
62636 + bss_t *ni;
62637 + A_UINT32 gen;
62638 +
62639 + gen = ++nt->nt_scangen;
62640 +
62641 + IEEE80211_NODE_LOCK(nt);
62642 + for (ni = nt->nt_node_first; ni; ni = ni->ni_list_next) {
62643 + if (ni->ni_scangen != gen) {
62644 + ni->ni_scangen = gen;
62645 + (void) ieee80211_node_incref(ni);
62646 + (*f)(arg, ni);
62647 + wlan_node_dec_free(ni);
62648 + }
62649 + }
62650 + IEEE80211_NODE_UNLOCK(nt);
62651 +}
62652 +
62653 +/*
62654 + * Node table support.
62655 + */
62656 +void
62657 +wlan_node_table_init(void *wmip, struct ieee80211_node_table *nt)
62658 +{
62659 + int i;
62660 +
62661 + AR_DEBUG_PRINTF(ATH_DEBUG_WLAN, ("node table = 0x%x\n", (A_UINT32)nt));
62662 + IEEE80211_NODE_LOCK_INIT(nt);
62663 +
62664 + nt->nt_node_first = nt->nt_node_last = NULL;
62665 + for(i = 0; i < IEEE80211_NODE_HASHSIZE; i++)
62666 + {
62667 + nt->nt_hash[i] = NULL;
62668 + }
62669 + A_INIT_TIMER(&nt->nt_inact_timer, wlan_node_timeout, nt);
62670 + nt->isTimerArmed = FALSE;
62671 + nt->nt_wmip = wmip;
62672 +}
62673 +
62674 +static void
62675 +wlan_node_timeout(A_ATH_TIMER arg)
62676 +{
62677 + struct ieee80211_node_table *nt = (struct ieee80211_node_table *)arg;
62678 + bss_t *bss, *nextBss;
62679 + A_UINT8 myBssid[IEEE80211_ADDR_LEN], reArmTimer = FALSE;
62680 +
62681 + wmi_get_current_bssid(nt->nt_wmip, myBssid);
62682 +
62683 + bss = nt->nt_node_first;
62684 + while (bss != NULL)
62685 + {
62686 + nextBss = bss->ni_list_next;
62687 + if (A_MEMCMP(myBssid, bss->ni_macaddr, sizeof(myBssid)) != 0)
62688 + {
62689 +
62690 + if (bss->ni_tstamp <= A_GET_MS(0))
62691 + {
62692 + /*
62693 + * free up all but the current bss - if set
62694 + */
62695 + wlan_node_reclaim(nt, bss);
62696 + }
62697 + else
62698 + {
62699 + /*
62700 + * Re-arm timer, only when we have a bss other than
62701 + * current bss AND it is not aged-out.
62702 + */
62703 + reArmTimer = TRUE;
62704 + }
62705 + }
62706 + bss = nextBss;
62707 + }
62708 +
62709 + if(reArmTimer)
62710 + A_TIMEOUT_MS(&nt->nt_inact_timer, WLAN_NODE_INACT_TIMEOUT_MSEC, 0);
62711 +
62712 + nt->isTimerArmed = reArmTimer;
62713 +}
62714 +
62715 +void
62716 +wlan_node_table_cleanup(struct ieee80211_node_table *nt)
62717 +{
62718 + A_UNTIMEOUT(&nt->nt_inact_timer);
62719 + A_DELETE_TIMER(&nt->nt_inact_timer);
62720 + wlan_free_allnodes(nt);
62721 + IEEE80211_NODE_LOCK_DESTROY(nt);
62722 +}
62723 +
62724 +bss_t *
62725 +wlan_find_Ssidnode (struct ieee80211_node_table *nt, A_UCHAR *pSsid,
62726 + A_UINT32 ssidLength, A_BOOL bIsWPA2)
62727 +{
62728 + bss_t *ni = NULL;
62729 + A_UCHAR *pIESsid = NULL;
62730 +
62731 + IEEE80211_NODE_LOCK (nt);
62732 +
62733 + for (ni = nt->nt_node_first; ni; ni = ni->ni_list_next) {
62734 + pIESsid = ni->ni_cie.ie_ssid;
62735 + if (pIESsid[1] <= 32) {
62736 +
62737 + // Step 1 : Check SSID
62738 + if (0x00 == memcmp (pSsid, &pIESsid[2], ssidLength)) {
62739 +
62740 + // Step 2 : if SSID matches, check WPA or WPA2
62741 + if (TRUE == bIsWPA2 && NULL != ni->ni_cie.ie_rsn) {
62742 + ieee80211_node_incref (ni); /* mark referenced */
62743 + IEEE80211_NODE_UNLOCK (nt);
62744 + return ni;
62745 + }
62746 + if (FALSE == bIsWPA2 && NULL != ni->ni_cie.ie_wpa) {
62747 + ieee80211_node_incref(ni); /* mark referenced */
62748 + IEEE80211_NODE_UNLOCK (nt);
62749 + return ni;
62750 + }
62751 + }
62752 + }
62753 + }
62754 +
62755 + IEEE80211_NODE_UNLOCK (nt);
62756 +
62757 + return NULL;
62758 +}
62759 +
62760 +void
62761 +wlan_node_return (struct ieee80211_node_table *nt, bss_t *ni)
62762 +{
62763 + IEEE80211_NODE_LOCK (nt);
62764 + wlan_node_dec_free (ni);
62765 + IEEE80211_NODE_UNLOCK (nt);
62766 +}
62767 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wlan/wlan_recv_beacon.c
62768 ===================================================================
62769 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
62770 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wlan/wlan_recv_beacon.c 2008-12-11 22:46:49.000000000 +0100
62771 @@ -0,0 +1,192 @@
62772 +/*-
62773 + * Copyright (c) 2001 Atsushi Onoe
62774 + * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
62775 + * All rights reserved.
62776 + *
62777 + * Redistribution and use in source and binary forms, with or without
62778 + * modification, are permitted provided that the following conditions
62779 + * are met:
62780 + * 1. Redistributions of source code must retain the above copyright
62781 + * notice, this list of conditions and the following disclaimer.
62782 + * 2. Redistributions in binary form must reproduce the above copyright
62783 + * notice, this list of conditions and the following disclaimer in the
62784 + * documentation and/or other materials provided with the distribution.
62785 + * 3. The name of the author may not be used to endorse or promote products
62786 + * derived from this software without specific prior written permission.
62787 + *
62788 + * Alternatively, this software may be distributed under the terms of the
62789 + * GNU General Public License ("GPL") version 2 as published by the Free
62790 + * Software Foundation.
62791 + *
62792 + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
62793 + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
62794 + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
62795 + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
62796 + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
62797 + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
62798 + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
62799 + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62800 + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
62801 + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62802 + */
62803 +/*
62804 + * IEEE 802.11 input handling.
62805 + */
62806 +
62807 +#include "a_config.h"
62808 +#include "athdefs.h"
62809 +#include "a_types.h"
62810 +#include "a_osapi.h"
62811 +#include <wmi.h>
62812 +#include <ieee80211.h>
62813 +#include <wlan_api.h>
62814 +
62815 +#define IEEE80211_VERIFY_LENGTH(_len, _minlen) do { \
62816 + if ((_len) < (_minlen)) { \
62817 + return A_EINVAL; \
62818 + } \
62819 +} while (0)
62820 +
62821 +#define IEEE80211_VERIFY_ELEMENT(__elem, __maxlen) do { \
62822 + if ((__elem) == NULL) { \
62823 + return A_EINVAL; \
62824 + } \
62825 + if ((__elem)[1] > (__maxlen)) { \
62826 + return A_EINVAL; \
62827 + } \
62828 +} while (0)
62829 +
62830 +
62831 +/* unaligned little endian access */
62832 +#define LE_READ_2(p) \
62833 + ((A_UINT16) \
62834 + ((((A_UINT8 *)(p))[0] ) | (((A_UINT8 *)(p))[1] << 8)))
62835 +
62836 +#define LE_READ_4(p) \
62837 + ((A_UINT32) \
62838 + ((((A_UINT8 *)(p))[0] ) | (((A_UINT8 *)(p))[1] << 8) | \
62839 + (((A_UINT8 *)(p))[2] << 16) | (((A_UINT8 *)(p))[3] << 24)))
62840 +
62841 +
62842 +static int __inline
62843 +iswpaoui(const A_UINT8 *frm)
62844 +{
62845 + return frm[1] > 3 && LE_READ_4(frm+2) == ((WPA_OUI_TYPE<<24)|WPA_OUI);
62846 +}
62847 +
62848 +static int __inline
62849 +iswmmoui(const A_UINT8 *frm)
62850 +{
62851 + return frm[1] > 3 && LE_READ_4(frm+2) == ((WMM_OUI_TYPE<<24)|WMM_OUI);
62852 +}
62853 +
62854 +static int __inline
62855 +iswmmparam(const A_UINT8 *frm)
62856 +{
62857 + return frm[1] > 5 && frm[6] == WMM_PARAM_OUI_SUBTYPE;
62858 +}
62859 +
62860 +static int __inline
62861 +iswmminfo(const A_UINT8 *frm)
62862 +{
62863 + return frm[1] > 5 && frm[6] == WMM_INFO_OUI_SUBTYPE;
62864 +}
62865 +
62866 +static int __inline
62867 +isatherosoui(const A_UINT8 *frm)
62868 +{
62869 + return frm[1] > 3 && LE_READ_4(frm+2) == ((ATH_OUI_TYPE<<24)|ATH_OUI);
62870 +}
62871 +
62872 +static int __inline
62873 +iswscoui(const A_UINT8 *frm)
62874 +{
62875 + return frm[1] > 3 && LE_READ_4(frm+2) == ((0x04<<24)|WPA_OUI);
62876 +}
62877 +
62878 +A_STATUS
62879 +wlan_parse_beacon(A_UINT8 *buf, int framelen, struct ieee80211_common_ie *cie)
62880 +{
62881 + A_UINT8 *frm, *efrm;
62882 +
62883 + frm = buf;
62884 + efrm = (A_UINT8 *) (frm + framelen);
62885 +
62886 + /*
62887 + * beacon/probe response frame format
62888 + * [8] time stamp
62889 + * [2] beacon interval
62890 + * [2] capability information
62891 + * [tlv] ssid
62892 + * [tlv] supported rates
62893 + * [tlv] country information
62894 + * [tlv] parameter set (FH/DS)
62895 + * [tlv] erp information
62896 + * [tlv] extended supported rates
62897 + * [tlv] WMM
62898 + * [tlv] WPA or RSN
62899 + * [tlv] Atheros Advanced Capabilities
62900 + */
62901 + IEEE80211_VERIFY_LENGTH(efrm - frm, 12);
62902 + A_MEMZERO(cie, sizeof(*cie));
62903 +
62904 + cie->ie_tstamp = frm; frm += 8;
62905 + cie->ie_beaconInt = A_LE2CPU16(*(A_UINT16 *)frm); frm += 2;
62906 + cie->ie_capInfo = A_LE2CPU16(*(A_UINT16 *)frm); frm += 2;
62907 + cie->ie_chan = 0;
62908 +
62909 + while (frm < efrm) {
62910 + switch (*frm) {
62911 + case IEEE80211_ELEMID_SSID:
62912 + cie->ie_ssid = frm;
62913 + break;
62914 + case IEEE80211_ELEMID_RATES:
62915 + cie->ie_rates = frm;
62916 + break;
62917 + case IEEE80211_ELEMID_COUNTRY:
62918 + cie->ie_country = frm;
62919 + break;
62920 + case IEEE80211_ELEMID_FHPARMS:
62921 + break;
62922 + case IEEE80211_ELEMID_DSPARMS:
62923 + cie->ie_chan = frm[2];
62924 + break;
62925 + case IEEE80211_ELEMID_TIM:
62926 + cie->ie_tim = frm;
62927 + break;
62928 + case IEEE80211_ELEMID_IBSSPARMS:
62929 + break;
62930 + case IEEE80211_ELEMID_XRATES:
62931 + cie->ie_xrates = frm;
62932 + break;
62933 + case IEEE80211_ELEMID_ERP:
62934 + if (frm[1] != 1) {
62935 + //A_PRINTF("Discarding ERP Element - Bad Len\n");
62936 + return A_EINVAL;
62937 + }
62938 + cie->ie_erp = frm[2];
62939 + break;
62940 + case IEEE80211_ELEMID_RSN:
62941 + cie->ie_rsn = frm;
62942 + break;
62943 + case IEEE80211_ELEMID_VENDOR:
62944 + if (iswpaoui(frm)) {
62945 + cie->ie_wpa = frm;
62946 + } else if (iswmmoui(frm)) {
62947 + cie->ie_wmm = frm;
62948 + } else if (isatherosoui(frm)) {
62949 + cie->ie_ath = frm;
62950 + } else if(iswscoui(frm)) {
62951 + cie->ie_wsc = frm;
62952 + }
62953 + break;
62954 + default:
62955 + break;
62956 + }
62957 + frm += frm[1] + 2;
62958 + }
62959 + IEEE80211_VERIFY_ELEMENT(cie->ie_rates, IEEE80211_RATE_MAXSIZE);
62960 + IEEE80211_VERIFY_ELEMENT(cie->ie_ssid, IEEE80211_NWID_LEN);
62961 +
62962 + return A_OK;
62963 +}
62964 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wlan/wlan_utils.c
62965 ===================================================================
62966 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
62967 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wlan/wlan_utils.c 2008-12-11 22:46:49.000000000 +0100
62968 @@ -0,0 +1,59 @@
62969 +/*
62970 + * Copyright (c) 2004-2005 Atheros Communications Inc.
62971 + * All rights reserved.
62972 + *
62973 + * This module implements frequently used wlan utilies
62974 + *
62975 + * $Id: //depot/sw/releases/olca2.0-GPL/host/wlan/src/wlan_utils.c#1 $
62976 + *
62977 + *
62978 + * This program is free software; you can redistribute it and/or modify
62979 + * it under the terms of the GNU General Public License version 2 as
62980 + * published by the Free Software Foundation;
62981 + *
62982 + * Software distributed under the License is distributed on an "AS
62983 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
62984 + * implied. See the License for the specific language governing
62985 + * rights and limitations under the License.
62986 + *
62987 + *
62988 + *
62989 + */
62990 +
62991 +#include <a_config.h>
62992 +#include <athdefs.h>
62993 +#include <a_types.h>
62994 +#include <a_osapi.h>
62995 +
62996 +/*
62997 + * converts ieee channel number to frequency
62998 + */
62999 +A_UINT16
63000 +wlan_ieee2freq(int chan)
63001 +{
63002 + if (chan == 14) {
63003 + return 2484;
63004 + }
63005 + if (chan < 14) { /* 0-13 */
63006 + return (2407 + (chan*5));
63007 + }
63008 + if (chan < 27) { /* 15-26 */
63009 + return (2512 + ((chan-15)*20));
63010 + }
63011 + return (5000 + (chan*5));
63012 +}
63013 +
63014 +/*
63015 + * Converts MHz frequency to IEEE channel number.
63016 + */
63017 +A_UINT32
63018 +wlan_freq2ieee(A_UINT16 freq)
63019 +{
63020 + if (freq == 2484)
63021 + return 14;
63022 + if (freq < 2484)
63023 + return (freq - 2407) / 5;
63024 + if (freq < 5000)
63025 + return 15 + ((freq - 2512) / 20);
63026 + return (freq - 5000) / 5;
63027 +}
63028 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wmi/wmi.c
63029 ===================================================================
63030 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
63031 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wmi/wmi.c 2008-12-11 22:46:49.000000000 +0100
63032 @@ -0,0 +1,3954 @@
63033 +/*
63034 + * Copyright (c) 2004-2007 Atheros Communications Inc.
63035 + * All rights reserved.
63036 + *
63037 + * This module implements the hardware independent layer of the
63038 + * Wireless Module Interface (WMI) protocol.
63039 + *
63040 + * $Id: //depot/sw/releases/olca2.0-GPL/host/wmi/wmi.c#3 $
63041 + *
63042 + *
63043 + * This program is free software; you can redistribute it and/or modify
63044 + * it under the terms of the GNU General Public License version 2 as
63045 + * published by the Free Software Foundation;
63046 + *
63047 + * Software distributed under the License is distributed on an "AS
63048 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
63049 + * implied. See the License for the specific language governing
63050 + * rights and limitations under the License.
63051 + *
63052 + *
63053 + *
63054 + */
63055 +
63056 +#include <a_config.h>
63057 +#include <athdefs.h>
63058 +#include <a_types.h>
63059 +#include <a_osapi.h>
63060 +#include "htc.h"
63061 +#include "htc_api.h"
63062 +#include "wmi.h"
63063 +#include <ieee80211.h>
63064 +#include <ieee80211_node.h>
63065 +#include <wlan_api.h>
63066 +#include <wmi_api.h>
63067 +#include "dset_api.h"
63068 +#include "gpio_api.h"
63069 +#include "wmi_host.h"
63070 +#include "a_drv.h"
63071 +#include "a_drv_api.h"
63072 +#include "a_debug.h"
63073 +#include "dbglog_api.h"
63074 +
63075 +static A_STATUS wmi_ready_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63076 +
63077 +static A_STATUS wmi_connect_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63078 + int len);
63079 +static A_STATUS wmi_disconnect_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63080 + int len);
63081 +static A_STATUS wmi_tkip_micerr_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63082 + int len);
63083 +static A_STATUS wmi_bssInfo_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63084 + int len);
63085 +static A_STATUS wmi_opt_frame_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63086 + int len);
63087 +static A_STATUS wmi_pstream_timeout_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63088 + int len);
63089 +static A_STATUS wmi_sync_point(struct wmi_t *wmip);
63090 +
63091 +static A_STATUS wmi_bitrate_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
63092 + int len);
63093 +static A_STATUS wmi_ratemask_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
63094 + int len);
63095 +static A_STATUS wmi_channelList_reply_rx(struct wmi_t *wmip, A_UINT8 *datap,
63096 + int len);
63097 +static A_STATUS wmi_regDomain_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63098 + int len);
63099 +static A_STATUS wmi_txPwr_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63100 +static A_STATUS wmi_neighborReport_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63101 + int len);
63102 +
63103 +static A_STATUS wmi_dset_open_req_rx(struct wmi_t *wmip, A_UINT8 *datap,
63104 + int len);
63105 +#ifdef CONFIG_HOST_DSET_SUPPORT
63106 +static A_STATUS wmi_dset_close_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63107 +static A_STATUS wmi_dset_data_req_rx(struct wmi_t *wmip, A_UINT8 *datap,
63108 + int len);
63109 +#endif /* CONFIG_HOST_DSET_SUPPORT */
63110 +
63111 +
63112 +static A_STATUS wmi_scanComplete_rx(struct wmi_t *wmip, A_UINT8 *datap,
63113 + int len);
63114 +static A_STATUS wmi_errorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63115 +static A_STATUS wmi_statsEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63116 +static A_STATUS wmi_rssiThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63117 +static A_STATUS wmi_hbChallengeResp_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63118 +static A_STATUS wmi_reportErrorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63119 +static A_STATUS wmi_cac_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63120 +static A_STATUS wmi_roam_tbl_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63121 + int len);
63122 +static A_STATUS wmi_roam_data_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63123 + int len);
63124 +static A_STATUS wmi_get_wow_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap,
63125 + int len);
63126 +static A_STATUS
63127 +wmi_get_pmkid_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, A_UINT32 len);
63128 +
63129 +#ifdef CONFIG_HOST_GPIO_SUPPORT
63130 +static A_STATUS wmi_gpio_intr_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63131 +static A_STATUS wmi_gpio_data_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63132 +static A_STATUS wmi_gpio_ack_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63133 +#endif /* CONFIG_HOST_GPIO_SUPPORT */
63134 +
63135 +#ifdef CONFIG_HOST_TCMD_SUPPORT
63136 +static A_STATUS
63137 +wmi_tcmd_test_report_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63138 +#endif
63139 +
63140 +static A_STATUS
63141 +wmi_txRetryErrEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63142 +
63143 +static A_STATUS
63144 +wmi_snrThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63145 +
63146 +static A_STATUS
63147 +wmi_lqThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63148 +
63149 +static A_BOOL
63150 +wmi_is_bitrate_index_valid(struct wmi_t *wmip, A_UINT32 rateIndex);
63151 +
63152 +static A_STATUS
63153 +wmi_aplistEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63154 +
63155 +static A_STATUS
63156 +wmi_dbglog_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63157 +
63158 +static A_STATUS wmi_keepalive_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len);
63159 +
63160 +int wps_enable;
63161 +static const A_INT32 wmi_rateTable[] = {
63162 + 1000,
63163 + 2000,
63164 + 5500,
63165 + 11000,
63166 + 6000,
63167 + 9000,
63168 + 12000,
63169 + 18000,
63170 + 24000,
63171 + 36000,
63172 + 48000,
63173 + 54000,
63174 + 0};
63175 +
63176 +#define MODE_A_SUPPORT_RATE_START 4
63177 +#define MODE_A_SUPPORT_RATE_STOP 11
63178 +
63179 +#define MODE_GONLY_SUPPORT_RATE_START MODE_A_SUPPORT_RATE_START
63180 +#define MODE_GONLY_SUPPORT_RATE_STOP MODE_A_SUPPORT_RATE_STOP
63181 +
63182 +#define MODE_B_SUPPORT_RATE_START 0
63183 +#define MODE_B_SUPPORT_RATE_STOP 3
63184 +
63185 +#define MODE_G_SUPPORT_RATE_START 0
63186 +#define MODE_G_SUPPORT_RATE_STOP 11
63187 +
63188 +#define MAX_NUMBER_OF_SUPPORT_RATES (MODE_G_SUPPORT_RATE_STOP + 1)
63189 +
63190 +/* 802.1d to AC mapping. Refer pg 57 of WMM-test-plan-v1.2 */
63191 +const A_UINT8 up_to_ac[]= {
63192 + WMM_AC_BE,
63193 + WMM_AC_BK,
63194 + WMM_AC_BK,
63195 + WMM_AC_BE,
63196 + WMM_AC_VI,
63197 + WMM_AC_VI,
63198 + WMM_AC_VO,
63199 + WMM_AC_VO,
63200 + };
63201 +
63202 +void *
63203 +wmi_init(void *devt)
63204 +{
63205 + struct wmi_t *wmip;
63206 +
63207 + wmip = A_MALLOC(sizeof(struct wmi_t));
63208 + if (wmip == NULL) {
63209 + return (NULL);
63210 + }
63211 + A_MEMZERO(wmip, sizeof(*wmip));
63212 + A_MUTEX_INIT(&wmip->wmi_lock);
63213 + wmip->wmi_devt = devt;
63214 + wlan_node_table_init(wmip, &wmip->wmi_scan_table);
63215 + wmi_qos_state_init(wmip);
63216 + wmip->wmi_powerMode = REC_POWER;
63217 + wmip->wmi_phyMode = WMI_11G_MODE;
63218 +
63219 + return (wmip);
63220 +}
63221 +
63222 +void
63223 +wmi_qos_state_init(struct wmi_t *wmip)
63224 +{
63225 + A_UINT8 i;
63226 +
63227 + if (wmip == NULL) {
63228 + return;
63229 + }
63230 + LOCK_WMI(wmip);
63231 +
63232 + /* Initialize QoS States */
63233 + wmip->wmi_numQoSStream = 0;
63234 +
63235 + wmip->wmi_fatPipeExists = 0;
63236 +
63237 + for (i=0; i < WMM_NUM_AC; i++) {
63238 + wmip->wmi_streamExistsForAC[i]=0;
63239 + }
63240 +
63241 + /* Initialize the static Wmi stream Pri to WMM AC mappings Arrays */
63242 + WMI_INIT_WMISTREAM_AC_MAP(wmip);
63243 +
63244 + UNLOCK_WMI(wmip);
63245 +
63246 + A_WMI_SET_NUMDATAENDPTS(wmip->wmi_devt, 1);
63247 +}
63248 +
63249 +void
63250 +wmi_shutdown(struct wmi_t *wmip)
63251 +{
63252 + if (wmip != NULL) {
63253 + wlan_node_table_cleanup(&wmip->wmi_scan_table);
63254 + if (A_IS_MUTEX_VALID(&wmip->wmi_lock)) {
63255 + A_MUTEX_DELETE(&wmip->wmi_lock);
63256 + }
63257 + A_FREE(wmip);
63258 + }
63259 +}
63260 +
63261 +/*
63262 + * performs DIX to 802.3 encapsulation for transmit packets.
63263 + * uses passed in buffer. Returns buffer or NULL if failed.
63264 + * Assumes the entire DIX header is contigous and that there is
63265 + * enough room in the buffer for a 802.3 mac header and LLC+SNAP headers.
63266 + */
63267 +A_STATUS
63268 +wmi_dix_2_dot3(struct wmi_t *wmip, void *osbuf)
63269 +{
63270 + A_UINT8 *datap;
63271 + A_UINT16 typeorlen;
63272 + ATH_MAC_HDR macHdr;
63273 + ATH_LLC_SNAP_HDR *llcHdr;
63274 +
63275 + A_ASSERT(osbuf != NULL);
63276 +
63277 + if (A_NETBUF_HEADROOM(osbuf) <
63278 + (sizeof(ATH_LLC_SNAP_HDR) + sizeof(WMI_DATA_HDR)))
63279 + {
63280 + return A_NO_MEMORY;
63281 + }
63282 +
63283 + datap = A_NETBUF_DATA(osbuf);
63284 +
63285 + typeorlen = *(A_UINT16 *)(datap + ATH_MAC_LEN + ATH_MAC_LEN);
63286 +
63287 + if (!IS_ETHERTYPE(A_BE2CPU16(typeorlen))) {
63288 + /*
63289 + * packet is already in 802.3 format - return success
63290 + */
63291 + A_DPRINTF(DBG_WMI, (DBGFMT "packet already 802.3\n", DBGARG));
63292 + return (A_OK);
63293 + }
63294 +
63295 + /*
63296 + * Save mac fields and length to be inserted later
63297 + */
63298 + A_MEMCPY(macHdr.dstMac, datap, ATH_MAC_LEN);
63299 + A_MEMCPY(macHdr.srcMac, datap + ATH_MAC_LEN, ATH_MAC_LEN);
63300 + macHdr.typeOrLen = A_CPU2BE16(A_NETBUF_LEN(osbuf) - sizeof(ATH_MAC_HDR) +
63301 + sizeof(ATH_LLC_SNAP_HDR));
63302 +
63303 + /*
63304 + * Make room for LLC+SNAP headers
63305 + */
63306 + if (A_NETBUF_PUSH(osbuf, sizeof(ATH_LLC_SNAP_HDR)) != A_OK) {
63307 + return A_NO_MEMORY;
63308 + }
63309 +
63310 + datap = A_NETBUF_DATA(osbuf);
63311 +
63312 + A_MEMCPY(datap, &macHdr, sizeof (ATH_MAC_HDR));
63313 +
63314 + llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(ATH_MAC_HDR));
63315 + llcHdr->dsap = 0xAA;
63316 + llcHdr->ssap = 0xAA;
63317 + llcHdr->cntl = 0x03;
63318 + llcHdr->orgCode[0] = 0x0;
63319 + llcHdr->orgCode[1] = 0x0;
63320 + llcHdr->orgCode[2] = 0x0;
63321 + llcHdr->etherType = typeorlen;
63322 +
63323 + return (A_OK);
63324 +}
63325 +
63326 +/*
63327 + * Adds a WMI data header
63328 + * Assumes there is enough room in the buffer to add header.
63329 + */
63330 +A_STATUS
63331 +wmi_data_hdr_add(struct wmi_t *wmip, void *osbuf, A_UINT8 msgType)
63332 +{
63333 + WMI_DATA_HDR *dtHdr;
63334 +
63335 + A_ASSERT(osbuf != NULL);
63336 +
63337 + if (A_NETBUF_PUSH(osbuf, sizeof(WMI_DATA_HDR)) != A_OK) {
63338 + return A_NO_MEMORY;
63339 + }
63340 +
63341 + dtHdr = (WMI_DATA_HDR *)A_NETBUF_DATA(osbuf);
63342 + dtHdr->info = msgType;
63343 + dtHdr->rssi = 0;
63344 +
63345 + return (A_OK);
63346 +}
63347 +
63348 +A_UINT8 wmi_implicit_create_pstream(struct wmi_t *wmip, void *osbuf, A_UINT8 dir, A_UINT8 up)
63349 +{
63350 + A_UINT8 *datap;
63351 + A_UINT8 trafficClass = WMM_AC_BE, userPriority = up;
63352 + ATH_LLC_SNAP_HDR *llcHdr;
63353 + A_UINT16 ipType = IP_ETHERTYPE;
63354 + WMI_DATA_HDR *dtHdr;
63355 + WMI_CREATE_PSTREAM_CMD cmd;
63356 + A_BOOL streamExists = FALSE;
63357 +
63358 + A_ASSERT(osbuf != NULL);
63359 +
63360 + datap = A_NETBUF_DATA(osbuf);
63361 +
63362 + if (up == UNDEFINED_PRI) {
63363 + llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(WMI_DATA_HDR) +
63364 + sizeof(ATH_MAC_HDR));
63365 +
63366 + if (llcHdr->etherType == A_CPU2BE16(ipType)) {
63367 + /* Extract the endpoint info from the TOS field in the IP header */
63368 + userPriority = A_WMI_IPTOS_TO_USERPRIORITY(((A_UINT8 *)llcHdr) + sizeof(ATH_LLC_SNAP_HDR));
63369 + }
63370 + }
63371 +
63372 + if (userPriority < MAX_NUM_PRI) {
63373 + trafficClass = convert_userPriority_to_trafficClass(userPriority);
63374 + }
63375 +
63376 + dtHdr = (WMI_DATA_HDR *)datap;
63377 + if(dir==UPLINK_TRAFFIC)
63378 + dtHdr->info |= (userPriority & WMI_DATA_HDR_UP_MASK) << WMI_DATA_HDR_UP_SHIFT; /* lower 3-bits are 802.1d priority */
63379 +
63380 + LOCK_WMI(wmip);
63381 + streamExists = wmip->wmi_fatPipeExists;
63382 + UNLOCK_WMI(wmip);
63383 +
63384 + if (!(streamExists & (1 << trafficClass))) {
63385 +
63386 + A_MEMZERO(&cmd, sizeof(cmd));
63387 + cmd.trafficClass = trafficClass;
63388 + cmd.userPriority = userPriority;
63389 + cmd.inactivityInt = WMI_IMPLICIT_PSTREAM_INACTIVITY_INT;
63390 + /* Implicit streams are created with TSID 0xFF */
63391 + cmd.tsid = WMI_IMPLICIT_PSTREAM;
63392 + wmi_create_pstream_cmd(wmip, &cmd);
63393 + }
63394 +
63395 + return trafficClass;
63396 +}
63397 +
63398 +WMI_PRI_STREAM_ID
63399 +wmi_get_stream_id(struct wmi_t *wmip, A_UINT8 trafficClass)
63400 +{
63401 + return WMI_ACCESSCATEGORY_WMISTREAM(wmip, trafficClass);
63402 +}
63403 +
63404 +/*
63405 + * performs 802.3 to DIX encapsulation for received packets.
63406 + * Assumes the entire 802.3 header is contigous.
63407 + */
63408 +A_STATUS
63409 +wmi_dot3_2_dix(struct wmi_t *wmip, void *osbuf)
63410 +{
63411 + A_UINT8 *datap;
63412 + ATH_MAC_HDR macHdr;
63413 + ATH_LLC_SNAP_HDR *llcHdr;
63414 +
63415 + A_ASSERT(osbuf != NULL);
63416 + datap = A_NETBUF_DATA(osbuf);
63417 +
63418 + A_MEMCPY(&macHdr, datap, sizeof(ATH_MAC_HDR));
63419 + llcHdr = (ATH_LLC_SNAP_HDR *)(datap + sizeof(ATH_MAC_HDR));
63420 + macHdr.typeOrLen = llcHdr->etherType;
63421 +
63422 + if (A_NETBUF_PULL(osbuf, sizeof(ATH_LLC_SNAP_HDR)) != A_OK) {
63423 + return A_NO_MEMORY;
63424 + }
63425 +
63426 + datap = A_NETBUF_DATA(osbuf);
63427 +
63428 + A_MEMCPY(datap, &macHdr, sizeof (ATH_MAC_HDR));
63429 +
63430 + return (A_OK);
63431 +}
63432 +
63433 +/*
63434 + * Removes a WMI data header
63435 + */
63436 +A_STATUS
63437 +wmi_data_hdr_remove(struct wmi_t *wmip, void *osbuf)
63438 +{
63439 + A_ASSERT(osbuf != NULL);
63440 +
63441 + return (A_NETBUF_PULL(osbuf, sizeof(WMI_DATA_HDR)));
63442 +}
63443 +
63444 +void
63445 +wmi_iterate_nodes(struct wmi_t *wmip, wlan_node_iter_func *f, void *arg)
63446 +{
63447 + wlan_iterate_nodes(&wmip->wmi_scan_table, f, arg);
63448 +}
63449 +
63450 +/*
63451 + * WMI Extended Event received from Target.
63452 + */
63453 +A_STATUS
63454 +wmi_control_rx_xtnd(struct wmi_t *wmip, void *osbuf)
63455 +{
63456 + WMIX_CMD_HDR *cmd;
63457 + A_UINT16 id;
63458 + A_UINT8 *datap;
63459 + A_UINT32 len;
63460 + A_STATUS status = A_OK;
63461 +
63462 + if (A_NETBUF_LEN(osbuf) < sizeof(WMIX_CMD_HDR)) {
63463 + A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 1\n", DBGARG));
63464 + wmip->wmi_stats.cmd_len_err++;
63465 + A_NETBUF_FREE(osbuf);
63466 + return A_ERROR;
63467 + }
63468 +
63469 + cmd = (WMIX_CMD_HDR *)A_NETBUF_DATA(osbuf);
63470 + id = cmd->commandId;
63471 +
63472 + if (A_NETBUF_PULL(osbuf, sizeof(WMIX_CMD_HDR)) != A_OK) {
63473 + A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 2\n", DBGARG));
63474 + wmip->wmi_stats.cmd_len_err++;
63475 + A_NETBUF_FREE(osbuf);
63476 + return A_ERROR;
63477 + }
63478 +
63479 + datap = A_NETBUF_DATA(osbuf);
63480 + len = A_NETBUF_LEN(osbuf);
63481 +
63482 + switch (id) {
63483 + case (WMIX_DSETOPENREQ_EVENTID):
63484 + status = wmi_dset_open_req_rx(wmip, datap, len);
63485 + break;
63486 +#ifdef CONFIG_HOST_DSET_SUPPORT
63487 + case (WMIX_DSETCLOSE_EVENTID):
63488 + status = wmi_dset_close_rx(wmip, datap, len);
63489 + break;
63490 + case (WMIX_DSETDATAREQ_EVENTID):
63491 + status = wmi_dset_data_req_rx(wmip, datap, len);
63492 + break;
63493 +#endif /* CONFIG_HOST_DSET_SUPPORT */
63494 +#ifdef CONFIG_HOST_GPIO_SUPPORT
63495 + case (WMIX_GPIO_INTR_EVENTID):
63496 + wmi_gpio_intr_rx(wmip, datap, len);
63497 + break;
63498 + case (WMIX_GPIO_DATA_EVENTID):
63499 + wmi_gpio_data_rx(wmip, datap, len);
63500 + break;
63501 + case (WMIX_GPIO_ACK_EVENTID):
63502 + wmi_gpio_ack_rx(wmip, datap, len);
63503 + break;
63504 +#endif /* CONFIG_HOST_GPIO_SUPPORT */
63505 + case (WMIX_HB_CHALLENGE_RESP_EVENTID):
63506 + wmi_hbChallengeResp_rx(wmip, datap, len);
63507 + break;
63508 + case (WMIX_DBGLOG_EVENTID):
63509 + wmi_dbglog_event_rx(wmip, datap, len);
63510 + break;
63511 + default:
63512 + A_DPRINTF(DBG_WMI|DBG_ERROR,
63513 + (DBGFMT "Unknown id 0x%x\n", DBGARG, id));
63514 + wmip->wmi_stats.cmd_id_err++;
63515 + status = A_ERROR;
63516 + break;
63517 + }
63518 +
63519 + return status;
63520 +}
63521 +
63522 +/*
63523 + * Control Path
63524 + */
63525 +A_UINT32 cmdRecvNum;
63526 +
63527 +A_STATUS
63528 +wmi_control_rx(struct wmi_t *wmip, void *osbuf)
63529 +{
63530 + WMI_CMD_HDR *cmd;
63531 + A_UINT16 id;
63532 + A_UINT8 *datap;
63533 + A_UINT32 len, i, loggingReq;
63534 + A_STATUS status = A_OK;
63535 +
63536 + A_ASSERT(osbuf != NULL);
63537 + if (A_NETBUF_LEN(osbuf) < sizeof(WMI_CMD_HDR)) {
63538 + A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 1\n", DBGARG));
63539 + wmip->wmi_stats.cmd_len_err++;
63540 + A_NETBUF_FREE(osbuf);
63541 + return A_ERROR;
63542 + }
63543 +
63544 + cmd = (WMI_CMD_HDR *)A_NETBUF_DATA(osbuf);
63545 + id = cmd->commandId;
63546 +
63547 + if (A_NETBUF_PULL(osbuf, sizeof(WMI_CMD_HDR)) != A_OK) {
63548 + A_DPRINTF(DBG_WMI, (DBGFMT "bad packet 2\n", DBGARG));
63549 + wmip->wmi_stats.cmd_len_err++;
63550 + A_NETBUF_FREE(osbuf);
63551 + return A_ERROR;
63552 + }
63553 +
63554 + datap = A_NETBUF_DATA(osbuf);
63555 + len = A_NETBUF_LEN(osbuf);
63556 +
63557 + ar6000_get_driver_cfg(wmip->wmi_devt,
63558 + AR6000_DRIVER_CFG_LOG_RAW_WMI_MSGS,
63559 + &loggingReq);
63560 +
63561 + if(loggingReq) {
63562 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("WMI %d \n",id));
63563 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("WMI recv, MsgNo %d : ", cmdRecvNum));
63564 + for(i = 0; i < len; i++)
63565 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("%x ", datap[i]));
63566 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("\n"));
63567 + }
63568 +
63569 + LOCK_WMI(wmip);
63570 + cmdRecvNum++;
63571 + UNLOCK_WMI(wmip);
63572 +
63573 + switch (id) {
63574 + case (WMI_GET_BITRATE_CMDID):
63575 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_BITRATE_CMDID\n", DBGARG));
63576 + status = wmi_bitrate_reply_rx(wmip, datap, len);
63577 + break;
63578 + case (WMI_GET_CHANNEL_LIST_CMDID):
63579 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_CHANNEL_LIST_CMDID\n", DBGARG));
63580 + status = wmi_channelList_reply_rx(wmip, datap, len);
63581 + break;
63582 + case (WMI_GET_TX_PWR_CMDID):
63583 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_TX_PWR_CMDID\n", DBGARG));
63584 + status = wmi_txPwr_reply_rx(wmip, datap, len);
63585 + break;
63586 + case (WMI_READY_EVENTID):
63587 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_READY_EVENTID\n", DBGARG));
63588 + status = wmi_ready_event_rx(wmip, datap, len);
63589 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63590 + A_WMI_DBGLOG_INIT_DONE(wmip->wmi_devt);
63591 + break;
63592 + case (WMI_CONNECT_EVENTID):
63593 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CONNECT_EVENTID\n", DBGARG));
63594 + status = wmi_connect_event_rx(wmip, datap, len);
63595 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63596 + break;
63597 + case (WMI_DISCONNECT_EVENTID):
63598 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_DISCONNECT_EVENTID\n", DBGARG));
63599 + status = wmi_disconnect_event_rx(wmip, datap, len);
63600 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63601 + break;
63602 + case (WMI_TKIP_MICERR_EVENTID):
63603 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TKIP_MICERR_EVENTID\n", DBGARG));
63604 + status = wmi_tkip_micerr_event_rx(wmip, datap, len);
63605 + break;
63606 + case (WMI_BSSINFO_EVENTID):
63607 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_BSSINFO_EVENTID\n", DBGARG));
63608 + status = wmi_bssInfo_event_rx(wmip, datap, len);
63609 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63610 + break;
63611 + case (WMI_REGDOMAIN_EVENTID):
63612 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REGDOMAIN_EVENTID\n", DBGARG));
63613 + status = wmi_regDomain_event_rx(wmip, datap, len);
63614 + break;
63615 + case (WMI_PSTREAM_TIMEOUT_EVENTID):
63616 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_PSTREAM_TIMEOUT_EVENTID\n", DBGARG));
63617 + status = wmi_pstream_timeout_event_rx(wmip, datap, len);
63618 + /* pstreams are fatpipe abstractions that get implicitly created.
63619 + * User apps only deal with thinstreams. creation of a thinstream
63620 + * by the user or data traffic flow in an AC triggers implicit
63621 + * pstream creation. Do we need to send this event to App..?
63622 + * no harm in sending it.
63623 + */
63624 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63625 + break;
63626 + case (WMI_NEIGHBOR_REPORT_EVENTID):
63627 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_NEIGHBOR_REPORT_EVENTID\n", DBGARG));
63628 + status = wmi_neighborReport_event_rx(wmip, datap, len);
63629 + break;
63630 + case (WMI_SCAN_COMPLETE_EVENTID):
63631 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_SCAN_COMPLETE_EVENTID\n", DBGARG));
63632 + status = wmi_scanComplete_rx(wmip, datap, len);
63633 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63634 + break;
63635 + case (WMI_CMDERROR_EVENTID):
63636 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CMDERROR_EVENTID\n", DBGARG));
63637 + status = wmi_errorEvent_rx(wmip, datap, len);
63638 + break;
63639 + case (WMI_REPORT_STATISTICS_EVENTID):
63640 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_STATISTICS_EVENTID\n", DBGARG));
63641 + status = wmi_statsEvent_rx(wmip, datap, len);
63642 + break;
63643 + case (WMI_RSSI_THRESHOLD_EVENTID):
63644 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_RSSI_THRESHOLD_EVENTID\n", DBGARG));
63645 + status = wmi_rssiThresholdEvent_rx(wmip, datap, len);
63646 + break;
63647 + case (WMI_ERROR_REPORT_EVENTID):
63648 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_ERROR_REPORT_EVENTID\n", DBGARG));
63649 + status = wmi_reportErrorEvent_rx(wmip, datap, len);
63650 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63651 + break;
63652 + case (WMI_OPT_RX_FRAME_EVENTID):
63653 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_OPT_RX_FRAME_EVENTID\n", DBGARG));
63654 + status = wmi_opt_frame_event_rx(wmip, datap, len);
63655 + break;
63656 + case (WMI_REPORT_ROAM_TBL_EVENTID):
63657 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_ROAM_TBL_EVENTID\n", DBGARG));
63658 + status = wmi_roam_tbl_event_rx(wmip, datap, len);
63659 + break;
63660 + case (WMI_EXTENSION_EVENTID):
63661 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_EXTENSION_EVENTID\n", DBGARG));
63662 + status = wmi_control_rx_xtnd(wmip, osbuf);
63663 + break;
63664 + case (WMI_CAC_EVENTID):
63665 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_CAC_EVENTID\n", DBGARG));
63666 + status = wmi_cac_event_rx(wmip, datap, len);
63667 + break;
63668 + case (WMI_REPORT_ROAM_DATA_EVENTID):
63669 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_REPORT_ROAM_DATA_EVENTID\n", DBGARG));
63670 + status = wmi_roam_data_event_rx(wmip, datap, len);
63671 + break;
63672 +#ifdef CONFIG_HOST_TCMD_SUPPORT
63673 + case (WMI_TEST_EVENTID):
63674 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TEST_EVENTID\n", DBGARG));
63675 + status = wmi_tcmd_test_report_rx(wmip, datap, len);
63676 + break;
63677 +#endif
63678 + case (WMI_GET_FIXRATES_CMDID):
63679 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_FIXRATES_CMDID\n", DBGARG));
63680 + status = wmi_ratemask_reply_rx(wmip, datap, len);
63681 + break;
63682 + case (WMI_TX_RETRY_ERR_EVENTID):
63683 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_TX_RETRY_ERR_EVENTID\n", DBGARG));
63684 + status = wmi_txRetryErrEvent_rx(wmip, datap, len);
63685 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63686 + break;
63687 + case (WMI_SNR_THRESHOLD_EVENTID):
63688 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_SNR_THRESHOLD_EVENTID\n", DBGARG));
63689 + status = wmi_snrThresholdEvent_rx(wmip, datap, len);
63690 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63691 + break;
63692 + case (WMI_LQ_THRESHOLD_EVENTID):
63693 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_LQ_THRESHOLD_EVENTID\n", DBGARG));
63694 + status = wmi_lqThresholdEvent_rx(wmip, datap, len);
63695 + A_WMI_SEND_EVENT_TO_APP(wmip->wmi_devt, id, datap, len);
63696 + break;
63697 + case (WMI_APLIST_EVENTID):
63698 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Received APLIST Event\n"));
63699 + status = wmi_aplistEvent_rx(wmip, datap, len);
63700 + break;
63701 + case (WMI_GET_KEEPALIVE_CMDID):
63702 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_KEEPALIVE_CMDID\n", DBGARG));
63703 + status = wmi_keepalive_reply_rx(wmip, datap, len);
63704 + break;
63705 + case (WMI_GET_WOW_LIST_EVENTID):
63706 + status = wmi_get_wow_list_event_rx(wmip, datap, len);
63707 + break;
63708 + case (WMI_GET_PMKID_LIST_EVENTID):
63709 + A_DPRINTF(DBG_WMI, (DBGFMT "WMI_GET_PMKID_LIST Event\n", DBGARG));
63710 + status = wmi_get_pmkid_list_event_rx(wmip, datap, len);
63711 + break;
63712 + default:
63713 + A_DPRINTF(DBG_WMI|DBG_ERROR,
63714 + (DBGFMT "Unknown id 0x%x\n", DBGARG, id));
63715 + wmip->wmi_stats.cmd_id_err++;
63716 + status = A_ERROR;
63717 + break;
63718 + }
63719 +
63720 + A_NETBUF_FREE(osbuf);
63721 +
63722 + return status;
63723 +}
63724 +
63725 +static A_STATUS
63726 +wmi_ready_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63727 +{
63728 + WMI_READY_EVENT *ev = (WMI_READY_EVENT *)datap;
63729 +
63730 + if (len < sizeof(WMI_READY_EVENT)) {
63731 + return A_EINVAL;
63732 + }
63733 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
63734 + wmip->wmi_ready = TRUE;
63735 + A_WMI_READY_EVENT(wmip->wmi_devt, ev->macaddr, ev->phyCapability);
63736 +
63737 + return A_OK;
63738 +}
63739 +
63740 +static A_STATUS
63741 +wmi_connect_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63742 +{
63743 + WMI_CONNECT_EVENT *ev;
63744 +
63745 + if (len < sizeof(WMI_CONNECT_EVENT)) {
63746 + return A_EINVAL;
63747 + }
63748 + ev = (WMI_CONNECT_EVENT *)datap;
63749 + A_DPRINTF(DBG_WMI,
63750 + (DBGFMT "freq %d bssid %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
63751 + DBGARG, ev->channel,
63752 + ev->bssid[0], ev->bssid[1], ev->bssid[2],
63753 + ev->bssid[3], ev->bssid[4], ev->bssid[5]));
63754 +
63755 + A_MEMCPY(wmip->wmi_bssid, ev->bssid, ATH_MAC_LEN);
63756 +
63757 + A_WMI_CONNECT_EVENT(wmip->wmi_devt, ev->channel, ev->bssid,
63758 + ev->listenInterval, ev->beaconInterval,
63759 + ev->networkType, ev->beaconIeLen,
63760 + ev->assocReqLen, ev->assocRespLen,
63761 + ev->assocInfo);
63762 +
63763 + return A_OK;
63764 +}
63765 +
63766 +static A_STATUS
63767 +wmi_regDomain_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63768 +{
63769 + WMI_REG_DOMAIN_EVENT *ev;
63770 +
63771 + if (len < sizeof(*ev)) {
63772 + return A_EINVAL;
63773 + }
63774 + ev = (WMI_REG_DOMAIN_EVENT *)datap;
63775 +
63776 + A_WMI_REGDOMAIN_EVENT(wmip->wmi_devt, ev->regDomain);
63777 +
63778 + return A_OK;
63779 +}
63780 +
63781 +static A_STATUS
63782 +wmi_neighborReport_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63783 +{
63784 + WMI_NEIGHBOR_REPORT_EVENT *ev;
63785 + int numAps;
63786 +
63787 + if (len < sizeof(*ev)) {
63788 + return A_EINVAL;
63789 + }
63790 + ev = (WMI_NEIGHBOR_REPORT_EVENT *)datap;
63791 + numAps = ev->numberOfAps;
63792 +
63793 + if (len < (int)(sizeof(*ev) + ((numAps - 1) * sizeof(WMI_NEIGHBOR_INFO)))) {
63794 + return A_EINVAL;
63795 + }
63796 +
63797 + A_WMI_NEIGHBORREPORT_EVENT(wmip->wmi_devt, numAps, ev->neighbor);
63798 +
63799 + return A_OK;
63800 +}
63801 +
63802 +static A_STATUS
63803 +wmi_disconnect_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63804 +{
63805 + WMI_DISCONNECT_EVENT *ev;
63806 +
63807 + if (len < sizeof(WMI_DISCONNECT_EVENT)) {
63808 + return A_EINVAL;
63809 + }
63810 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
63811 +
63812 + ev = (WMI_DISCONNECT_EVENT *)datap;
63813 +
63814 + A_MEMZERO(wmip->wmi_bssid, sizeof(wmip->wmi_bssid));
63815 +
63816 + A_WMI_DISCONNECT_EVENT(wmip->wmi_devt, ev->disconnectReason, ev->bssid,
63817 + ev->assocRespLen, ev->assocInfo, ev->protocolReasonStatus);
63818 +
63819 + return A_OK;
63820 +}
63821 +
63822 +static A_STATUS
63823 +wmi_tkip_micerr_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63824 +{
63825 + WMI_TKIP_MICERR_EVENT *ev;
63826 +
63827 + if (len < sizeof(*ev)) {
63828 + return A_EINVAL;
63829 + }
63830 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
63831 +
63832 + ev = (WMI_TKIP_MICERR_EVENT *)datap;
63833 + A_WMI_TKIP_MICERR_EVENT(wmip->wmi_devt, ev->keyid, ev->ismcast);
63834 +
63835 + return A_OK;
63836 +}
63837 +
63838 +static A_STATUS
63839 +wmi_bssInfo_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63840 +{
63841 + bss_t *bss;
63842 + WMI_BSS_INFO_HDR *bih;
63843 + A_UINT8 *buf;
63844 + A_UINT32 nodeCachingAllowed;
63845 +
63846 + if (len <= sizeof(WMI_BSS_INFO_HDR)) {
63847 + return A_EINVAL;
63848 + }
63849 +
63850 + A_WMI_BSSINFO_EVENT_RX(wmip->wmi_devt, datap, len);
63851 + /* What is driver config for wlan node caching? */
63852 + if(ar6000_get_driver_cfg(wmip->wmi_devt,
63853 + AR6000_DRIVER_CFG_GET_WLANNODECACHING,
63854 + &nodeCachingAllowed) != A_OK) {
63855 + return A_EINVAL;
63856 + }
63857 +
63858 + if(!nodeCachingAllowed) {
63859 + return A_OK;
63860 + }
63861 +
63862 +
63863 + bih = (WMI_BSS_INFO_HDR *)datap;
63864 + buf = datap + sizeof(WMI_BSS_INFO_HDR);
63865 + len -= sizeof(WMI_BSS_INFO_HDR);
63866 +
63867 + A_DPRINTF(DBG_WMI2, (DBGFMT "bssInfo event - ch %u, rssi %02x, "
63868 + "bssid \"%02x:%02x:%02x:%02x:%02x:%02x\"\n", DBGARG,
63869 + bih->channel, (unsigned char) bih->rssi, bih->bssid[0],
63870 + bih->bssid[1], bih->bssid[2], bih->bssid[3], bih->bssid[4],
63871 + bih->bssid[5]));
63872 +
63873 + if(wps_enable && (bih->frameType == PROBERESP_FTYPE) ) {
63874 + printk("%s() A_OK 2\n", __FUNCTION__);
63875 + return A_OK;
63876 + }
63877 +
63878 + bss = wlan_find_node(&wmip->wmi_scan_table, bih->bssid);
63879 + if (bss != NULL) {
63880 + /*
63881 + * Free up the node. Not the most efficient process given
63882 + * we are about to allocate a new node but it is simple and should be
63883 + * adequate.
63884 + */
63885 + wlan_node_reclaim(&wmip->wmi_scan_table, bss);
63886 + }
63887 +
63888 + bss = wlan_node_alloc(&wmip->wmi_scan_table, len);
63889 + if (bss == NULL) {
63890 + return A_NO_MEMORY;
63891 + }
63892 +
63893 + bss->ni_snr = bih->snr;
63894 + bss->ni_rssi = bih->rssi;
63895 + A_ASSERT(bss->ni_buf != NULL);
63896 + A_MEMCPY(bss->ni_buf, buf, len);
63897 +
63898 + if (wlan_parse_beacon(bss->ni_buf, len, &bss->ni_cie) != A_OK) {
63899 + wlan_node_free(bss);
63900 + return A_EINVAL;
63901 + }
63902 +
63903 + /*
63904 + * Update the frequency in ie_chan, overwriting of channel number
63905 + * which is done in wlan_parse_beacon
63906 + */
63907 + bss->ni_cie.ie_chan = bih->channel;
63908 + wlan_setup_node(&wmip->wmi_scan_table, bss, bih->bssid);
63909 +
63910 + return A_OK;
63911 +}
63912 +
63913 +static A_STATUS
63914 +wmi_opt_frame_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63915 +{
63916 + bss_t *bss;
63917 + WMI_OPT_RX_INFO_HDR *bih;
63918 + A_UINT8 *buf;
63919 +
63920 + if (len <= sizeof(WMI_OPT_RX_INFO_HDR)) {
63921 + return A_EINVAL;
63922 + }
63923 +
63924 + bih = (WMI_OPT_RX_INFO_HDR *)datap;
63925 + buf = datap + sizeof(WMI_OPT_RX_INFO_HDR);
63926 + len -= sizeof(WMI_OPT_RX_INFO_HDR);
63927 +
63928 + A_DPRINTF(DBG_WMI2, (DBGFMT "opt frame event %2.2x:%2.2x\n", DBGARG,
63929 + bih->bssid[4], bih->bssid[5]));
63930 +
63931 + bss = wlan_find_node(&wmip->wmi_scan_table, bih->bssid);
63932 + if (bss != NULL) {
63933 + /*
63934 + * Free up the node. Not the most efficient process given
63935 + * we are about to allocate a new node but it is simple and should be
63936 + * adequate.
63937 + */
63938 + wlan_node_reclaim(&wmip->wmi_scan_table, bss);
63939 + }
63940 +
63941 + bss = wlan_node_alloc(&wmip->wmi_scan_table, len);
63942 + if (bss == NULL) {
63943 + return A_NO_MEMORY;
63944 + }
63945 +
63946 + bss->ni_snr = bih->snr;
63947 + bss->ni_cie.ie_chan = bih->channel;
63948 + A_ASSERT(bss->ni_buf != NULL);
63949 + A_MEMCPY(bss->ni_buf, buf, len);
63950 + wlan_setup_node(&wmip->wmi_scan_table, bss, bih->bssid);
63951 +
63952 + return A_OK;
63953 +}
63954 +
63955 + /* This event indicates inactivity timeout of a fatpipe(pstream)
63956 + * at the target
63957 + */
63958 +static A_STATUS
63959 +wmi_pstream_timeout_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63960 +{
63961 + WMI_PSTREAM_TIMEOUT_EVENT *ev;
63962 +
63963 + if (len < sizeof(WMI_PSTREAM_TIMEOUT_EVENT)) {
63964 + return A_EINVAL;
63965 + }
63966 +
63967 + A_DPRINTF(DBG_WMI, (DBGFMT "wmi_pstream_timeout_event_rx\n", DBGARG));
63968 +
63969 + ev = (WMI_PSTREAM_TIMEOUT_EVENT *)datap;
63970 +
63971 + /* When the pstream (fat pipe == AC) timesout, it means there were no
63972 + * thinStreams within this pstream & it got implicitly created due to
63973 + * data flow on this AC. We start the inactivity timer only for
63974 + * implicitly created pstream. Just reset the host state.
63975 + */
63976 + /* Set the activeTsids for this AC to 0 */
63977 + LOCK_WMI(wmip);
63978 + wmip->wmi_streamExistsForAC[ev->trafficClass]=0;
63979 + wmip->wmi_fatPipeExists &= ~(1 << ev->trafficClass);
63980 + UNLOCK_WMI(wmip);
63981 +
63982 + /*Indicate inactivity to driver layer for this fatpipe (pstream)*/
63983 + A_WMI_STREAM_TX_INACTIVE(wmip->wmi_devt, ev->trafficClass);
63984 +
63985 + return A_OK;
63986 +}
63987 +
63988 +static A_STATUS
63989 +wmi_bitrate_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
63990 +{
63991 + WMI_BIT_RATE_CMD *reply;
63992 + A_INT32 rate;
63993 +
63994 + if (len < sizeof(WMI_BIT_RATE_CMD)) {
63995 + return A_EINVAL;
63996 + }
63997 + reply = (WMI_BIT_RATE_CMD *)datap;
63998 + A_DPRINTF(DBG_WMI,
63999 + (DBGFMT "Enter - rateindex %d\n", DBGARG, reply->rateIndex));
64000 +
64001 + if (reply->rateIndex == RATE_AUTO) {
64002 + rate = RATE_AUTO;
64003 + } else {
64004 + rate = wmi_rateTable[(A_UINT32) reply->rateIndex];
64005 + }
64006 +
64007 + A_WMI_BITRATE_RX(wmip->wmi_devt, rate);
64008 +
64009 + return A_OK;
64010 +}
64011 +
64012 +static A_STATUS
64013 +wmi_ratemask_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64014 +{
64015 + WMI_FIX_RATES_CMD *reply;
64016 +
64017 + if (len < sizeof(WMI_BIT_RATE_CMD)) {
64018 + return A_EINVAL;
64019 + }
64020 + reply = (WMI_FIX_RATES_CMD *)datap;
64021 + A_DPRINTF(DBG_WMI,
64022 + (DBGFMT "Enter - fixed rate mask %x\n", DBGARG, reply->fixRateMask));
64023 +
64024 + A_WMI_RATEMASK_RX(wmip->wmi_devt, reply->fixRateMask);
64025 +
64026 + return A_OK;
64027 +}
64028 +
64029 +static A_STATUS
64030 +wmi_channelList_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64031 +{
64032 + WMI_CHANNEL_LIST_REPLY *reply;
64033 +
64034 + if (len < sizeof(WMI_CHANNEL_LIST_REPLY)) {
64035 + return A_EINVAL;
64036 + }
64037 + reply = (WMI_CHANNEL_LIST_REPLY *)datap;
64038 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64039 +
64040 + A_WMI_CHANNELLIST_RX(wmip->wmi_devt, reply->numChannels,
64041 + reply->channelList);
64042 +
64043 + return A_OK;
64044 +}
64045 +
64046 +static A_STATUS
64047 +wmi_txPwr_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64048 +{
64049 + WMI_TX_PWR_REPLY *reply;
64050 +
64051 + if (len < sizeof(*reply)) {
64052 + return A_EINVAL;
64053 + }
64054 + reply = (WMI_TX_PWR_REPLY *)datap;
64055 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64056 +
64057 + A_WMI_TXPWR_RX(wmip->wmi_devt, reply->dbM);
64058 +
64059 + return A_OK;
64060 +}
64061 +static A_STATUS
64062 +wmi_keepalive_reply_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64063 +{
64064 + WMI_GET_KEEPALIVE_CMD *reply;
64065 +
64066 + if (len < sizeof(*reply)) {
64067 + return A_EINVAL;
64068 + }
64069 + reply = (WMI_GET_KEEPALIVE_CMD *)datap;
64070 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64071 +
64072 + A_WMI_KEEPALIVE_RX(wmip->wmi_devt, reply->configured);
64073 +
64074 + return A_OK;
64075 +}
64076 +
64077 +
64078 +static A_STATUS
64079 +wmi_dset_open_req_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64080 +{
64081 + WMIX_DSETOPENREQ_EVENT *dsetopenreq;
64082 +
64083 + if (len < sizeof(WMIX_DSETOPENREQ_EVENT)) {
64084 + return A_EINVAL;
64085 + }
64086 + dsetopenreq = (WMIX_DSETOPENREQ_EVENT *)datap;
64087 + A_DPRINTF(DBG_WMI,
64088 + (DBGFMT "Enter - dset_id=0x%x\n", DBGARG, dsetopenreq->dset_id));
64089 + A_WMI_DSET_OPEN_REQ(wmip->wmi_devt,
64090 + dsetopenreq->dset_id,
64091 + dsetopenreq->targ_dset_handle,
64092 + dsetopenreq->targ_reply_fn,
64093 + dsetopenreq->targ_reply_arg);
64094 +
64095 + return A_OK;
64096 +}
64097 +
64098 +#ifdef CONFIG_HOST_DSET_SUPPORT
64099 +static A_STATUS
64100 +wmi_dset_close_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64101 +{
64102 + WMIX_DSETCLOSE_EVENT *dsetclose;
64103 +
64104 + if (len < sizeof(WMIX_DSETCLOSE_EVENT)) {
64105 + return A_EINVAL;
64106 + }
64107 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64108 +
64109 + dsetclose = (WMIX_DSETCLOSE_EVENT *)datap;
64110 + A_WMI_DSET_CLOSE(wmip->wmi_devt, dsetclose->access_cookie);
64111 +
64112 + return A_OK;
64113 +}
64114 +
64115 +static A_STATUS
64116 +wmi_dset_data_req_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64117 +{
64118 + WMIX_DSETDATAREQ_EVENT *dsetdatareq;
64119 +
64120 + if (len < sizeof(WMIX_DSETDATAREQ_EVENT)) {
64121 + return A_EINVAL;
64122 + }
64123 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64124 +
64125 + dsetdatareq = (WMIX_DSETDATAREQ_EVENT *)datap;
64126 + A_WMI_DSET_DATA_REQ(wmip->wmi_devt,
64127 + dsetdatareq->access_cookie,
64128 + dsetdatareq->offset,
64129 + dsetdatareq->length,
64130 + dsetdatareq->targ_buf,
64131 + dsetdatareq->targ_reply_fn,
64132 + dsetdatareq->targ_reply_arg);
64133 +
64134 + return A_OK;
64135 +}
64136 +#endif /* CONFIG_HOST_DSET_SUPPORT */
64137 +
64138 +static A_STATUS
64139 +wmi_scanComplete_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64140 +{
64141 + WMI_SCAN_COMPLETE_EVENT *ev;
64142 +
64143 + ev = (WMI_SCAN_COMPLETE_EVENT *)datap;
64144 + A_WMI_SCANCOMPLETE_EVENT(wmip->wmi_devt, ev->status);
64145 +
64146 + return A_OK;
64147 +}
64148 +
64149 +/*
64150 + * Target is reporting a programming error. This is for
64151 + * developer aid only. Target only checks a few common violations
64152 + * and it is responsibility of host to do all error checking.
64153 + * Behavior of target after wmi error event is undefined.
64154 + * A reset is recommended.
64155 + */
64156 +static A_STATUS
64157 +wmi_errorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64158 +{
64159 + WMI_CMD_ERROR_EVENT *ev;
64160 +
64161 + ev = (WMI_CMD_ERROR_EVENT *)datap;
64162 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Programming Error: cmd=%d ", ev->commandId));
64163 + switch (ev->errorCode) {
64164 + case (INVALID_PARAM):
64165 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Illegal Parameter\n"));
64166 + break;
64167 + case (ILLEGAL_STATE):
64168 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Illegal State\n"));
64169 + break;
64170 + case (INTERNAL_ERROR):
64171 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Internal Error\n"));
64172 + break;
64173 + }
64174 +
64175 + return A_OK;
64176 +}
64177 +
64178 +
64179 +static A_STATUS
64180 +wmi_statsEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64181 +{
64182 + WMI_TARGET_STATS *reply;
64183 +
64184 + if (len < sizeof(*reply)) {
64185 + return A_EINVAL;
64186 + }
64187 + reply = (WMI_TARGET_STATS *)datap;
64188 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64189 +
64190 + A_WMI_TARGETSTATS_EVENT(wmip->wmi_devt, reply);
64191 +
64192 + return A_OK;
64193 +}
64194 +
64195 +static A_STATUS
64196 +wmi_rssiThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64197 +{
64198 + WMI_RSSI_THRESHOLD_EVENT *reply;
64199 +
64200 + if (len < sizeof(*reply)) {
64201 + return A_EINVAL;
64202 + }
64203 + reply = (WMI_RSSI_THRESHOLD_EVENT *)datap;
64204 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64205 +
64206 + A_WMI_RSSI_THRESHOLD_EVENT(wmip->wmi_devt, reply->range, reply->rssi);
64207 +
64208 + return A_OK;
64209 +}
64210 +
64211 +
64212 +static A_STATUS
64213 +wmi_reportErrorEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64214 +{
64215 + WMI_TARGET_ERROR_REPORT_EVENT *reply;
64216 +
64217 + if (len < sizeof(*reply)) {
64218 + return A_EINVAL;
64219 + }
64220 + reply = (WMI_TARGET_ERROR_REPORT_EVENT *)datap;
64221 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64222 +
64223 + A_WMI_REPORT_ERROR_EVENT(wmip->wmi_devt, reply->errorVal);
64224 +
64225 + return A_OK;
64226 +}
64227 +
64228 +static A_STATUS
64229 +wmi_cac_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64230 +{
64231 + WMI_CAC_EVENT *reply;
64232 +
64233 + if (len < sizeof(*reply)) {
64234 + return A_EINVAL;
64235 + }
64236 + reply = (WMI_CAC_EVENT *)datap;
64237 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64238 +
64239 + A_WMI_CAC_EVENT(wmip->wmi_devt, reply->ac,
64240 + reply->cac_indication, reply->statusCode,
64241 + reply->tspecSuggestion);
64242 +
64243 + return A_OK;
64244 +}
64245 +
64246 +static A_STATUS
64247 +wmi_hbChallengeResp_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64248 +{
64249 + WMIX_HB_CHALLENGE_RESP_EVENT *reply;
64250 +
64251 + if (len < sizeof(*reply)) {
64252 + return A_EINVAL;
64253 + }
64254 + reply = (WMIX_HB_CHALLENGE_RESP_EVENT *)datap;
64255 + A_DPRINTF(DBG_WMI, (DBGFMT "wmi: challenge response event\n", DBGARG));
64256 +
64257 + A_WMI_HBCHALLENGERESP_EVENT(wmip->wmi_devt, reply->cookie, reply->source);
64258 +
64259 + return A_OK;
64260 +}
64261 +
64262 +static A_STATUS
64263 +wmi_roam_tbl_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64264 +{
64265 + WMI_TARGET_ROAM_TBL *reply;
64266 +
64267 + if (len < sizeof(*reply)) {
64268 + return A_EINVAL;
64269 + }
64270 + reply = (WMI_TARGET_ROAM_TBL *)datap;
64271 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64272 +
64273 + A_WMI_ROAM_TABLE_EVENT(wmip->wmi_devt, reply);
64274 +
64275 + return A_OK;
64276 +}
64277 +
64278 +static A_STATUS
64279 +wmi_roam_data_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64280 +{
64281 + WMI_TARGET_ROAM_DATA *reply;
64282 +
64283 + if (len < sizeof(*reply)) {
64284 + return A_EINVAL;
64285 + }
64286 + reply = (WMI_TARGET_ROAM_DATA *)datap;
64287 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64288 +
64289 + A_WMI_ROAM_DATA_EVENT(wmip->wmi_devt, reply);
64290 +
64291 + return A_OK;
64292 +}
64293 +
64294 +static A_STATUS
64295 +wmi_txRetryErrEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64296 +{
64297 + WMI_TX_RETRY_ERR_EVENT *reply;
64298 +
64299 + if (len < sizeof(*reply)) {
64300 + return A_EINVAL;
64301 + }
64302 + reply = (WMI_TX_RETRY_ERR_EVENT *)datap;
64303 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64304 +
64305 + A_WMI_TX_RETRY_ERR_EVENT(wmip->wmi_devt);
64306 +
64307 + return A_OK;
64308 +}
64309 +
64310 +static A_STATUS
64311 +wmi_snrThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64312 +{
64313 + WMI_SNR_THRESHOLD_EVENT *reply;
64314 +
64315 + if (len < sizeof(*reply)) {
64316 + return A_EINVAL;
64317 + }
64318 + reply = (WMI_SNR_THRESHOLD_EVENT *)datap;
64319 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64320 +
64321 + A_WMI_SNR_THRESHOLD_EVENT_RX(wmip->wmi_devt, reply->range, reply->snr);
64322 +
64323 + return A_OK;
64324 +}
64325 +
64326 +static A_STATUS
64327 +wmi_lqThresholdEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64328 +{
64329 + WMI_LQ_THRESHOLD_EVENT *reply;
64330 +
64331 + if (len < sizeof(*reply)) {
64332 + return A_EINVAL;
64333 + }
64334 + reply = (WMI_LQ_THRESHOLD_EVENT *)datap;
64335 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64336 +
64337 + A_WMI_LQ_THRESHOLD_EVENT_RX(wmip->wmi_devt, reply->range, reply->lq);
64338 +
64339 + return A_OK;
64340 +}
64341 +
64342 +static A_STATUS
64343 +wmi_aplistEvent_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64344 +{
64345 + A_UINT16 ap_info_entry_size;
64346 + WMI_APLIST_EVENT *ev = (WMI_APLIST_EVENT *)datap;
64347 + WMI_AP_INFO_V1 *ap_info_v1;
64348 + A_UINT8 i;
64349 +
64350 + if (len < sizeof(WMI_APLIST_EVENT)) {
64351 + return A_EINVAL;
64352 + }
64353 +
64354 + if (ev->apListVer == APLIST_VER1) {
64355 + ap_info_entry_size = sizeof(WMI_AP_INFO_V1);
64356 + ap_info_v1 = (WMI_AP_INFO_V1 *)ev->apList;
64357 + } else {
64358 + return A_EINVAL;
64359 + }
64360 +
64361 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("Number of APs in APLIST Event is %d\n", ev->numAP));
64362 + if (len < (int)(sizeof(WMI_APLIST_EVENT) +
64363 + (ev->numAP - 1) * ap_info_entry_size))
64364 + {
64365 + return A_EINVAL;
64366 + }
64367 +
64368 + /*
64369 + * AP List Ver1 Contents
64370 + */
64371 + for (i = 0; i < ev->numAP; i++) {
64372 + AR_DEBUG_PRINTF(ATH_DEBUG_WMI, ("AP#%d BSSID %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x "\
64373 + "Channel %d\n", i,
64374 + ap_info_v1->bssid[0], ap_info_v1->bssid[1],
64375 + ap_info_v1->bssid[2], ap_info_v1->bssid[3],
64376 + ap_info_v1->bssid[4], ap_info_v1->bssid[5],
64377 + ap_info_v1->channel));
64378 + ap_info_v1++;
64379 + }
64380 + return A_OK;
64381 +}
64382 +
64383 +static A_STATUS
64384 +wmi_dbglog_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64385 +{
64386 + A_UINT32 dropped;
64387 +
64388 + dropped = *((A_UINT32 *)datap);
64389 + datap += sizeof(dropped);
64390 + len -= sizeof(dropped);
64391 + A_WMI_DBGLOG_EVENT(wmip->wmi_devt, dropped, datap, len);
64392 + return A_OK;
64393 +}
64394 +
64395 +#ifdef CONFIG_HOST_GPIO_SUPPORT
64396 +static A_STATUS
64397 +wmi_gpio_intr_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64398 +{
64399 + WMIX_GPIO_INTR_EVENT *gpio_intr = (WMIX_GPIO_INTR_EVENT *)datap;
64400 +
64401 + A_DPRINTF(DBG_WMI,
64402 + (DBGFMT "Enter - intrmask=0x%x input=0x%x.\n", DBGARG,
64403 + gpio_intr->intr_mask, gpio_intr->input_values));
64404 +
64405 + A_WMI_GPIO_INTR_RX(gpio_intr->intr_mask, gpio_intr->input_values);
64406 +
64407 + return A_OK;
64408 +}
64409 +
64410 +static A_STATUS
64411 +wmi_gpio_data_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64412 +{
64413 + WMIX_GPIO_DATA_EVENT *gpio_data = (WMIX_GPIO_DATA_EVENT *)datap;
64414 +
64415 + A_DPRINTF(DBG_WMI,
64416 + (DBGFMT "Enter - reg=%d value=0x%x\n", DBGARG,
64417 + gpio_data->reg_id, gpio_data->value));
64418 +
64419 + A_WMI_GPIO_DATA_RX(gpio_data->reg_id, gpio_data->value);
64420 +
64421 + return A_OK;
64422 +}
64423 +
64424 +static A_STATUS
64425 +wmi_gpio_ack_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
64426 +{
64427 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
64428 +
64429 + A_WMI_GPIO_ACK_RX();
64430 +
64431 + return A_OK;
64432 +}
64433 +#endif /* CONFIG_HOST_GPIO_SUPPORT */
64434 +
64435 +/*
64436 + * Called to send a wmi command. Command specific data is already built
64437 + * on osbuf and current osbuf->data points to it.
64438 + */
64439 +A_STATUS
64440 +wmi_cmd_send(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
64441 + WMI_SYNC_FLAG syncflag)
64442 +{
64443 +#define IS_LONG_CMD(cmdId) ((cmdId == WMI_OPT_TX_FRAME_CMDID) || (cmdId == WMI_ADD_WOW_PATTERN_CMDID))
64444 + WMI_CMD_HDR *cHdr;
64445 + WMI_PRI_STREAM_ID streamID = WMI_CONTROL_PRI;
64446 +
64447 + A_ASSERT(osbuf != NULL);
64448 +
64449 + if (syncflag >= END_WMIFLAG) {
64450 + return A_EINVAL;
64451 + }
64452 +
64453 + if ((syncflag == SYNC_BEFORE_WMIFLAG) || (syncflag == SYNC_BOTH_WMIFLAG)) {
64454 + /*
64455 + * We want to make sure all data currently queued is transmitted before
64456 + * the cmd execution. Establish a new sync point.
64457 + */
64458 + wmi_sync_point(wmip);
64459 + }
64460 +
64461 + if (A_NETBUF_PUSH(osbuf, sizeof(WMI_CMD_HDR)) != A_OK) {
64462 + return A_NO_MEMORY;
64463 + }
64464 +
64465 + cHdr = (WMI_CMD_HDR *)A_NETBUF_DATA(osbuf);
64466 + cHdr->commandId = cmdId;
64467 +
64468 + /*
64469 + * Send cmd, some via control pipe, others via data pipe
64470 + */
64471 + if (IS_LONG_CMD(cmdId)) {
64472 + wmi_data_hdr_add(wmip, osbuf, CNTL_MSGTYPE);
64473 + // TODO ... these can now go through the control endpoint via HTC 2.0
64474 + streamID = WMI_BEST_EFFORT_PRI;
64475 + }
64476 + A_WMI_CONTROL_TX(wmip->wmi_devt, osbuf, streamID);
64477 +
64478 + if ((syncflag == SYNC_AFTER_WMIFLAG) || (syncflag == SYNC_BOTH_WMIFLAG)) {
64479 + /*
64480 + * We want to make sure all new data queued waits for the command to
64481 + * execute. Establish a new sync point.
64482 + */
64483 + wmi_sync_point(wmip);
64484 + }
64485 + return (A_OK);
64486 +#undef IS_LONG_CMD
64487 +}
64488 +
64489 +A_STATUS
64490 +wmi_cmd_send_xtnd(struct wmi_t *wmip, void *osbuf, WMI_COMMAND_ID cmdId,
64491 + WMI_SYNC_FLAG syncflag)
64492 +{
64493 + WMIX_CMD_HDR *cHdr;
64494 +
64495 + if (A_NETBUF_PUSH(osbuf, sizeof(WMIX_CMD_HDR)) != A_OK) {
64496 + return A_NO_MEMORY;
64497 + }
64498 +
64499 + cHdr = (WMIX_CMD_HDR *)A_NETBUF_DATA(osbuf);
64500 + cHdr->commandId = cmdId;
64501 +
64502 + return wmi_cmd_send(wmip, osbuf, WMI_EXTENSION_CMDID, syncflag);
64503 +}
64504 +
64505 +A_STATUS
64506 +wmi_connect_cmd(struct wmi_t *wmip, NETWORK_TYPE netType,
64507 + DOT11_AUTH_MODE dot11AuthMode, AUTH_MODE authMode,
64508 + CRYPTO_TYPE pairwiseCrypto, A_UINT8 pairwiseCryptoLen,
64509 + CRYPTO_TYPE groupCrypto,A_UINT8 groupCryptoLen,
64510 + int ssidLength, A_UCHAR *ssid,
64511 + A_UINT8 *bssid, A_UINT16 channel, A_UINT32 ctrl_flags)
64512 +{
64513 + void *osbuf;
64514 + WMI_CONNECT_CMD *cc;
64515 +
64516 + if ((pairwiseCrypto == NONE_CRYPT) && (groupCrypto != NONE_CRYPT)) {
64517 + return A_EINVAL;
64518 + }
64519 + if ((pairwiseCrypto != NONE_CRYPT) && (groupCrypto == NONE_CRYPT)) {
64520 + return A_EINVAL;
64521 + }
64522 +
64523 + osbuf = A_NETBUF_ALLOC(sizeof(WMI_CONNECT_CMD));
64524 + if (osbuf == NULL) {
64525 + return A_NO_MEMORY;
64526 + }
64527 +
64528 + A_NETBUF_PUT(osbuf, sizeof(WMI_CONNECT_CMD));
64529 +
64530 + cc = (WMI_CONNECT_CMD *)(A_NETBUF_DATA(osbuf));
64531 + A_MEMZERO(cc, sizeof(*cc));
64532 +
64533 + A_MEMCPY(cc->ssid, ssid, ssidLength);
64534 + cc->ssidLength = ssidLength;
64535 + cc->networkType = netType;
64536 + cc->dot11AuthMode = dot11AuthMode;
64537 + cc->authMode = authMode;
64538 + cc->pairwiseCryptoType = pairwiseCrypto;
64539 + cc->pairwiseCryptoLen = pairwiseCryptoLen;
64540 + cc->groupCryptoType = groupCrypto;
64541 + cc->groupCryptoLen = groupCryptoLen;
64542 + cc->channel = channel;
64543 + cc->ctrl_flags = ctrl_flags;
64544 +
64545 + if (bssid != NULL) {
64546 + A_MEMCPY(cc->bssid, bssid, ATH_MAC_LEN);
64547 + }
64548 + if (wmi_set_keepalive_cmd(wmip, wmip->wmi_keepaliveInterval) != A_OK) {
64549 + return(A_ERROR);
64550 + }
64551 +
64552 + return (wmi_cmd_send(wmip, osbuf, WMI_CONNECT_CMDID, NO_SYNC_WMIFLAG));
64553 +}
64554 +
64555 +A_STATUS
64556 +wmi_reconnect_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT16 channel)
64557 +{
64558 + void *osbuf;
64559 + WMI_RECONNECT_CMD *cc;
64560 +
64561 + osbuf = A_NETBUF_ALLOC(sizeof(WMI_RECONNECT_CMD));
64562 + if (osbuf == NULL) {
64563 + return A_NO_MEMORY;
64564 + }
64565 +
64566 + A_NETBUF_PUT(osbuf, sizeof(WMI_RECONNECT_CMD));
64567 +
64568 + cc = (WMI_RECONNECT_CMD *)(A_NETBUF_DATA(osbuf));
64569 + A_MEMZERO(cc, sizeof(*cc));
64570 +
64571 + cc->channel = channel;
64572 +
64573 + if (bssid != NULL) {
64574 + A_MEMCPY(cc->bssid, bssid, ATH_MAC_LEN);
64575 + }
64576 +
64577 + return (wmi_cmd_send(wmip, osbuf, WMI_RECONNECT_CMDID, NO_SYNC_WMIFLAG));
64578 +}
64579 +
64580 +A_STATUS
64581 +wmi_disconnect_cmd(struct wmi_t *wmip)
64582 +{
64583 + void *osbuf;
64584 + A_STATUS status;
64585 +
64586 + osbuf = A_NETBUF_ALLOC(0); /* no payload */
64587 + if (osbuf == NULL) {
64588 + return A_NO_MEMORY;
64589 + }
64590 +
64591 + /* Bug fix for 24817(elevator bug) - the disconnect command does not
64592 + need to do a SYNC before.*/
64593 + status = (wmi_cmd_send(wmip, osbuf, WMI_DISCONNECT_CMDID,
64594 + NO_SYNC_WMIFLAG));
64595 +
64596 + return status;
64597 +}
64598 +
64599 +A_STATUS
64600 +wmi_startscan_cmd(struct wmi_t *wmip, WMI_SCAN_TYPE scanType,
64601 + A_BOOL forceFgScan, A_BOOL isLegacy,
64602 + A_UINT32 homeDwellTime, A_UINT32 forceScanInterval)
64603 +{
64604 + void *osbuf;
64605 + WMI_START_SCAN_CMD *sc;
64606 +
64607 + if ((scanType != WMI_LONG_SCAN) && (scanType != WMI_SHORT_SCAN)) {
64608 + return A_EINVAL;
64609 + }
64610 +
64611 + osbuf = A_NETBUF_ALLOC(sizeof(*sc));
64612 + if (osbuf == NULL) {
64613 + return A_NO_MEMORY;
64614 + }
64615 +
64616 + A_NETBUF_PUT(osbuf, sizeof(*sc));
64617 +
64618 + sc = (WMI_START_SCAN_CMD *)(A_NETBUF_DATA(osbuf));
64619 + sc->scanType = scanType;
64620 + sc->forceFgScan = forceFgScan;
64621 + sc->isLegacy = isLegacy;
64622 + sc->homeDwellTime = homeDwellTime;
64623 + sc->forceScanInterval = forceScanInterval;
64624 +
64625 + return (wmi_cmd_send(wmip, osbuf, WMI_START_SCAN_CMDID, NO_SYNC_WMIFLAG));
64626 +}
64627 +
64628 +A_STATUS
64629 +wmi_scanparams_cmd(struct wmi_t *wmip, A_UINT16 fg_start_sec,
64630 + A_UINT16 fg_end_sec, A_UINT16 bg_sec,
64631 + A_UINT16 minact_chdw_msec, A_UINT16 maxact_chdw_msec,
64632 + A_UINT16 pas_chdw_msec,
64633 + A_UINT8 shScanRatio, A_UINT8 scanCtrlFlags,
64634 + A_UINT32 max_dfsch_act_time)
64635 +{
64636 + void *osbuf;
64637 + WMI_SCAN_PARAMS_CMD *sc;
64638 +
64639 + osbuf = A_NETBUF_ALLOC(sizeof(*sc));
64640 + if (osbuf == NULL) {
64641 + return A_NO_MEMORY;
64642 + }
64643 +
64644 + A_NETBUF_PUT(osbuf, sizeof(*sc));
64645 +
64646 + sc = (WMI_SCAN_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
64647 + A_MEMZERO(sc, sizeof(*sc));
64648 + sc->fg_start_period = fg_start_sec;
64649 + sc->fg_end_period = fg_end_sec;
64650 + sc->bg_period = bg_sec;
64651 + sc->minact_chdwell_time = minact_chdw_msec;
64652 + sc->maxact_chdwell_time = maxact_chdw_msec;
64653 + sc->pas_chdwell_time = pas_chdw_msec;
64654 + sc->shortScanRatio = shScanRatio;
64655 + sc->scanCtrlFlags = scanCtrlFlags;
64656 + sc->max_dfsch_act_time = max_dfsch_act_time;
64657 +
64658 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_SCAN_PARAMS_CMDID,
64659 + NO_SYNC_WMIFLAG));
64660 +}
64661 +
64662 +A_STATUS
64663 +wmi_bssfilter_cmd(struct wmi_t *wmip, A_UINT8 filter, A_UINT32 ieMask)
64664 +{
64665 + void *osbuf;
64666 + WMI_BSS_FILTER_CMD *cmd;
64667 +
64668 + if (filter >= LAST_BSS_FILTER) {
64669 + return A_EINVAL;
64670 + }
64671 +
64672 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64673 + if (osbuf == NULL) {
64674 + return A_NO_MEMORY;
64675 + }
64676 +
64677 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64678 +
64679 + cmd = (WMI_BSS_FILTER_CMD *)(A_NETBUF_DATA(osbuf));
64680 + A_MEMZERO(cmd, sizeof(*cmd));
64681 + cmd->bssFilter = filter;
64682 + cmd->ieMask = ieMask;
64683 +
64684 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_BSS_FILTER_CMDID,
64685 + NO_SYNC_WMIFLAG));
64686 +}
64687 +
64688 +A_STATUS
64689 +wmi_probedSsid_cmd(struct wmi_t *wmip, A_UINT8 index, A_UINT8 flag,
64690 + A_UINT8 ssidLength, A_UCHAR *ssid)
64691 +{
64692 + void *osbuf;
64693 + WMI_PROBED_SSID_CMD *cmd;
64694 +
64695 + if (index > MAX_PROBED_SSID_INDEX) {
64696 + return A_EINVAL;
64697 + }
64698 + if (ssidLength > sizeof(cmd->ssid)) {
64699 + return A_EINVAL;
64700 + }
64701 + if ((flag & (DISABLE_SSID_FLAG | ANY_SSID_FLAG)) && (ssidLength > 0)) {
64702 + return A_EINVAL;
64703 + }
64704 + if ((flag & SPECIFIC_SSID_FLAG) && !ssidLength) {
64705 + return A_EINVAL;
64706 + }
64707 +
64708 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64709 + if (osbuf == NULL) {
64710 + return A_NO_MEMORY;
64711 + }
64712 +
64713 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64714 +
64715 + cmd = (WMI_PROBED_SSID_CMD *)(A_NETBUF_DATA(osbuf));
64716 + A_MEMZERO(cmd, sizeof(*cmd));
64717 + cmd->entryIndex = index;
64718 + cmd->flag = flag;
64719 + cmd->ssidLength = ssidLength;
64720 + A_MEMCPY(cmd->ssid, ssid, ssidLength);
64721 +
64722 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_PROBED_SSID_CMDID,
64723 + NO_SYNC_WMIFLAG));
64724 +}
64725 +
64726 +A_STATUS
64727 +wmi_listeninterval_cmd(struct wmi_t *wmip, A_UINT16 listenInterval, A_UINT16 listenBeacons)
64728 +{
64729 + void *osbuf;
64730 + WMI_LISTEN_INT_CMD *cmd;
64731 +
64732 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64733 + if (osbuf == NULL) {
64734 + return A_NO_MEMORY;
64735 + }
64736 +
64737 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64738 +
64739 + cmd = (WMI_LISTEN_INT_CMD *)(A_NETBUF_DATA(osbuf));
64740 + A_MEMZERO(cmd, sizeof(*cmd));
64741 + cmd->listenInterval = listenInterval;
64742 + cmd->numBeacons = listenBeacons;
64743 +
64744 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_LISTEN_INT_CMDID,
64745 + NO_SYNC_WMIFLAG));
64746 +}
64747 +
64748 +A_STATUS
64749 +wmi_bmisstime_cmd(struct wmi_t *wmip, A_UINT16 bmissTime, A_UINT16 bmissBeacons)
64750 +{
64751 + void *osbuf;
64752 + WMI_BMISS_TIME_CMD *cmd;
64753 +
64754 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64755 + if (osbuf == NULL) {
64756 + return A_NO_MEMORY;
64757 + }
64758 +
64759 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64760 +
64761 + cmd = (WMI_BMISS_TIME_CMD *)(A_NETBUF_DATA(osbuf));
64762 + A_MEMZERO(cmd, sizeof(*cmd));
64763 + cmd->bmissTime = bmissTime;
64764 + cmd->numBeacons = bmissBeacons;
64765 +
64766 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_BMISS_TIME_CMDID,
64767 + NO_SYNC_WMIFLAG));
64768 +}
64769 +
64770 +A_STATUS
64771 +wmi_associnfo_cmd(struct wmi_t *wmip, A_UINT8 ieType,
64772 + A_UINT8 ieLen, A_UINT8 *ieInfo)
64773 +{
64774 + void *osbuf;
64775 + WMI_SET_ASSOC_INFO_CMD *cmd;
64776 + A_UINT16 cmdLen;
64777 +
64778 + cmdLen = sizeof(*cmd) + ieLen - 1;
64779 + osbuf = A_NETBUF_ALLOC(cmdLen);
64780 + if (osbuf == NULL) {
64781 + return A_NO_MEMORY;
64782 + }
64783 +
64784 + A_NETBUF_PUT(osbuf, cmdLen);
64785 +
64786 + cmd = (WMI_SET_ASSOC_INFO_CMD *)(A_NETBUF_DATA(osbuf));
64787 + A_MEMZERO(cmd, cmdLen);
64788 + cmd->ieType = ieType;
64789 + cmd->bufferSize = ieLen;
64790 + A_MEMCPY(cmd->assocInfo, ieInfo, ieLen);
64791 +
64792 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_ASSOC_INFO_CMDID,
64793 + NO_SYNC_WMIFLAG));
64794 +}
64795 +
64796 +A_STATUS
64797 +wmi_powermode_cmd(struct wmi_t *wmip, A_UINT8 powerMode)
64798 +{
64799 + void *osbuf;
64800 + WMI_POWER_MODE_CMD *cmd;
64801 +
64802 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64803 + if (osbuf == NULL) {
64804 + return A_NO_MEMORY;
64805 + }
64806 +
64807 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64808 +
64809 + cmd = (WMI_POWER_MODE_CMD *)(A_NETBUF_DATA(osbuf));
64810 + A_MEMZERO(cmd, sizeof(*cmd));
64811 + cmd->powerMode = powerMode;
64812 + wmip->wmi_powerMode = powerMode;
64813 +
64814 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWER_MODE_CMDID,
64815 + NO_SYNC_WMIFLAG));
64816 +}
64817 +
64818 +A_STATUS
64819 +wmi_ibsspmcaps_cmd(struct wmi_t *wmip, A_UINT8 pmEnable, A_UINT8 ttl,
64820 + A_UINT16 atim_windows, A_UINT16 timeout_value)
64821 +{
64822 + void *osbuf;
64823 + WMI_IBSS_PM_CAPS_CMD *cmd;
64824 +
64825 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64826 + if (osbuf == NULL) {
64827 + return A_NO_MEMORY;
64828 + }
64829 +
64830 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64831 +
64832 + cmd = (WMI_IBSS_PM_CAPS_CMD *)(A_NETBUF_DATA(osbuf));
64833 + A_MEMZERO(cmd, sizeof(*cmd));
64834 + cmd->power_saving = pmEnable;
64835 + cmd->ttl = ttl;
64836 + cmd->atim_windows = atim_windows;
64837 + cmd->timeout_value = timeout_value;
64838 +
64839 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_IBSS_PM_CAPS_CMDID,
64840 + NO_SYNC_WMIFLAG));
64841 +}
64842 +
64843 +A_STATUS
64844 +wmi_pmparams_cmd(struct wmi_t *wmip, A_UINT16 idlePeriod,
64845 + A_UINT16 psPollNum, A_UINT16 dtimPolicy)
64846 +{
64847 + void *osbuf;
64848 + WMI_POWER_PARAMS_CMD *pm;
64849 +
64850 + osbuf = A_NETBUF_ALLOC(sizeof(*pm));
64851 + if (osbuf == NULL) {
64852 + return A_NO_MEMORY;
64853 + }
64854 +
64855 + A_NETBUF_PUT(osbuf, sizeof(*pm));
64856 +
64857 + pm = (WMI_POWER_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
64858 + A_MEMZERO(pm, sizeof(*pm));
64859 + pm->idle_period = idlePeriod;
64860 + pm->pspoll_number = psPollNum;
64861 + pm->dtim_policy = dtimPolicy;
64862 +
64863 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWER_PARAMS_CMDID,
64864 + NO_SYNC_WMIFLAG));
64865 +}
64866 +
64867 +A_STATUS
64868 +wmi_disctimeout_cmd(struct wmi_t *wmip, A_UINT8 timeout)
64869 +{
64870 + void *osbuf;
64871 + WMI_DISC_TIMEOUT_CMD *cmd;
64872 +
64873 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64874 + if (osbuf == NULL) {
64875 + return A_NO_MEMORY;
64876 + }
64877 +
64878 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64879 +
64880 + cmd = (WMI_DISC_TIMEOUT_CMD *)(A_NETBUF_DATA(osbuf));
64881 + A_MEMZERO(cmd, sizeof(*cmd));
64882 + cmd->disconnectTimeout = timeout;
64883 +
64884 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_DISC_TIMEOUT_CMDID,
64885 + NO_SYNC_WMIFLAG));
64886 +}
64887 +
64888 +A_STATUS
64889 +wmi_addKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex, CRYPTO_TYPE keyType,
64890 + A_UINT8 keyUsage, A_UINT8 keyLength, A_UINT8 *keyRSC,
64891 + A_UINT8 *keyMaterial, A_UINT8 key_op_ctrl,
64892 + WMI_SYNC_FLAG sync_flag)
64893 +{
64894 + void *osbuf;
64895 + WMI_ADD_CIPHER_KEY_CMD *cmd;
64896 +
64897 + if ((keyIndex > WMI_MAX_KEY_INDEX) || (keyLength > WMI_MAX_KEY_LEN) ||
64898 + (keyMaterial == NULL))
64899 + {
64900 + return A_EINVAL;
64901 + }
64902 +
64903 + if ((WEP_CRYPT != keyType) && (NULL == keyRSC)) {
64904 + return A_EINVAL;
64905 + }
64906 +
64907 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64908 + if (osbuf == NULL) {
64909 + return A_NO_MEMORY;
64910 + }
64911 +
64912 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64913 +
64914 + cmd = (WMI_ADD_CIPHER_KEY_CMD *)(A_NETBUF_DATA(osbuf));
64915 + A_MEMZERO(cmd, sizeof(*cmd));
64916 + cmd->keyIndex = keyIndex;
64917 + cmd->keyType = keyType;
64918 + cmd->keyUsage = keyUsage;
64919 + cmd->keyLength = keyLength;
64920 + A_MEMCPY(cmd->key, keyMaterial, keyLength);
64921 + if (NULL != keyRSC) {
64922 + A_MEMCPY(cmd->keyRSC, keyRSC, sizeof(cmd->keyRSC));
64923 + }
64924 + cmd->key_op_ctrl = key_op_ctrl;
64925 +
64926 + return (wmi_cmd_send(wmip, osbuf, WMI_ADD_CIPHER_KEY_CMDID, sync_flag));
64927 +}
64928 +
64929 +A_STATUS
64930 +wmi_add_krk_cmd(struct wmi_t *wmip, A_UINT8 *krk)
64931 +{
64932 + void *osbuf;
64933 + WMI_ADD_KRK_CMD *cmd;
64934 +
64935 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64936 +
64937 + if (osbuf == NULL) {
64938 + return A_NO_MEMORY;
64939 + }
64940 +
64941 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64942 +
64943 + cmd = (WMI_ADD_KRK_CMD *)(A_NETBUF_DATA(osbuf));
64944 + A_MEMZERO(cmd, sizeof(*cmd));
64945 + A_MEMCPY(cmd->krk, krk, WMI_KRK_LEN);
64946 +
64947 + return (wmi_cmd_send(wmip, osbuf, WMI_ADD_KRK_CMDID, NO_SYNC_WMIFLAG));
64948 +}
64949 +
64950 +A_STATUS
64951 +wmi_delete_krk_cmd(struct wmi_t *wmip)
64952 +{
64953 + void *osbuf;
64954 +
64955 + osbuf = A_NETBUF_ALLOC(0);
64956 +
64957 + if (osbuf == NULL) {
64958 + return A_NO_MEMORY;
64959 + }
64960 +
64961 + return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_KRK_CMDID, NO_SYNC_WMIFLAG));
64962 +}
64963 +
64964 +A_STATUS
64965 +wmi_deleteKey_cmd(struct wmi_t *wmip, A_UINT8 keyIndex)
64966 +{
64967 + void *osbuf;
64968 + WMI_DELETE_CIPHER_KEY_CMD *cmd;
64969 +
64970 + if (keyIndex > WMI_MAX_KEY_INDEX) {
64971 + return A_EINVAL;
64972 + }
64973 +
64974 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
64975 + if (osbuf == NULL) {
64976 + return A_NO_MEMORY;
64977 + }
64978 +
64979 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
64980 +
64981 + cmd = (WMI_DELETE_CIPHER_KEY_CMD *)(A_NETBUF_DATA(osbuf));
64982 + A_MEMZERO(cmd, sizeof(*cmd));
64983 + cmd->keyIndex = keyIndex;
64984 +
64985 + return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_CIPHER_KEY_CMDID,
64986 + NO_SYNC_WMIFLAG));
64987 +}
64988 +
64989 +A_STATUS
64990 +wmi_setPmkid_cmd(struct wmi_t *wmip, A_UINT8 *bssid, A_UINT8 *pmkId,
64991 + A_BOOL set)
64992 +{
64993 + void *osbuf;
64994 + WMI_SET_PMKID_CMD *cmd;
64995 +
64996 + if (bssid == NULL) {
64997 + return A_EINVAL;
64998 + }
64999 +
65000 + if ((set == TRUE) && (pmkId == NULL)) {
65001 + return A_EINVAL;
65002 + }
65003 +
65004 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65005 + if (osbuf == NULL) {
65006 + return A_NO_MEMORY;
65007 + }
65008 +
65009 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65010 +
65011 + cmd = (WMI_SET_PMKID_CMD *)(A_NETBUF_DATA(osbuf));
65012 + A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
65013 + if (set == TRUE) {
65014 + A_MEMCPY(cmd->pmkid, pmkId, sizeof(cmd->pmkid));
65015 + cmd->enable = PMKID_ENABLE;
65016 + } else {
65017 + A_MEMZERO(cmd->pmkid, sizeof(cmd->pmkid));
65018 + cmd->enable = PMKID_DISABLE;
65019 + }
65020 +
65021 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_PMKID_CMDID, NO_SYNC_WMIFLAG));
65022 +}
65023 +
65024 +A_STATUS
65025 +wmi_set_tkip_countermeasures_cmd(struct wmi_t *wmip, A_BOOL en)
65026 +{
65027 + void *osbuf;
65028 + WMI_SET_TKIP_COUNTERMEASURES_CMD *cmd;
65029 +
65030 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65031 + if (osbuf == NULL) {
65032 + return A_NO_MEMORY;
65033 + }
65034 +
65035 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65036 +
65037 + cmd = (WMI_SET_TKIP_COUNTERMEASURES_CMD *)(A_NETBUF_DATA(osbuf));
65038 + cmd->cm_en = (en == TRUE)? WMI_TKIP_CM_ENABLE : WMI_TKIP_CM_DISABLE;
65039 +
65040 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_TKIP_COUNTERMEASURES_CMDID,
65041 + NO_SYNC_WMIFLAG));
65042 +}
65043 +
65044 +A_STATUS
65045 +wmi_set_akmp_params_cmd(struct wmi_t *wmip,
65046 + WMI_SET_AKMP_PARAMS_CMD *akmpParams)
65047 +{
65048 + void *osbuf;
65049 + WMI_SET_AKMP_PARAMS_CMD *cmd;
65050 +
65051 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65052 + if (osbuf == NULL) {
65053 + return A_NO_MEMORY;
65054 + }
65055 +
65056 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65057 + cmd = (WMI_SET_AKMP_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
65058 + cmd->akmpInfo = akmpParams->akmpInfo;
65059 +
65060 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_AKMP_PARAMS_CMDID,
65061 + NO_SYNC_WMIFLAG));
65062 +}
65063 +
65064 +A_STATUS
65065 +wmi_set_pmkid_list_cmd(struct wmi_t *wmip,
65066 + WMI_SET_PMKID_LIST_CMD *pmkInfo)
65067 +{
65068 + void *osbuf;
65069 + WMI_SET_PMKID_LIST_CMD *cmd;
65070 + A_UINT16 cmdLen;
65071 + A_UINT8 i;
65072 +
65073 + cmdLen = sizeof(pmkInfo->numPMKID) +
65074 + pmkInfo->numPMKID * sizeof(WMI_PMKID);
65075 +
65076 + osbuf = A_NETBUF_ALLOC(cmdLen);
65077 +
65078 + if (osbuf == NULL) {
65079 + return A_NO_MEMORY;
65080 + }
65081 +
65082 + A_NETBUF_PUT(osbuf, cmdLen);
65083 + cmd = (WMI_SET_PMKID_LIST_CMD *)(A_NETBUF_DATA(osbuf));
65084 + cmd->numPMKID = pmkInfo->numPMKID;
65085 +
65086 + for (i = 0; i < cmd->numPMKID; i++) {
65087 + A_MEMCPY(&cmd->pmkidList[i], &pmkInfo->pmkidList[i],
65088 + WMI_PMKID_LEN);
65089 + }
65090 +
65091 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_PMKID_LIST_CMDID,
65092 + NO_SYNC_WMIFLAG));
65093 +}
65094 +
65095 +A_STATUS
65096 +wmi_get_pmkid_list_cmd(struct wmi_t *wmip)
65097 +{
65098 + void *osbuf;
65099 +
65100 + osbuf = A_NETBUF_ALLOC(0); /* no payload */
65101 + if (osbuf == NULL) {
65102 + return A_NO_MEMORY;
65103 + }
65104 +
65105 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_PMKID_LIST_CMDID,
65106 + NO_SYNC_WMIFLAG));
65107 +}
65108 +
65109 +A_STATUS
65110 +wmi_dataSync_send(struct wmi_t *wmip, void *osbuf, WMI_PRI_STREAM_ID streamID)
65111 +{
65112 + WMI_DATA_HDR *dtHdr;
65113 +
65114 + A_ASSERT(streamID != WMI_CONTROL_PRI);
65115 + A_ASSERT(osbuf != NULL);
65116 +
65117 + if (A_NETBUF_PUSH(osbuf, sizeof(WMI_DATA_HDR)) != A_OK) {
65118 + return A_NO_MEMORY;
65119 + }
65120 +
65121 + dtHdr = (WMI_DATA_HDR *)A_NETBUF_DATA(osbuf);
65122 + dtHdr->info =
65123 + (SYNC_MSGTYPE & WMI_DATA_HDR_MSG_TYPE_MASK) << WMI_DATA_HDR_MSG_TYPE_SHIFT;
65124 +
65125 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter - streamID %d\n", DBGARG, streamID));
65126 +
65127 + return (A_WMI_CONTROL_TX(wmip->wmi_devt, osbuf, streamID));
65128 +}
65129 +
65130 +typedef struct _WMI_DATA_SYNC_BUFS {
65131 + A_UINT8 trafficClass;
65132 + void *osbuf;
65133 +}WMI_DATA_SYNC_BUFS;
65134 +
65135 +static A_STATUS
65136 +wmi_sync_point(struct wmi_t *wmip)
65137 +{
65138 + void *cmd_osbuf;
65139 + WMI_DATA_SYNC_BUFS dataSyncBufs[WMM_NUM_AC];
65140 + A_UINT8 i,numPriStreams=0;
65141 + A_STATUS status;
65142 +
65143 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
65144 +
65145 + memset(dataSyncBufs,0,sizeof(dataSyncBufs));
65146 +
65147 + /* lock out while we walk through the priority list and assemble our local array */
65148 + LOCK_WMI(wmip);
65149 +
65150 + for (i=0; i < WMM_NUM_AC ; i++) {
65151 + if (wmip->wmi_fatPipeExists & (1 << i)) {
65152 + numPriStreams++;
65153 + dataSyncBufs[numPriStreams-1].trafficClass = i;
65154 + }
65155 + }
65156 +
65157 + UNLOCK_WMI(wmip);
65158 +
65159 + /* dataSyncBufs is now filled with entries (starting at index 0) containing valid streamIDs */
65160 +
65161 + do {
65162 + /*
65163 + * We allocate all network buffers needed so we will be able to
65164 + * send all required frames.
65165 + */
65166 + cmd_osbuf = A_NETBUF_ALLOC(0); /* no payload */
65167 + if (cmd_osbuf == NULL) {
65168 + status = A_NO_MEMORY;
65169 + break;
65170 + }
65171 +
65172 + for (i=0; i < numPriStreams ; i++) {
65173 + dataSyncBufs[i].osbuf = A_NETBUF_ALLOC(0);
65174 + if (dataSyncBufs[i].osbuf == NULL) {
65175 + status = A_NO_MEMORY;
65176 + break;
65177 + }
65178 + } //end for
65179 +
65180 + /*
65181 + * Send sync cmd followed by sync data messages on all endpoints being
65182 + * used
65183 + */
65184 + status = wmi_cmd_send(wmip, cmd_osbuf, WMI_SYNCHRONIZE_CMDID,
65185 + NO_SYNC_WMIFLAG);
65186 +
65187 + if (A_FAILED(status)) {
65188 + break;
65189 + }
65190 + /* cmd buffer sent, we no longer own it */
65191 + cmd_osbuf = NULL;
65192 +
65193 + for(i=0; i < numPriStreams; i++) {
65194 + A_ASSERT(dataSyncBufs[i].osbuf != NULL);
65195 +
65196 + status = wmi_dataSync_send(wmip, dataSyncBufs[i].osbuf,
65197 + WMI_ACCESSCATEGORY_WMISTREAM(wmip,dataSyncBufs[i].trafficClass));
65198 +
65199 + if (A_FAILED(status)) {
65200 + break;
65201 + }
65202 + /* we don't own this buffer anymore, NULL it out of the array so it
65203 + * won't get cleaned up */
65204 + dataSyncBufs[i].osbuf = NULL;
65205 + } //end for
65206 +
65207 + } while(FALSE);
65208 +
65209 + /* free up any resources left over (possibly due to an error) */
65210 +
65211 + if (cmd_osbuf != NULL) {
65212 + A_NETBUF_FREE(cmd_osbuf);
65213 + }
65214 +
65215 + for (i = 0; i < numPriStreams; i++) {
65216 + if (dataSyncBufs[i].osbuf != NULL) {
65217 + A_NETBUF_FREE(dataSyncBufs[i].osbuf);
65218 + }
65219 + }
65220 +
65221 + return (status);
65222 +}
65223 +
65224 +A_STATUS
65225 +wmi_create_pstream_cmd(struct wmi_t *wmip, WMI_CREATE_PSTREAM_CMD *params)
65226 +{
65227 + void *osbuf;
65228 + WMI_CREATE_PSTREAM_CMD *cmd;
65229 + A_UINT16 activeTsids=0;
65230 + A_UINT8 fatPipeExistsForAC=0;
65231 +
65232 + /* Validate all the parameters. */
65233 + if( !((params->userPriority < 8) &&
65234 + (params->userPriority <= 0x7) &&
65235 + (convert_userPriority_to_trafficClass(params->userPriority) == params->trafficClass) &&
65236 + (params->trafficDirection == UPLINK_TRAFFIC ||
65237 + params->trafficDirection == DNLINK_TRAFFIC ||
65238 + params->trafficDirection == BIDIR_TRAFFIC) &&
65239 + (params->trafficType == TRAFFIC_TYPE_APERIODIC ||
65240 + params->trafficType == TRAFFIC_TYPE_PERIODIC ) &&
65241 + (params->voicePSCapability == DISABLE_FOR_THIS_AC ||
65242 + params->voicePSCapability == ENABLE_FOR_THIS_AC ||
65243 + params->voicePSCapability == ENABLE_FOR_ALL_AC) &&
65244 + (params->tsid == WMI_IMPLICIT_PSTREAM || params->tsid <= WMI_MAX_THINSTREAM)) )
65245 + {
65246 + return A_EINVAL;
65247 + }
65248 +
65249 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65250 + if (osbuf == NULL) {
65251 + return A_NO_MEMORY;
65252 + }
65253 +
65254 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65255 +
65256 + A_DPRINTF(DBG_WMI,
65257 + (DBGFMT "Sending create_pstream_cmd: ac=%d tsid:%d\n", DBGARG,
65258 + params->trafficClass, params->tsid));
65259 +
65260 + cmd = (WMI_CREATE_PSTREAM_CMD *)(A_NETBUF_DATA(osbuf));
65261 + A_MEMZERO(cmd, sizeof(*cmd));
65262 + A_MEMCPY(cmd, params, sizeof(*cmd));
65263 +
65264 + /* this is an implicitly created Fat pipe */
65265 + if (params->tsid == WMI_IMPLICIT_PSTREAM) {
65266 + LOCK_WMI(wmip);
65267 + fatPipeExistsForAC = (wmip->wmi_fatPipeExists & (1 << params->trafficClass));
65268 + wmip->wmi_fatPipeExists |= (1<<params->trafficClass);
65269 + UNLOCK_WMI(wmip);
65270 + } else {
65271 + /* this is an explicitly created thin stream within a fat pipe */
65272 + LOCK_WMI(wmip);
65273 + fatPipeExistsForAC = (wmip->wmi_fatPipeExists & (1 << params->trafficClass));
65274 + activeTsids = wmip->wmi_streamExistsForAC[params->trafficClass];
65275 + wmip->wmi_streamExistsForAC[params->trafficClass] |= (1<<params->tsid);
65276 + /* if a thinstream becomes active, the fat pipe automatically
65277 + * becomes active
65278 + */
65279 + wmip->wmi_fatPipeExists |= (1<<params->trafficClass);
65280 + UNLOCK_WMI(wmip);
65281 + }
65282 +
65283 + /* Indicate activty change to driver layer only if this is the
65284 + * first TSID to get created in this AC explicitly or an implicit
65285 + * fat pipe is getting created.
65286 + */
65287 + if (!fatPipeExistsForAC) {
65288 + A_WMI_STREAM_TX_ACTIVE(wmip->wmi_devt, params->trafficClass);
65289 + }
65290 +
65291 + /* mike: should be SYNC_BEFORE_WMIFLAG */
65292 + return (wmi_cmd_send(wmip, osbuf, WMI_CREATE_PSTREAM_CMDID,
65293 + NO_SYNC_WMIFLAG));
65294 +}
65295 +
65296 +A_STATUS
65297 +wmi_delete_pstream_cmd(struct wmi_t *wmip, A_UINT8 trafficClass, A_UINT8 tsid)
65298 +{
65299 + void *osbuf;
65300 + WMI_DELETE_PSTREAM_CMD *cmd;
65301 + A_STATUS status;
65302 + A_UINT16 activeTsids=0;
65303 +
65304 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65305 + if (osbuf == NULL) {
65306 + return A_NO_MEMORY;
65307 + }
65308 +
65309 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65310 +
65311 + cmd = (WMI_DELETE_PSTREAM_CMD *)(A_NETBUF_DATA(osbuf));
65312 + A_MEMZERO(cmd, sizeof(*cmd));
65313 +
65314 + cmd->trafficClass = trafficClass;
65315 + cmd->tsid = tsid;
65316 +
65317 + LOCK_WMI(wmip);
65318 + activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
65319 + UNLOCK_WMI(wmip);
65320 +
65321 + /* Check if the tsid was created & exists */
65322 + if (!(activeTsids & (1<<tsid))) {
65323 +
65324 + A_DPRINTF(DBG_WMI,
65325 + (DBGFMT "TSID %d does'nt exist for trafficClass: %d\n", DBGARG, tsid, trafficClass));
65326 + /* TODO: return a more appropriate err code */
65327 + return A_ERROR;
65328 + }
65329 +
65330 + A_DPRINTF(DBG_WMI,
65331 + (DBGFMT "Sending delete_pstream_cmd: trafficClass: %d tsid=%d\n", DBGARG, trafficClass, tsid));
65332 +
65333 + status = (wmi_cmd_send(wmip, osbuf, WMI_DELETE_PSTREAM_CMDID,
65334 + SYNC_BEFORE_WMIFLAG));
65335 +
65336 + LOCK_WMI(wmip);
65337 + wmip->wmi_streamExistsForAC[trafficClass] &= ~(1<<tsid);
65338 + activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
65339 + UNLOCK_WMI(wmip);
65340 +
65341 +
65342 + /* Indicate stream inactivity to driver layer only if all tsids
65343 + * within this AC are deleted.
65344 + */
65345 + if(!activeTsids) {
65346 + A_WMI_STREAM_TX_INACTIVE(wmip->wmi_devt, trafficClass);
65347 + wmip->wmi_fatPipeExists &= ~(1<<trafficClass);
65348 + }
65349 +
65350 + return status;
65351 +}
65352 +
65353 +/*
65354 + * used to set the bit rate. rate is in Kbps. If rate == -1
65355 + * then auto selection is used.
65356 + */
65357 +A_STATUS
65358 +wmi_set_bitrate_cmd(struct wmi_t *wmip, A_INT32 rate)
65359 +{
65360 + void *osbuf;
65361 + WMI_BIT_RATE_CMD *cmd;
65362 + A_INT8 index;
65363 +
65364 + if (rate != -1) {
65365 + index = wmi_validate_bitrate(wmip, rate);
65366 + if(index == A_EINVAL){
65367 + return A_EINVAL;
65368 + }
65369 + } else {
65370 + index = -1;
65371 + }
65372 +
65373 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65374 + if (osbuf == NULL) {
65375 + return A_NO_MEMORY;
65376 + }
65377 +
65378 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65379 +
65380 + cmd = (WMI_BIT_RATE_CMD *)(A_NETBUF_DATA(osbuf));
65381 + A_MEMZERO(cmd, sizeof(*cmd));
65382 +
65383 + cmd->rateIndex = index;
65384 +
65385 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_BITRATE_CMDID, NO_SYNC_WMIFLAG));
65386 +}
65387 +
65388 +A_STATUS
65389 +wmi_get_bitrate_cmd(struct wmi_t *wmip)
65390 +{
65391 + void *osbuf;
65392 +
65393 + osbuf = A_NETBUF_ALLOC(0); /* no payload */
65394 + if (osbuf == NULL) {
65395 + return A_NO_MEMORY;
65396 + }
65397 +
65398 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_BITRATE_CMDID, NO_SYNC_WMIFLAG));
65399 +}
65400 +
65401 +/*
65402 + * Returns TRUE iff the given rate index is legal in the current PHY mode.
65403 + */
65404 +A_BOOL
65405 +wmi_is_bitrate_index_valid(struct wmi_t *wmip, A_UINT32 rateIndex)
65406 +{
65407 + WMI_PHY_MODE phyMode = wmip->wmi_phyMode;
65408 + A_BOOL isValid = TRUE;
65409 + switch(phyMode) {
65410 + case WMI_11A_MODE:
65411 + if ((rateIndex < MODE_A_SUPPORT_RATE_START) || (rateIndex > MODE_A_SUPPORT_RATE_STOP)) {
65412 + isValid = FALSE;
65413 + }
65414 + break;
65415 +
65416 + case WMI_11B_MODE:
65417 + if ((rateIndex < MODE_B_SUPPORT_RATE_START) || (rateIndex > MODE_B_SUPPORT_RATE_STOP)) {
65418 + isValid = FALSE;
65419 + }
65420 + break;
65421 +
65422 + case WMI_11GONLY_MODE:
65423 + if ((rateIndex < MODE_GONLY_SUPPORT_RATE_START) || (rateIndex > MODE_GONLY_SUPPORT_RATE_STOP)) {
65424 + isValid = FALSE;
65425 + }
65426 + break;
65427 +
65428 + case WMI_11G_MODE:
65429 + case WMI_11AG_MODE:
65430 + if ((rateIndex < MODE_G_SUPPORT_RATE_START) || (rateIndex > MODE_G_SUPPORT_RATE_STOP)) {
65431 + isValid = FALSE;
65432 + }
65433 + break;
65434 +
65435 + default:
65436 + A_ASSERT(FALSE);
65437 + break;
65438 + }
65439 +
65440 + return isValid;
65441 +}
65442 +
65443 +A_INT8
65444 +wmi_validate_bitrate(struct wmi_t *wmip, A_INT32 rate)
65445 +{
65446 + A_INT8 i;
65447 + if (rate != -1)
65448 + {
65449 + for (i=0;;i++)
65450 + {
65451 + if (wmi_rateTable[(A_UINT32) i] == 0) {
65452 + return A_EINVAL;
65453 + }
65454 + if (wmi_rateTable[(A_UINT32) i] == rate) {
65455 + break;
65456 + }
65457 + }
65458 + }
65459 + else{
65460 + i = -1;
65461 + }
65462 +
65463 + if(wmi_is_bitrate_index_valid(wmip, i) != TRUE) {
65464 + return A_EINVAL;
65465 + }
65466 +
65467 + return i;
65468 +}
65469 +
65470 +A_STATUS
65471 +wmi_set_fixrates_cmd(struct wmi_t *wmip, A_INT16 fixRatesMask)
65472 +{
65473 + void *osbuf;
65474 + WMI_FIX_RATES_CMD *cmd;
65475 + A_UINT32 rateIndex;
65476 +
65477 + /* Make sure all rates in the mask are valid in the current PHY mode */
65478 + for(rateIndex = 0; rateIndex < MAX_NUMBER_OF_SUPPORT_RATES; rateIndex++) {
65479 + if((1 << rateIndex) & (A_UINT32)fixRatesMask) {
65480 + if(wmi_is_bitrate_index_valid(wmip, rateIndex) != TRUE) {
65481 + A_DPRINTF(DBG_WMI, (DBGFMT "Set Fix Rates command failed: Given rate is illegal in current PHY mode\n", DBGARG));
65482 + return A_EINVAL;
65483 + }
65484 + }
65485 + }
65486 +
65487 +
65488 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65489 + if (osbuf == NULL) {
65490 + return A_NO_MEMORY;
65491 + }
65492 +
65493 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65494 +
65495 + cmd = (WMI_FIX_RATES_CMD *)(A_NETBUF_DATA(osbuf));
65496 + A_MEMZERO(cmd, sizeof(*cmd));
65497 +
65498 + cmd->fixRateMask = fixRatesMask;
65499 +
65500 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_FIXRATES_CMDID, NO_SYNC_WMIFLAG));
65501 +}
65502 +
65503 +A_STATUS
65504 +wmi_get_ratemask_cmd(struct wmi_t *wmip)
65505 +{
65506 + void *osbuf;
65507 +
65508 + osbuf = A_NETBUF_ALLOC(0); /* no payload */
65509 + if (osbuf == NULL) {
65510 + return A_NO_MEMORY;
65511 + }
65512 +
65513 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_FIXRATES_CMDID, NO_SYNC_WMIFLAG));
65514 +}
65515 +
65516 +A_STATUS
65517 +wmi_get_channelList_cmd(struct wmi_t *wmip)
65518 +{
65519 + void *osbuf;
65520 +
65521 + osbuf = A_NETBUF_ALLOC(0); /* no payload */
65522 + if (osbuf == NULL) {
65523 + return A_NO_MEMORY;
65524 + }
65525 +
65526 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_CHANNEL_LIST_CMDID,
65527 + NO_SYNC_WMIFLAG));
65528 +}
65529 +
65530 +/*
65531 + * used to generate a wmi sey channel Parameters cmd.
65532 + * mode should always be specified and corresponds to the phy mode of the
65533 + * wlan.
65534 + * numChan should alway sbe specified. If zero indicates that all available
65535 + * channels should be used.
65536 + * channelList is an array of channel frequencies (in Mhz) which the radio
65537 + * should limit its operation to. It should be NULL if numChan == 0. Size of
65538 + * array should correspond to numChan entries.
65539 + */
65540 +A_STATUS
65541 +wmi_set_channelParams_cmd(struct wmi_t *wmip, A_UINT8 scanParam,
65542 + WMI_PHY_MODE mode, A_INT8 numChan,
65543 + A_UINT16 *channelList)
65544 +{
65545 + void *osbuf;
65546 + WMI_CHANNEL_PARAMS_CMD *cmd;
65547 + A_INT8 size;
65548 +
65549 + size = sizeof (*cmd);
65550 +
65551 + if (numChan) {
65552 + if (numChan > WMI_MAX_CHANNELS) {
65553 + return A_EINVAL;
65554 + }
65555 + size += sizeof(A_UINT16) * (numChan - 1);
65556 + }
65557 +
65558 + osbuf = A_NETBUF_ALLOC(size);
65559 + if (osbuf == NULL) {
65560 + return A_NO_MEMORY;
65561 + }
65562 +
65563 + A_NETBUF_PUT(osbuf, size);
65564 +
65565 + cmd = (WMI_CHANNEL_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
65566 + A_MEMZERO(cmd, size);
65567 +
65568 + wmip->wmi_phyMode = mode;
65569 + cmd->scanParam = scanParam;
65570 + cmd->phyMode = mode;
65571 + cmd->numChannels = numChan;
65572 + A_MEMCPY(cmd->channelList, channelList, numChan * sizeof(A_UINT16));
65573 +
65574 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_CHANNEL_PARAMS_CMDID,
65575 + NO_SYNC_WMIFLAG));
65576 +}
65577 +
65578 +A_STATUS
65579 +wmi_set_rssi_threshold_params(struct wmi_t *wmip,
65580 + WMI_RSSI_THRESHOLD_PARAMS_CMD *rssiCmd)
65581 +{
65582 + void *osbuf;
65583 + A_INT8 size;
65584 + WMI_RSSI_THRESHOLD_PARAMS_CMD *cmd;
65585 + /* These values are in ascending order */
65586 + if( rssiCmd->thresholdAbove6_Val <= rssiCmd->thresholdAbove5_Val ||
65587 + rssiCmd->thresholdAbove5_Val <= rssiCmd->thresholdAbove4_Val ||
65588 + rssiCmd->thresholdAbove4_Val <= rssiCmd->thresholdAbove3_Val ||
65589 + rssiCmd->thresholdAbove3_Val <= rssiCmd->thresholdAbove2_Val ||
65590 + rssiCmd->thresholdAbove2_Val <= rssiCmd->thresholdAbove1_Val ||
65591 + rssiCmd->thresholdBelow6_Val <= rssiCmd->thresholdBelow5_Val ||
65592 + rssiCmd->thresholdBelow5_Val <= rssiCmd->thresholdBelow4_Val ||
65593 + rssiCmd->thresholdBelow4_Val <= rssiCmd->thresholdBelow3_Val ||
65594 + rssiCmd->thresholdBelow3_Val <= rssiCmd->thresholdBelow2_Val ||
65595 + rssiCmd->thresholdBelow2_Val <= rssiCmd->thresholdBelow1_Val) {
65596 +
65597 + return A_EINVAL;
65598 + }
65599 +
65600 + size = sizeof (*cmd);
65601 +
65602 + osbuf = A_NETBUF_ALLOC(size);
65603 + if (osbuf == NULL) {
65604 + return A_NO_MEMORY;
65605 + }
65606 +
65607 + A_NETBUF_PUT(osbuf, size);
65608 +
65609 + cmd = (WMI_RSSI_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
65610 + A_MEMZERO(cmd, size);
65611 + A_MEMCPY(cmd, rssiCmd, sizeof(WMI_RSSI_THRESHOLD_PARAMS_CMD));
65612 +
65613 + return (wmi_cmd_send(wmip, osbuf, WMI_RSSI_THRESHOLD_PARAMS_CMDID,
65614 + NO_SYNC_WMIFLAG));
65615 +}
65616 +
65617 +A_STATUS
65618 +wmi_set_host_sleep_mode_cmd(struct wmi_t *wmip,
65619 + WMI_SET_HOST_SLEEP_MODE_CMD *hostModeCmd)
65620 +{
65621 + void *osbuf;
65622 + A_INT8 size;
65623 + WMI_SET_HOST_SLEEP_MODE_CMD *cmd;
65624 +
65625 + if( hostModeCmd->awake == hostModeCmd->asleep) {
65626 + return A_EINVAL;
65627 + }
65628 +
65629 + size = sizeof (*cmd);
65630 +
65631 + osbuf = A_NETBUF_ALLOC(size);
65632 + if (osbuf == NULL) {
65633 + return A_NO_MEMORY;
65634 + }
65635 +
65636 + A_NETBUF_PUT(osbuf, size);
65637 +
65638 + cmd = (WMI_SET_HOST_SLEEP_MODE_CMD *)(A_NETBUF_DATA(osbuf));
65639 + A_MEMZERO(cmd, size);
65640 + A_MEMCPY(cmd, hostModeCmd, sizeof(WMI_SET_HOST_SLEEP_MODE_CMD));
65641 +
65642 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_HOST_SLEEP_MODE_CMDID,
65643 + NO_SYNC_WMIFLAG));
65644 +}
65645 +
65646 +A_STATUS
65647 +wmi_set_wow_mode_cmd(struct wmi_t *wmip,
65648 + WMI_SET_WOW_MODE_CMD *wowModeCmd)
65649 +{
65650 + void *osbuf;
65651 + A_INT8 size;
65652 + WMI_SET_WOW_MODE_CMD *cmd;
65653 +
65654 + size = sizeof (*cmd);
65655 +
65656 + osbuf = A_NETBUF_ALLOC(size);
65657 + if (osbuf == NULL) {
65658 + return A_NO_MEMORY;
65659 + }
65660 +
65661 + A_NETBUF_PUT(osbuf, size);
65662 +
65663 + cmd = (WMI_SET_WOW_MODE_CMD *)(A_NETBUF_DATA(osbuf));
65664 + A_MEMZERO(cmd, size);
65665 + A_MEMCPY(cmd, wowModeCmd, sizeof(WMI_SET_WOW_MODE_CMD));
65666 +
65667 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_WOW_MODE_CMDID,
65668 + NO_SYNC_WMIFLAG));
65669 +
65670 +}
65671 +
65672 +A_STATUS
65673 +wmi_get_wow_list_cmd(struct wmi_t *wmip,
65674 + WMI_GET_WOW_LIST_CMD *wowListCmd)
65675 +{
65676 + void *osbuf;
65677 + A_INT8 size;
65678 + WMI_GET_WOW_LIST_CMD *cmd;
65679 +
65680 + size = sizeof (*cmd);
65681 +
65682 + osbuf = A_NETBUF_ALLOC(size);
65683 + if (osbuf == NULL) {
65684 + return A_NO_MEMORY;
65685 + }
65686 +
65687 + A_NETBUF_PUT(osbuf, size);
65688 +
65689 + cmd = (WMI_GET_WOW_LIST_CMD *)(A_NETBUF_DATA(osbuf));
65690 + A_MEMZERO(cmd, size);
65691 + A_MEMCPY(cmd, wowListCmd, sizeof(WMI_GET_WOW_LIST_CMD));
65692 +
65693 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_WOW_LIST_CMDID,
65694 + NO_SYNC_WMIFLAG));
65695 +
65696 +}
65697 +
65698 +static A_STATUS
65699 +wmi_get_wow_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
65700 +{
65701 + WMI_GET_WOW_LIST_REPLY *reply;
65702 +
65703 + if (len < sizeof(WMI_GET_WOW_LIST_REPLY)) {
65704 + return A_EINVAL;
65705 + }
65706 + reply = (WMI_GET_WOW_LIST_REPLY *)datap;
65707 +
65708 + A_WMI_WOW_LIST_EVENT(wmip->wmi_devt, reply->num_filters,
65709 + reply);
65710 +
65711 + return A_OK;
65712 +}
65713 +
65714 +A_STATUS wmi_add_wow_pattern_cmd(struct wmi_t *wmip,
65715 + WMI_ADD_WOW_PATTERN_CMD *addWowCmd,
65716 + A_UINT8* pattern, A_UINT8* mask,
65717 + A_UINT8 pattern_size)
65718 +{
65719 + void *osbuf;
65720 + A_INT8 size;
65721 + WMI_ADD_WOW_PATTERN_CMD *cmd;
65722 + A_UINT8 *filter_mask = NULL;
65723 +
65724 + size = sizeof (*cmd);
65725 +
65726 + size += ((2 * addWowCmd->filter_size)* sizeof(A_UINT8));
65727 + osbuf = A_NETBUF_ALLOC(size);
65728 + if (osbuf == NULL) {
65729 + return A_NO_MEMORY;
65730 + }
65731 +
65732 + A_NETBUF_PUT(osbuf, size);
65733 +
65734 + cmd = (WMI_ADD_WOW_PATTERN_CMD *)(A_NETBUF_DATA(osbuf));
65735 + cmd->filter_list_id = addWowCmd->filter_list_id;
65736 + cmd->filter_offset = addWowCmd->filter_offset;
65737 + cmd->filter_size = addWowCmd->filter_size;
65738 +
65739 + A_MEMCPY(cmd->filter, pattern, addWowCmd->filter_size);
65740 +
65741 + filter_mask = (A_UINT8*)(cmd->filter + cmd->filter_size);
65742 + A_MEMCPY(filter_mask, mask, addWowCmd->filter_size);
65743 +
65744 +
65745 + return (wmi_cmd_send(wmip, osbuf, WMI_ADD_WOW_PATTERN_CMDID,
65746 + NO_SYNC_WMIFLAG));
65747 +}
65748 +
65749 +A_STATUS
65750 +wmi_del_wow_pattern_cmd(struct wmi_t *wmip,
65751 + WMI_DEL_WOW_PATTERN_CMD *delWowCmd)
65752 +{
65753 + void *osbuf;
65754 + A_INT8 size;
65755 + WMI_DEL_WOW_PATTERN_CMD *cmd;
65756 +
65757 + size = sizeof (*cmd);
65758 +
65759 + osbuf = A_NETBUF_ALLOC(size);
65760 + if (osbuf == NULL) {
65761 + return A_NO_MEMORY;
65762 + }
65763 +
65764 + A_NETBUF_PUT(osbuf, size);
65765 +
65766 + cmd = (WMI_DEL_WOW_PATTERN_CMD *)(A_NETBUF_DATA(osbuf));
65767 + A_MEMZERO(cmd, size);
65768 + A_MEMCPY(cmd, delWowCmd, sizeof(WMI_DEL_WOW_PATTERN_CMD));
65769 +
65770 + return (wmi_cmd_send(wmip, osbuf, WMI_DEL_WOW_PATTERN_CMDID,
65771 + NO_SYNC_WMIFLAG));
65772 +
65773 +}
65774 +
65775 +A_STATUS
65776 +wmi_set_snr_threshold_params(struct wmi_t *wmip,
65777 + WMI_SNR_THRESHOLD_PARAMS_CMD *snrCmd)
65778 +{
65779 + void *osbuf;
65780 + A_INT8 size;
65781 + WMI_SNR_THRESHOLD_PARAMS_CMD *cmd;
65782 + /* These values are in ascending order */
65783 + if( snrCmd->thresholdAbove4_Val <= snrCmd->thresholdAbove3_Val ||
65784 + snrCmd->thresholdAbove3_Val <= snrCmd->thresholdAbove2_Val ||
65785 + snrCmd->thresholdAbove2_Val <= snrCmd->thresholdAbove1_Val ||
65786 + snrCmd->thresholdBelow4_Val <= snrCmd->thresholdBelow3_Val ||
65787 + snrCmd->thresholdBelow3_Val <= snrCmd->thresholdBelow2_Val ||
65788 + snrCmd->thresholdBelow2_Val <= snrCmd->thresholdBelow1_Val) {
65789 +
65790 + return A_EINVAL;
65791 + }
65792 +
65793 + size = sizeof (*cmd);
65794 +
65795 + osbuf = A_NETBUF_ALLOC(size);
65796 + if (osbuf == NULL) {
65797 + return A_NO_MEMORY;
65798 + }
65799 +
65800 + A_NETBUF_PUT(osbuf, size);
65801 +
65802 + cmd = (WMI_SNR_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
65803 + A_MEMZERO(cmd, size);
65804 + A_MEMCPY(cmd, snrCmd, sizeof(WMI_SNR_THRESHOLD_PARAMS_CMD));
65805 +
65806 + return (wmi_cmd_send(wmip, osbuf, WMI_SNR_THRESHOLD_PARAMS_CMDID,
65807 + NO_SYNC_WMIFLAG));
65808 +}
65809 +
65810 +A_STATUS
65811 +wmi_clr_rssi_snr(struct wmi_t *wmip)
65812 +{
65813 + void *osbuf;
65814 +
65815 + osbuf = A_NETBUF_ALLOC(sizeof(int));
65816 + if (osbuf == NULL) {
65817 + return A_NO_MEMORY;
65818 + }
65819 +
65820 + return (wmi_cmd_send(wmip, osbuf, WMI_CLR_RSSI_SNR_CMDID,
65821 + NO_SYNC_WMIFLAG));
65822 +}
65823 +
65824 +A_STATUS
65825 +wmi_set_lq_threshold_params(struct wmi_t *wmip,
65826 + WMI_LQ_THRESHOLD_PARAMS_CMD *lqCmd)
65827 +{
65828 + void *osbuf;
65829 + A_INT8 size;
65830 + WMI_LQ_THRESHOLD_PARAMS_CMD *cmd;
65831 + /* These values are in ascending order */
65832 + if( lqCmd->thresholdAbove4_Val <= lqCmd->thresholdAbove3_Val ||
65833 + lqCmd->thresholdAbove3_Val <= lqCmd->thresholdAbove2_Val ||
65834 + lqCmd->thresholdAbove2_Val <= lqCmd->thresholdAbove1_Val ||
65835 + lqCmd->thresholdBelow4_Val <= lqCmd->thresholdBelow3_Val ||
65836 + lqCmd->thresholdBelow3_Val <= lqCmd->thresholdBelow2_Val ||
65837 + lqCmd->thresholdBelow2_Val <= lqCmd->thresholdBelow1_Val ) {
65838 +
65839 + return A_EINVAL;
65840 + }
65841 +
65842 + size = sizeof (*cmd);
65843 +
65844 + osbuf = A_NETBUF_ALLOC(size);
65845 + if (osbuf == NULL) {
65846 + return A_NO_MEMORY;
65847 + }
65848 +
65849 + A_NETBUF_PUT(osbuf, size);
65850 +
65851 + cmd = (WMI_LQ_THRESHOLD_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
65852 + A_MEMZERO(cmd, size);
65853 + A_MEMCPY(cmd, lqCmd, sizeof(WMI_LQ_THRESHOLD_PARAMS_CMD));
65854 +
65855 + return (wmi_cmd_send(wmip, osbuf, WMI_LQ_THRESHOLD_PARAMS_CMDID,
65856 + NO_SYNC_WMIFLAG));
65857 +}
65858 +
65859 +A_STATUS
65860 +wmi_set_error_report_bitmask(struct wmi_t *wmip, A_UINT32 mask)
65861 +{
65862 + void *osbuf;
65863 + A_INT8 size;
65864 + WMI_TARGET_ERROR_REPORT_BITMASK *cmd;
65865 +
65866 + size = sizeof (*cmd);
65867 +
65868 + osbuf = A_NETBUF_ALLOC(size);
65869 + if (osbuf == NULL) {
65870 + return A_NO_MEMORY;
65871 + }
65872 +
65873 + A_NETBUF_PUT(osbuf, size);
65874 +
65875 + cmd = (WMI_TARGET_ERROR_REPORT_BITMASK *)(A_NETBUF_DATA(osbuf));
65876 + A_MEMZERO(cmd, size);
65877 +
65878 + cmd->bitmask = mask;
65879 +
65880 + return (wmi_cmd_send(wmip, osbuf, WMI_TARGET_ERROR_REPORT_BITMASK_CMDID,
65881 + NO_SYNC_WMIFLAG));
65882 +}
65883 +
65884 +A_STATUS
65885 +wmi_get_challenge_resp_cmd(struct wmi_t *wmip, A_UINT32 cookie, A_UINT32 source)
65886 +{
65887 + void *osbuf;
65888 + WMIX_HB_CHALLENGE_RESP_CMD *cmd;
65889 +
65890 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65891 + if (osbuf == NULL) {
65892 + return A_NO_MEMORY;
65893 + }
65894 +
65895 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65896 +
65897 + cmd = (WMIX_HB_CHALLENGE_RESP_CMD *)(A_NETBUF_DATA(osbuf));
65898 + cmd->cookie = cookie;
65899 + cmd->source = source;
65900 +
65901 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_HB_CHALLENGE_RESP_CMDID,
65902 + NO_SYNC_WMIFLAG));
65903 +}
65904 +
65905 +A_STATUS
65906 +wmi_config_debug_module_cmd(struct wmi_t *wmip, A_UINT16 mmask,
65907 + A_UINT16 tsr, A_BOOL rep, A_UINT16 size,
65908 + A_UINT32 valid)
65909 +{
65910 + void *osbuf;
65911 + WMIX_DBGLOG_CFG_MODULE_CMD *cmd;
65912 +
65913 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65914 + if (osbuf == NULL) {
65915 + return A_NO_MEMORY;
65916 + }
65917 +
65918 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65919 +
65920 + cmd = (WMIX_DBGLOG_CFG_MODULE_CMD *)(A_NETBUF_DATA(osbuf));
65921 + cmd->config.cfgmmask = mmask;
65922 + cmd->config.cfgtsr = tsr;
65923 + cmd->config.cfgrep = rep;
65924 + cmd->config.cfgsize = size;
65925 + cmd->config.cfgvalid = valid;
65926 +
65927 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DBGLOG_CFG_MODULE_CMDID,
65928 + NO_SYNC_WMIFLAG));
65929 +}
65930 +
65931 +A_STATUS
65932 +wmi_get_stats_cmd(struct wmi_t *wmip)
65933 +{
65934 + void *osbuf;
65935 +
65936 + osbuf = A_NETBUF_ALLOC(0); /* no payload */
65937 + if (osbuf == NULL) {
65938 + return A_NO_MEMORY;
65939 + }
65940 +
65941 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_STATISTICS_CMDID,
65942 + NO_SYNC_WMIFLAG));
65943 +}
65944 +
65945 +A_STATUS
65946 +wmi_addBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex, A_UINT8 *bssid)
65947 +{
65948 + void *osbuf;
65949 + WMI_ADD_BAD_AP_CMD *cmd;
65950 +
65951 + if ((bssid == NULL) || (apIndex > WMI_MAX_BAD_AP_INDEX)) {
65952 + return A_EINVAL;
65953 + }
65954 +
65955 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65956 + if (osbuf == NULL) {
65957 + return A_NO_MEMORY;
65958 + }
65959 +
65960 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65961 +
65962 + cmd = (WMI_ADD_BAD_AP_CMD *)(A_NETBUF_DATA(osbuf));
65963 + cmd->badApIndex = apIndex;
65964 + A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
65965 +
65966 + return (wmi_cmd_send(wmip, osbuf, WMI_ADD_BAD_AP_CMDID, NO_SYNC_WMIFLAG));
65967 +}
65968 +
65969 +A_STATUS
65970 +wmi_deleteBadAp_cmd(struct wmi_t *wmip, A_UINT8 apIndex)
65971 +{
65972 + void *osbuf;
65973 + WMI_DELETE_BAD_AP_CMD *cmd;
65974 +
65975 + if (apIndex > WMI_MAX_BAD_AP_INDEX) {
65976 + return A_EINVAL;
65977 + }
65978 +
65979 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
65980 + if (osbuf == NULL) {
65981 + return A_NO_MEMORY;
65982 + }
65983 +
65984 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
65985 +
65986 + cmd = (WMI_DELETE_BAD_AP_CMD *)(A_NETBUF_DATA(osbuf));
65987 + cmd->badApIndex = apIndex;
65988 +
65989 + return (wmi_cmd_send(wmip, osbuf, WMI_DELETE_BAD_AP_CMDID,
65990 + NO_SYNC_WMIFLAG));
65991 +}
65992 +
65993 +A_STATUS
65994 +wmi_set_txPwr_cmd(struct wmi_t *wmip, A_UINT8 dbM)
65995 +{
65996 + void *osbuf;
65997 + WMI_SET_TX_PWR_CMD *cmd;
65998 +
65999 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66000 + if (osbuf == NULL) {
66001 + return A_NO_MEMORY;
66002 + }
66003 +
66004 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66005 +
66006 + cmd = (WMI_SET_TX_PWR_CMD *)(A_NETBUF_DATA(osbuf));
66007 + cmd->dbM = dbM;
66008 +
66009 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_TX_PWR_CMDID, NO_SYNC_WMIFLAG));
66010 +}
66011 +
66012 +A_STATUS
66013 +wmi_get_txPwr_cmd(struct wmi_t *wmip)
66014 +{
66015 + void *osbuf;
66016 +
66017 + osbuf = A_NETBUF_ALLOC(0); /* no payload */
66018 + if (osbuf == NULL) {
66019 + return A_NO_MEMORY;
66020 + }
66021 +
66022 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_TX_PWR_CMDID, NO_SYNC_WMIFLAG));
66023 +}
66024 +
66025 +A_STATUS
66026 +wmi_switch_radio(struct wmi_t *wmip, A_UINT8 on)
66027 +{
66028 + WMI_SCAN_PARAMS_CMD scParams = {0, 0, 0, 0, 0,
66029 + WMI_SHORTSCANRATIO_DEFAULT,
66030 + DEFAULT_SCAN_CTRL_FLAGS,
66031 + 0};
66032 +
66033 + if (on) {
66034 + /* Enable foreground scanning */
66035 + if (wmi_scanparams_cmd(wmip, scParams.fg_start_period,
66036 + scParams.fg_end_period,
66037 + scParams.bg_period,
66038 + scParams.minact_chdwell_time,
66039 + scParams.maxact_chdwell_time,
66040 + scParams.pas_chdwell_time,
66041 + scParams.shortScanRatio,
66042 + scParams.scanCtrlFlags,
66043 + scParams.max_dfsch_act_time) != A_OK) {
66044 + return -EIO;
66045 + }
66046 + } else {
66047 + wmi_disconnect_cmd(wmip);
66048 + if (wmi_scanparams_cmd(wmip, 0xFFFF, 0, 0, 0,
66049 + 0, 0, 0, 0xFF, 0) != A_OK) {
66050 + return -EIO;
66051 + }
66052 + }
66053 +
66054 + return A_OK;
66055 +}
66056 +
66057 +
66058 +A_UINT16
66059 +wmi_get_mapped_qos_queue(struct wmi_t *wmip, A_UINT8 trafficClass)
66060 +{
66061 + A_UINT16 activeTsids=0;
66062 +
66063 + LOCK_WMI(wmip);
66064 + activeTsids = wmip->wmi_streamExistsForAC[trafficClass];
66065 + UNLOCK_WMI(wmip);
66066 +
66067 + return activeTsids;
66068 +}
66069 +
66070 +A_STATUS
66071 +wmi_get_roam_tbl_cmd(struct wmi_t *wmip)
66072 +{
66073 + void *osbuf;
66074 +
66075 + osbuf = A_NETBUF_ALLOC(0); /* no payload */
66076 + if (osbuf == NULL) {
66077 + return A_NO_MEMORY;
66078 + }
66079 +
66080 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_ROAM_TBL_CMDID,
66081 + NO_SYNC_WMIFLAG));
66082 +}
66083 +
66084 +A_STATUS
66085 +wmi_get_roam_data_cmd(struct wmi_t *wmip, A_UINT8 roamDataType)
66086 +{
66087 + void *osbuf;
66088 + A_UINT32 size = sizeof(A_UINT8);
66089 + WMI_TARGET_ROAM_DATA *cmd;
66090 +
66091 + osbuf = A_NETBUF_ALLOC(size); /* no payload */
66092 + if (osbuf == NULL) {
66093 + return A_NO_MEMORY;
66094 + }
66095 +
66096 + A_NETBUF_PUT(osbuf, size);
66097 +
66098 + cmd = (WMI_TARGET_ROAM_DATA *)(A_NETBUF_DATA(osbuf));
66099 + cmd->roamDataType = roamDataType;
66100 +
66101 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_ROAM_DATA_CMDID,
66102 + NO_SYNC_WMIFLAG));
66103 +}
66104 +
66105 +A_STATUS
66106 +wmi_set_roam_ctrl_cmd(struct wmi_t *wmip, WMI_SET_ROAM_CTRL_CMD *p,
66107 + A_UINT8 size)
66108 +{
66109 + void *osbuf;
66110 + WMI_SET_ROAM_CTRL_CMD *cmd;
66111 +
66112 + osbuf = A_NETBUF_ALLOC(size);
66113 + if (osbuf == NULL) {
66114 + return A_NO_MEMORY;
66115 + }
66116 +
66117 + A_NETBUF_PUT(osbuf, size);
66118 +
66119 + cmd = (WMI_SET_ROAM_CTRL_CMD *)(A_NETBUF_DATA(osbuf));
66120 + A_MEMZERO(cmd, size);
66121 +
66122 + A_MEMCPY(cmd, p, size);
66123 +
66124 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_ROAM_CTRL_CMDID,
66125 + NO_SYNC_WMIFLAG));
66126 +}
66127 +
66128 +A_STATUS
66129 +wmi_set_powersave_timers_cmd(struct wmi_t *wmip,
66130 + WMI_POWERSAVE_TIMERS_POLICY_CMD *pCmd,
66131 + A_UINT8 size)
66132 +{
66133 + void *osbuf;
66134 + WMI_POWERSAVE_TIMERS_POLICY_CMD *cmd;
66135 +
66136 + /* These timers can't be zero */
66137 + if(!pCmd->psPollTimeout || !pCmd->triggerTimeout ||
66138 + !(pCmd->apsdTimPolicy == IGNORE_TIM_ALL_QUEUES_APSD ||
66139 + pCmd->apsdTimPolicy == PROCESS_TIM_ALL_QUEUES_APSD) ||
66140 + !(pCmd->simulatedAPSDTimPolicy == IGNORE_TIM_SIMULATED_APSD ||
66141 + pCmd->simulatedAPSDTimPolicy == PROCESS_TIM_SIMULATED_APSD))
66142 + return A_EINVAL;
66143 +
66144 + osbuf = A_NETBUF_ALLOC(size);
66145 + if (osbuf == NULL) {
66146 + return A_NO_MEMORY;
66147 + }
66148 +
66149 + A_NETBUF_PUT(osbuf, size);
66150 +
66151 + cmd = (WMI_POWERSAVE_TIMERS_POLICY_CMD *)(A_NETBUF_DATA(osbuf));
66152 + A_MEMZERO(cmd, size);
66153 +
66154 + A_MEMCPY(cmd, pCmd, size);
66155 +
66156 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_POWERSAVE_TIMERS_POLICY_CMDID,
66157 + NO_SYNC_WMIFLAG));
66158 +}
66159 +
66160 +#ifdef CONFIG_HOST_GPIO_SUPPORT
66161 +/* Send a command to Target to change GPIO output pins. */
66162 +A_STATUS
66163 +wmi_gpio_output_set(struct wmi_t *wmip,
66164 + A_UINT32 set_mask,
66165 + A_UINT32 clear_mask,
66166 + A_UINT32 enable_mask,
66167 + A_UINT32 disable_mask)
66168 +{
66169 + void *osbuf;
66170 + WMIX_GPIO_OUTPUT_SET_CMD *output_set;
66171 + int size;
66172 +
66173 + size = sizeof(*output_set);
66174 +
66175 + A_DPRINTF(DBG_WMI,
66176 + (DBGFMT "Enter - set=0x%x clear=0x%x enb=0x%x dis=0x%x\n", DBGARG,
66177 + set_mask, clear_mask, enable_mask, disable_mask));
66178 +
66179 + osbuf = A_NETBUF_ALLOC(size);
66180 + if (osbuf == NULL) {
66181 + return A_NO_MEMORY;
66182 + }
66183 + A_NETBUF_PUT(osbuf, size);
66184 + output_set = (WMIX_GPIO_OUTPUT_SET_CMD *)(A_NETBUF_DATA(osbuf));
66185 +
66186 + output_set->set_mask = set_mask;
66187 + output_set->clear_mask = clear_mask;
66188 + output_set->enable_mask = enable_mask;
66189 + output_set->disable_mask = disable_mask;
66190 +
66191 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_OUTPUT_SET_CMDID,
66192 + NO_SYNC_WMIFLAG));
66193 +}
66194 +
66195 +/* Send a command to the Target requesting state of the GPIO input pins */
66196 +A_STATUS
66197 +wmi_gpio_input_get(struct wmi_t *wmip)
66198 +{
66199 + void *osbuf;
66200 +
66201 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
66202 +
66203 + osbuf = A_NETBUF_ALLOC(0);
66204 + if (osbuf == NULL) {
66205 + return A_NO_MEMORY;
66206 + }
66207 +
66208 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_INPUT_GET_CMDID,
66209 + NO_SYNC_WMIFLAG));
66210 +}
66211 +
66212 +/* Send a command to the Target that changes the value of a GPIO register. */
66213 +A_STATUS
66214 +wmi_gpio_register_set(struct wmi_t *wmip,
66215 + A_UINT32 gpioreg_id,
66216 + A_UINT32 value)
66217 +{
66218 + void *osbuf;
66219 + WMIX_GPIO_REGISTER_SET_CMD *register_set;
66220 + int size;
66221 +
66222 + size = sizeof(*register_set);
66223 +
66224 + A_DPRINTF(DBG_WMI,
66225 + (DBGFMT "Enter - reg=%d value=0x%x\n", DBGARG, gpioreg_id, value));
66226 +
66227 + osbuf = A_NETBUF_ALLOC(size);
66228 + if (osbuf == NULL) {
66229 + return A_NO_MEMORY;
66230 + }
66231 + A_NETBUF_PUT(osbuf, size);
66232 + register_set = (WMIX_GPIO_REGISTER_SET_CMD *)(A_NETBUF_DATA(osbuf));
66233 +
66234 + register_set->gpioreg_id = gpioreg_id;
66235 + register_set->value = value;
66236 +
66237 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_REGISTER_SET_CMDID,
66238 + NO_SYNC_WMIFLAG));
66239 +}
66240 +
66241 +/* Send a command to the Target to fetch the value of a GPIO register. */
66242 +A_STATUS
66243 +wmi_gpio_register_get(struct wmi_t *wmip,
66244 + A_UINT32 gpioreg_id)
66245 +{
66246 + void *osbuf;
66247 + WMIX_GPIO_REGISTER_GET_CMD *register_get;
66248 + int size;
66249 +
66250 + size = sizeof(*register_get);
66251 +
66252 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter - reg=%d\n", DBGARG, gpioreg_id));
66253 +
66254 + osbuf = A_NETBUF_ALLOC(size);
66255 + if (osbuf == NULL) {
66256 + return A_NO_MEMORY;
66257 + }
66258 + A_NETBUF_PUT(osbuf, size);
66259 + register_get = (WMIX_GPIO_REGISTER_GET_CMD *)(A_NETBUF_DATA(osbuf));
66260 +
66261 + register_get->gpioreg_id = gpioreg_id;
66262 +
66263 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_REGISTER_GET_CMDID,
66264 + NO_SYNC_WMIFLAG));
66265 +}
66266 +
66267 +/* Send a command to the Target acknowledging some GPIO interrupts. */
66268 +A_STATUS
66269 +wmi_gpio_intr_ack(struct wmi_t *wmip,
66270 + A_UINT32 ack_mask)
66271 +{
66272 + void *osbuf;
66273 + WMIX_GPIO_INTR_ACK_CMD *intr_ack;
66274 + int size;
66275 +
66276 + size = sizeof(*intr_ack);
66277 +
66278 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter ack_mask=0x%x\n", DBGARG, ack_mask));
66279 +
66280 + osbuf = A_NETBUF_ALLOC(size);
66281 + if (osbuf == NULL) {
66282 + return A_NO_MEMORY;
66283 + }
66284 + A_NETBUF_PUT(osbuf, size);
66285 + intr_ack = (WMIX_GPIO_INTR_ACK_CMD *)(A_NETBUF_DATA(osbuf));
66286 +
66287 + intr_ack->ack_mask = ack_mask;
66288 +
66289 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_GPIO_INTR_ACK_CMDID,
66290 + NO_SYNC_WMIFLAG));
66291 +}
66292 +#endif /* CONFIG_HOST_GPIO_SUPPORT */
66293 +
66294 +A_STATUS
66295 +wmi_set_access_params_cmd(struct wmi_t *wmip, A_UINT16 txop, A_UINT8 eCWmin,
66296 + A_UINT8 eCWmax, A_UINT8 aifsn)
66297 +{
66298 + void *osbuf;
66299 + WMI_SET_ACCESS_PARAMS_CMD *cmd;
66300 +
66301 + if ((eCWmin > WMI_MAX_CW_ACPARAM) || (eCWmax > WMI_MAX_CW_ACPARAM) ||
66302 + (aifsn > WMI_MAX_AIFSN_ACPARAM))
66303 + {
66304 + return A_EINVAL;
66305 + }
66306 +
66307 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66308 + if (osbuf == NULL) {
66309 + return A_NO_MEMORY;
66310 + }
66311 +
66312 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66313 +
66314 + cmd = (WMI_SET_ACCESS_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
66315 + cmd->txop = txop;
66316 + cmd->eCWmin = eCWmin;
66317 + cmd->eCWmax = eCWmax;
66318 + cmd->aifsn = aifsn;
66319 +
66320 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_ACCESS_PARAMS_CMDID,
66321 + NO_SYNC_WMIFLAG));
66322 +}
66323 +
66324 +A_STATUS
66325 +wmi_set_retry_limits_cmd(struct wmi_t *wmip, A_UINT8 frameType,
66326 + A_UINT8 trafficClass, A_UINT8 maxRetries,
66327 + A_UINT8 enableNotify)
66328 +{
66329 + void *osbuf;
66330 + WMI_SET_RETRY_LIMITS_CMD *cmd;
66331 +
66332 + if ((frameType != MGMT_FRAMETYPE) && (frameType != CONTROL_FRAMETYPE) &&
66333 + (frameType != DATA_FRAMETYPE))
66334 + {
66335 + return A_EINVAL;
66336 + }
66337 +
66338 + if (maxRetries > WMI_MAX_RETRIES) {
66339 + return A_EINVAL;
66340 + }
66341 +
66342 + if (frameType != DATA_FRAMETYPE) {
66343 + trafficClass = 0;
66344 + }
66345 +
66346 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66347 + if (osbuf == NULL) {
66348 + return A_NO_MEMORY;
66349 + }
66350 +
66351 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66352 +
66353 + cmd = (WMI_SET_RETRY_LIMITS_CMD *)(A_NETBUF_DATA(osbuf));
66354 + cmd->frameType = frameType;
66355 + cmd->trafficClass = trafficClass;
66356 + cmd->maxRetries = maxRetries;
66357 + cmd->enableNotify = enableNotify;
66358 +
66359 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_RETRY_LIMITS_CMDID,
66360 + NO_SYNC_WMIFLAG));
66361 +}
66362 +
66363 +void
66364 +wmi_get_current_bssid(struct wmi_t *wmip, A_UINT8 *bssid)
66365 +{
66366 + if (bssid != NULL) {
66367 + A_MEMCPY(bssid, wmip->wmi_bssid, ATH_MAC_LEN);
66368 + }
66369 +}
66370 +
66371 +A_STATUS
66372 +wmi_set_opt_mode_cmd(struct wmi_t *wmip, A_UINT8 optMode)
66373 +{
66374 + void *osbuf;
66375 + WMI_SET_OPT_MODE_CMD *cmd;
66376 +
66377 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66378 + if (osbuf == NULL) {
66379 + return A_NO_MEMORY;
66380 + }
66381 +
66382 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66383 +
66384 + cmd = (WMI_SET_OPT_MODE_CMD *)(A_NETBUF_DATA(osbuf));
66385 + A_MEMZERO(cmd, sizeof(*cmd));
66386 + cmd->optMode = optMode;
66387 +
66388 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_OPT_MODE_CMDID,
66389 + SYNC_BOTH_WMIFLAG));
66390 +}
66391 +
66392 +A_STATUS
66393 +wmi_opt_tx_frame_cmd(struct wmi_t *wmip,
66394 + A_UINT8 frmType,
66395 + A_UINT8 *dstMacAddr,
66396 + A_UINT8 *bssid,
66397 + A_UINT16 optIEDataLen,
66398 + A_UINT8 *optIEData)
66399 +{
66400 + void *osbuf;
66401 + WMI_OPT_TX_FRAME_CMD *cmd;
66402 + osbuf = A_NETBUF_ALLOC(optIEDataLen + sizeof(*cmd));
66403 + if (osbuf == NULL) {
66404 + return A_NO_MEMORY;
66405 + }
66406 +
66407 + A_NETBUF_PUT(osbuf, (optIEDataLen + sizeof(*cmd)));
66408 +
66409 + cmd = (WMI_OPT_TX_FRAME_CMD *)(A_NETBUF_DATA(osbuf));
66410 + A_MEMZERO(cmd, (optIEDataLen + sizeof(*cmd)-1));
66411 +
66412 + cmd->frmType = frmType;
66413 + cmd->optIEDataLen = optIEDataLen;
66414 + //cmd->optIEData = (A_UINT8 *)((int)cmd + sizeof(*cmd));
66415 + A_MEMCPY(cmd->bssid, bssid, sizeof(cmd->bssid));
66416 + A_MEMCPY(cmd->dstAddr, dstMacAddr, sizeof(cmd->dstAddr));
66417 + A_MEMCPY(&cmd->optIEData[0], optIEData, optIEDataLen);
66418 +
66419 + return (wmi_cmd_send(wmip, osbuf, WMI_OPT_TX_FRAME_CMDID,
66420 + NO_SYNC_WMIFLAG));
66421 +}
66422 +
66423 +A_STATUS
66424 +wmi_set_adhoc_bconIntvl_cmd(struct wmi_t *wmip, A_UINT16 intvl)
66425 +{
66426 + void *osbuf;
66427 + WMI_BEACON_INT_CMD *cmd;
66428 +
66429 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66430 + if (osbuf == NULL) {
66431 + return A_NO_MEMORY;
66432 + }
66433 +
66434 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66435 +
66436 + cmd = (WMI_BEACON_INT_CMD *)(A_NETBUF_DATA(osbuf));
66437 + A_MEMZERO(cmd, sizeof(*cmd));
66438 + cmd->beaconInterval = intvl;
66439 +
66440 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_BEACON_INT_CMDID,
66441 + NO_SYNC_WMIFLAG));
66442 +}
66443 +
66444 +
66445 +A_STATUS
66446 +wmi_set_voice_pkt_size_cmd(struct wmi_t *wmip, A_UINT16 voicePktSize)
66447 +{
66448 + void *osbuf;
66449 + WMI_SET_VOICE_PKT_SIZE_CMD *cmd;
66450 +
66451 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66452 + if (osbuf == NULL) {
66453 + return A_NO_MEMORY;
66454 + }
66455 +
66456 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66457 +
66458 + cmd = (WMI_SET_VOICE_PKT_SIZE_CMD *)(A_NETBUF_DATA(osbuf));
66459 + A_MEMZERO(cmd, sizeof(*cmd));
66460 + cmd->voicePktSize = voicePktSize;
66461 +
66462 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_VOICE_PKT_SIZE_CMDID,
66463 + NO_SYNC_WMIFLAG));
66464 +}
66465 +
66466 +
66467 +A_STATUS
66468 +wmi_set_max_sp_len_cmd(struct wmi_t *wmip, A_UINT8 maxSPLen)
66469 +{
66470 + void *osbuf;
66471 + WMI_SET_MAX_SP_LEN_CMD *cmd;
66472 +
66473 + /* maxSPLen is a two-bit value. If user trys to set anything
66474 + * other than this, then its invalid
66475 + */
66476 + if(maxSPLen & ~0x03)
66477 + return A_EINVAL;
66478 +
66479 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66480 + if (osbuf == NULL) {
66481 + return A_NO_MEMORY;
66482 + }
66483 +
66484 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66485 +
66486 + cmd = (WMI_SET_MAX_SP_LEN_CMD *)(A_NETBUF_DATA(osbuf));
66487 + A_MEMZERO(cmd, sizeof(*cmd));
66488 + cmd->maxSPLen = maxSPLen;
66489 +
66490 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_MAX_SP_LEN_CMDID,
66491 + NO_SYNC_WMIFLAG));
66492 +}
66493 +
66494 +A_UINT8
66495 +convert_userPriority_to_trafficClass(A_UINT8 userPriority)
66496 +{
66497 + return (up_to_ac[userPriority & 0x7]);
66498 +}
66499 +
66500 +A_UINT8
66501 +wmi_get_power_mode_cmd(struct wmi_t *wmip)
66502 +{
66503 + return wmip->wmi_powerMode;
66504 +}
66505 +
66506 +A_STATUS
66507 +wmi_verify_tspec_params(WMI_CREATE_PSTREAM_CMD *pCmd, A_BOOL tspecCompliance)
66508 +{
66509 + return A_OK;
66510 +}
66511 +
66512 +#ifdef CONFIG_HOST_TCMD_SUPPORT
66513 +static A_STATUS
66514 +wmi_tcmd_test_report_rx(struct wmi_t *wmip, A_UINT8 *datap, int len)
66515 +{
66516 +
66517 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
66518 +
66519 + A_WMI_TCMD_RX_REPORT_EVENT(wmip->wmi_devt, datap, len);
66520 +
66521 + return A_OK;
66522 +}
66523 +
66524 +#endif /* CONFIG_HOST_TCMD_SUPPORT*/
66525 +
66526 +A_STATUS
66527 +wmi_set_authmode_cmd(struct wmi_t *wmip, A_UINT8 mode)
66528 +{
66529 + void *osbuf;
66530 + WMI_SET_AUTH_MODE_CMD *cmd;
66531 +
66532 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66533 + if (osbuf == NULL) {
66534 + return A_NO_MEMORY;
66535 + }
66536 +
66537 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66538 +
66539 + cmd = (WMI_SET_AUTH_MODE_CMD *)(A_NETBUF_DATA(osbuf));
66540 + A_MEMZERO(cmd, sizeof(*cmd));
66541 + cmd->mode = mode;
66542 +
66543 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_AUTH_MODE_CMDID,
66544 + NO_SYNC_WMIFLAG));
66545 +}
66546 +
66547 +A_STATUS
66548 +wmi_set_reassocmode_cmd(struct wmi_t *wmip, A_UINT8 mode)
66549 +{
66550 + void *osbuf;
66551 + WMI_SET_REASSOC_MODE_CMD *cmd;
66552 +
66553 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66554 + if (osbuf == NULL) {
66555 + return A_NO_MEMORY;
66556 + }
66557 +
66558 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66559 +
66560 + cmd = (WMI_SET_REASSOC_MODE_CMD *)(A_NETBUF_DATA(osbuf));
66561 + A_MEMZERO(cmd, sizeof(*cmd));
66562 + cmd->mode = mode;
66563 +
66564 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_REASSOC_MODE_CMDID,
66565 + NO_SYNC_WMIFLAG));
66566 +}
66567 +
66568 +A_STATUS
66569 +wmi_set_lpreamble_cmd(struct wmi_t *wmip, A_UINT8 status)
66570 +{
66571 + void *osbuf;
66572 + WMI_SET_LPREAMBLE_CMD *cmd;
66573 +
66574 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66575 + if (osbuf == NULL) {
66576 + return A_NO_MEMORY;
66577 + }
66578 +
66579 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66580 +
66581 + cmd = (WMI_SET_LPREAMBLE_CMD *)(A_NETBUF_DATA(osbuf));
66582 + A_MEMZERO(cmd, sizeof(*cmd));
66583 + cmd->status = status;
66584 +
66585 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_LPREAMBLE_CMDID,
66586 + NO_SYNC_WMIFLAG));
66587 +}
66588 +
66589 +A_STATUS
66590 +wmi_set_rts_cmd(struct wmi_t *wmip, A_UINT16 threshold)
66591 +{
66592 + void *osbuf;
66593 + WMI_SET_RTS_CMD *cmd;
66594 +
66595 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66596 + if (osbuf == NULL) {
66597 + return A_NO_MEMORY;
66598 + }
66599 +
66600 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66601 +
66602 + cmd = (WMI_SET_RTS_CMD*)(A_NETBUF_DATA(osbuf));
66603 + A_MEMZERO(cmd, sizeof(*cmd));
66604 + cmd->threshold = threshold;
66605 +
66606 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_RTS_CMDID,
66607 + NO_SYNC_WMIFLAG));
66608 +}
66609 +
66610 +A_STATUS
66611 +wmi_set_wmm_cmd(struct wmi_t *wmip, WMI_WMM_STATUS status)
66612 +{
66613 + void *osbuf;
66614 + WMI_SET_WMM_CMD *cmd;
66615 +
66616 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66617 + if (osbuf == NULL) {
66618 + return A_NO_MEMORY;
66619 + }
66620 +
66621 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66622 +
66623 + cmd = (WMI_SET_WMM_CMD*)(A_NETBUF_DATA(osbuf));
66624 + A_MEMZERO(cmd, sizeof(*cmd));
66625 + cmd->status = status;
66626 +
66627 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_WMM_CMDID,
66628 + NO_SYNC_WMIFLAG));
66629 +
66630 +}
66631 +
66632 +A_STATUS
66633 +wmi_set_wmm_txop(struct wmi_t *wmip, WMI_TXOP_CFG cfg)
66634 +{
66635 + void *osbuf;
66636 + WMI_SET_WMM_TXOP_CMD *cmd;
66637 +
66638 + if( !((cfg == WMI_TXOP_DISABLED) || (cfg == WMI_TXOP_ENABLED)) )
66639 + return A_EINVAL;
66640 +
66641 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66642 + if (osbuf == NULL) {
66643 + return A_NO_MEMORY;
66644 + }
66645 +
66646 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66647 +
66648 + cmd = (WMI_SET_WMM_TXOP_CMD *)(A_NETBUF_DATA(osbuf));
66649 + A_MEMZERO(cmd, sizeof(*cmd));
66650 + cmd->txopEnable = cfg;
66651 +
66652 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_WMM_TXOP_CMDID,
66653 + NO_SYNC_WMIFLAG));
66654 +
66655 +}
66656 +
66657 +#ifdef CONFIG_HOST_TCMD_SUPPORT
66658 +/* WMI layer doesn't need to know the data type of the test cmd.
66659 + This would be beneficial for customers like Qualcomm, who might
66660 + have different test command requirements from differnt manufacturers
66661 + */
66662 +A_STATUS
66663 +wmi_test_cmd(struct wmi_t *wmip, A_UINT8 *buf, A_UINT32 len)
66664 +{
66665 + void *osbuf;
66666 + char *data;
66667 +
66668 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter\n", DBGARG));
66669 +
66670 + osbuf= A_NETBUF_ALLOC(len);
66671 + if(osbuf == NULL)
66672 + {
66673 + return A_NO_MEMORY;
66674 + }
66675 + A_NETBUF_PUT(osbuf, len);
66676 + data = A_NETBUF_DATA(osbuf);
66677 + A_MEMCPY(data, buf, len);
66678 +
66679 + return(wmi_cmd_send(wmip, osbuf, WMI_TEST_CMDID,
66680 + NO_SYNC_WMIFLAG));
66681 +}
66682 +
66683 +#endif
66684 +
66685 +A_STATUS
66686 +wmi_set_bt_status_cmd(struct wmi_t *wmip, A_UINT8 streamType, A_UINT8 status)
66687 +{
66688 + void *osbuf;
66689 + WMI_SET_BT_STATUS_CMD *cmd;
66690 +
66691 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66692 + if (osbuf == NULL) {
66693 + return A_NO_MEMORY;
66694 + }
66695 +
66696 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66697 +
66698 + cmd = (WMI_SET_BT_STATUS_CMD *)(A_NETBUF_DATA(osbuf));
66699 + A_MEMZERO(cmd, sizeof(*cmd));
66700 + cmd->streamType = streamType;
66701 + cmd->status = status;
66702 +
66703 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_BT_STATUS_CMDID,
66704 + NO_SYNC_WMIFLAG));
66705 +}
66706 +
66707 +A_STATUS
66708 +wmi_set_bt_params_cmd(struct wmi_t *wmip, WMI_SET_BT_PARAMS_CMD* cmd)
66709 +{
66710 + void *osbuf;
66711 + WMI_SET_BT_PARAMS_CMD* alloc_cmd;
66712 +
66713 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66714 + if (osbuf == NULL) {
66715 + return A_NO_MEMORY;
66716 + }
66717 +
66718 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66719 +
66720 + alloc_cmd = (WMI_SET_BT_PARAMS_CMD *)(A_NETBUF_DATA(osbuf));
66721 + A_MEMZERO(alloc_cmd, sizeof(*cmd));
66722 + A_MEMCPY(alloc_cmd, cmd, sizeof(*cmd));
66723 +
66724 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_BT_PARAMS_CMDID,
66725 + NO_SYNC_WMIFLAG));
66726 +}
66727 +
66728 +A_STATUS
66729 +wmi_get_keepalive_configured(struct wmi_t *wmip)
66730 +{
66731 + void *osbuf;
66732 + WMI_GET_KEEPALIVE_CMD *cmd;
66733 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66734 + if (osbuf == NULL) {
66735 + return A_NO_MEMORY;
66736 + }
66737 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66738 + cmd = (WMI_GET_KEEPALIVE_CMD *)(A_NETBUF_DATA(osbuf));
66739 + A_MEMZERO(cmd, sizeof(*cmd));
66740 + return (wmi_cmd_send(wmip, osbuf, WMI_GET_KEEPALIVE_CMDID,
66741 + NO_SYNC_WMIFLAG));
66742 +}
66743 +
66744 +A_UINT8
66745 +wmi_get_keepalive_cmd(struct wmi_t *wmip)
66746 +{
66747 + return wmip->wmi_keepaliveInterval;
66748 +}
66749 +
66750 +A_STATUS
66751 +wmi_set_keepalive_cmd(struct wmi_t *wmip, A_UINT8 keepaliveInterval)
66752 +{
66753 + void *osbuf;
66754 + WMI_SET_KEEPALIVE_CMD *cmd;
66755 +
66756 + osbuf = A_NETBUF_ALLOC(sizeof(*cmd));
66757 + if (osbuf == NULL) {
66758 + return A_NO_MEMORY;
66759 + }
66760 +
66761 + A_NETBUF_PUT(osbuf, sizeof(*cmd));
66762 +
66763 + cmd = (WMI_SET_KEEPALIVE_CMD *)(A_NETBUF_DATA(osbuf));
66764 + A_MEMZERO(cmd, sizeof(*cmd));
66765 + cmd->keepaliveInterval = keepaliveInterval;
66766 + wmip->wmi_keepaliveInterval = keepaliveInterval;
66767 +
66768 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_KEEPALIVE_CMDID,
66769 + NO_SYNC_WMIFLAG));
66770 +}
66771 +
66772 +A_STATUS
66773 +wmi_set_appie_cmd(struct wmi_t *wmip, A_UINT8 mgmtFrmType, A_UINT8 ieLen,
66774 + A_UINT8 *ieInfo)
66775 +{
66776 + void *osbuf;
66777 + WMI_SET_APPIE_CMD *cmd;
66778 + A_UINT16 cmdLen;
66779 +
66780 + if (ieLen > WMI_MAX_IE_LEN) {
66781 + return A_ERROR;
66782 + }
66783 + cmdLen = sizeof(*cmd) + ieLen - 1;
66784 + osbuf = A_NETBUF_ALLOC(cmdLen);
66785 + if (osbuf == NULL) {
66786 + return A_NO_MEMORY;
66787 + }
66788 +
66789 + A_NETBUF_PUT(osbuf, cmdLen);
66790 +
66791 + cmd = (WMI_SET_APPIE_CMD *)(A_NETBUF_DATA(osbuf));
66792 + A_MEMZERO(cmd, cmdLen);
66793 +
66794 + cmd->mgmtFrmType = mgmtFrmType;
66795 + cmd->ieLen = ieLen;
66796 + A_MEMCPY(cmd->ieInfo, ieInfo, ieLen);
66797 +
66798 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_APPIE_CMDID, NO_SYNC_WMIFLAG));
66799 +}
66800 +
66801 +A_STATUS
66802 +wmi_set_halparam_cmd(struct wmi_t *wmip, A_UINT8 *cmd, A_UINT16 dataLen)
66803 +{
66804 + void *osbuf;
66805 + A_UINT8 *data;
66806 +
66807 + osbuf = A_NETBUF_ALLOC(dataLen);
66808 + if (osbuf == NULL) {
66809 + return A_NO_MEMORY;
66810 + }
66811 +
66812 + A_NETBUF_PUT(osbuf, dataLen);
66813 +
66814 + data = A_NETBUF_DATA(osbuf);
66815 +
66816 + A_MEMCPY(data, cmd, dataLen);
66817 +
66818 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_WHALPARAM_CMDID, NO_SYNC_WMIFLAG));
66819 +}
66820 +
66821 +A_INT32
66822 +wmi_get_rate(A_INT8 rateindex)
66823 +{
66824 + if (rateindex == RATE_AUTO) {
66825 + return 0;
66826 + } else {
66827 + return(wmi_rateTable[(A_UINT32) rateindex]);
66828 + }
66829 +}
66830 +
66831 +void
66832 +wmi_node_return (struct wmi_t *wmip, bss_t *bss)
66833 +{
66834 + if (NULL != bss)
66835 + {
66836 + wlan_node_return (&wmip->wmi_scan_table, bss);
66837 + }
66838 +}
66839 +
66840 +bss_t *
66841 +wmi_find_Ssidnode (struct wmi_t *wmip, A_UCHAR *pSsid,
66842 + A_UINT32 ssidLength, A_BOOL bIsWPA2)
66843 +{
66844 + bss_t *node = NULL;
66845 + node = wlan_find_Ssidnode (&wmip->wmi_scan_table, pSsid,
66846 + ssidLength, bIsWPA2);
66847 + return node;
66848 +}
66849 +
66850 +void
66851 +wmi_free_allnodes(struct wmi_t *wmip)
66852 +{
66853 + wlan_free_allnodes(&wmip->wmi_scan_table);
66854 +}
66855 +
66856 +bss_t *
66857 +wmi_find_node(struct wmi_t *wmip, const A_UINT8 *macaddr)
66858 +{
66859 + bss_t *ni=NULL;
66860 + ni=wlan_find_node(&wmip->wmi_scan_table,macaddr);
66861 + return ni;
66862 +}
66863 +
66864 +A_STATUS
66865 +wmi_dset_open_reply(struct wmi_t *wmip,
66866 + A_UINT32 status,
66867 + A_UINT32 access_cookie,
66868 + A_UINT32 dset_size,
66869 + A_UINT32 dset_version,
66870 + A_UINT32 targ_handle,
66871 + A_UINT32 targ_reply_fn,
66872 + A_UINT32 targ_reply_arg)
66873 +{
66874 + void *osbuf;
66875 + WMIX_DSETOPEN_REPLY_CMD *open_reply;
66876 +
66877 + A_DPRINTF(DBG_WMI, (DBGFMT "Enter - wmip=0x%x\n", DBGARG, (int)wmip));
66878 +
66879 + osbuf = A_NETBUF_ALLOC(sizeof(*open_reply));
66880 + if (osbuf == NULL) {
66881 + return A_NO_MEMORY;
66882 + }
66883 +
66884 + A_NETBUF_PUT(osbuf, sizeof(*open_reply));
66885 + open_reply = (WMIX_DSETOPEN_REPLY_CMD *)(A_NETBUF_DATA(osbuf));
66886 +
66887 + open_reply->status = status;
66888 + open_reply->targ_dset_handle = targ_handle;
66889 + open_reply->targ_reply_fn = targ_reply_fn;
66890 + open_reply->targ_reply_arg = targ_reply_arg;
66891 + open_reply->access_cookie = access_cookie;
66892 + open_reply->size = dset_size;
66893 + open_reply->version = dset_version;
66894 +
66895 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DSETOPEN_REPLY_CMDID,
66896 + NO_SYNC_WMIFLAG));
66897 +}
66898 +
66899 +static A_STATUS
66900 +wmi_get_pmkid_list_event_rx(struct wmi_t *wmip, A_UINT8 *datap, A_UINT32 len)
66901 +{
66902 + WMI_PMKID_LIST_REPLY *reply;
66903 + A_UINT32 expected_len;
66904 +
66905 + if (len < sizeof(WMI_PMKID_LIST_REPLY)) {
66906 + return A_EINVAL;
66907 + }
66908 + reply = (WMI_PMKID_LIST_REPLY *)datap;
66909 + expected_len = sizeof(reply->numPMKID) + reply->numPMKID * WMI_PMKID_LEN;
66910 +
66911 + if (len < expected_len) {
66912 + return A_EINVAL;
66913 + }
66914 +
66915 + A_WMI_PMKID_LIST_EVENT(wmip->wmi_devt, reply->numPMKID,
66916 + reply->pmkidList);
66917 +
66918 + return A_OK;
66919 +}
66920 +
66921 +#ifdef CONFIG_HOST_DSET_SUPPORT
66922 +A_STATUS
66923 +wmi_dset_data_reply(struct wmi_t *wmip,
66924 + A_UINT32 status,
66925 + A_UINT8 *user_buf,
66926 + A_UINT32 length,
66927 + A_UINT32 targ_buf,
66928 + A_UINT32 targ_reply_fn,
66929 + A_UINT32 targ_reply_arg)
66930 +{
66931 + void *osbuf;
66932 + WMIX_DSETDATA_REPLY_CMD *data_reply;
66933 + int size;
66934 +
66935 + size = sizeof(*data_reply) + length;
66936 +
66937 + A_DPRINTF(DBG_WMI,
66938 + (DBGFMT "Enter - length=%d status=%d\n", DBGARG, length, status));
66939 +
66940 + osbuf = A_NETBUF_ALLOC(size);
66941 + if (osbuf == NULL) {
66942 + return A_NO_MEMORY;
66943 + }
66944 + A_NETBUF_PUT(osbuf, size);
66945 + data_reply = (WMIX_DSETDATA_REPLY_CMD *)(A_NETBUF_DATA(osbuf));
66946 +
66947 + data_reply->status = status;
66948 + data_reply->targ_buf = targ_buf;
66949 + data_reply->targ_reply_fn = targ_reply_fn;
66950 + data_reply->targ_reply_arg = targ_reply_arg;
66951 + data_reply->length = length;
66952 +
66953 + if (status == A_OK) {
66954 + if (a_copy_from_user(data_reply->buf, user_buf, length)) {
66955 + return A_ERROR;
66956 + }
66957 + }
66958 +
66959 + return (wmi_cmd_send_xtnd(wmip, osbuf, WMIX_DSETDATA_REPLY_CMDID,
66960 + NO_SYNC_WMIFLAG));
66961 +}
66962 +#endif /* CONFIG_HOST_DSET_SUPPORT */
66963 +
66964 +A_STATUS
66965 +wmi_set_wsc_status_cmd(struct wmi_t *wmip, A_UINT32 status)
66966 +{
66967 + void *osbuf;
66968 + char *cmd;
66969 +
66970 + wps_enable = status;
66971 +
66972 + osbuf = a_netbuf_alloc(sizeof(1));
66973 + if (osbuf == NULL) {
66974 + return A_NO_MEMORY;
66975 + }
66976 +
66977 + a_netbuf_put(osbuf, sizeof(1));
66978 +
66979 + cmd = (char *)(a_netbuf_to_data(osbuf));
66980 +
66981 + A_MEMZERO(cmd, sizeof(*cmd));
66982 + cmd[0] = (status?1:0);
66983 + return (wmi_cmd_send(wmip, osbuf, WMI_SET_WSC_STATUS_CMDID,
66984 + NO_SYNC_WMIFLAG));
66985 +}
66986 +
66987 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wmi/wmi_doc.h
66988 ===================================================================
66989 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
66990 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wmi/wmi_doc.h 2008-12-11 22:46:49.000000000 +0100
66991 @@ -0,0 +1,4421 @@
66992 +/*
66993 + *
66994 + * Copyright (c) 2004-2007 Atheros Communications Inc.
66995 + * All rights reserved.
66996 + *
66997 + *
66998 + * This program is free software; you can redistribute it and/or modify
66999 + * it under the terms of the GNU General Public License version 2 as
67000 + * published by the Free Software Foundation;
67001 + *
67002 + * Software distributed under the License is distributed on an "AS
67003 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
67004 + * implied. See the License for the specific language governing
67005 + * rights and limitations under the License.
67006 + *
67007 + *
67008 + *
67009 + */
67010 +
67011 +
67012 +#if 0
67013 +Wireless Module Interface (WMI) Documentaion
67014 +
67015 + This section describes the format and the usage model for WMI control and
67016 + data messages between the host and the AR6000-based targets. The header
67017 + file include/wmi.h contains all command and event manifest constants as
67018 + well as structure typedefs for each set of command and reply parameters.
67019 +
67020 +Data Frames
67021 +
67022 + The data payload transmitted and received by the target follows RFC-1042
67023 + encapsulation and thus starts with an 802.2-style LLC-SNAP header. The
67024 + WLAN module completes 802.11 encapsulation of the payload, including the
67025 + MAC header, FCS, and WLAN security related fields. At the interface to the
67026 + message transport (HTC), a data frame is encapsulated in a WMI message.
67027 +
67028 +WMI Message Structure
67029 +
67030 + The WMI protocol leverages an 802.3-style Ethernet header in communicating
67031 + the source and destination information between the host and the AR6000
67032 + modules using a 14-byte 802.3 header ahead of the 802.2-style payload. In
67033 + addition, the WMI protocol adds a header to all data messages:
67034 +
67035 + {
67036 + INT8 rssi
67037 + The RSSI of the received packet and its units are shown in db above the
67038 + noise floor, and the noise floor is shown in dbm.
67039 + UINT8 info
67040 + Contains information on message type and user priority. Message type
67041 + differentiates between a data packet and a synchronization message.
67042 + } WMI_DATA_HDR
67043 +
67044 + User priority contains the 802.1d user priority info from host to target. Host
67045 + software translates the host Ethernet format to 802.3 format prior to Tx and
67046 + 802.3 format to host format in the Rx direction. The host does not transmit the
67047 + FCS that follows the data. MsgType differentiates between a regular data
67048 + packet (msgType=0) and a synchronization message (msgType=1).
67049 +
67050 +Data Endpoints
67051 +
67052 + The AR6000 chipset provides several data endpoints to support quality of
67053 + service (QoS) and maintains separate queues and separate DMA engines for
67054 + each data endpoint. A data endpoint can be bi-directional.
67055 +
67056 + Best effort (BE) class traffic uses the default data endpoint (2). The host can
67057 + establish up to two additional data endpoints for other traffic classes. Once
67058 + such a data endpoint is established, it sends and receives corresponding QoS
67059 + traffic in a manner similar to the default data endpoint.
67060 +
67061 + If QoS is desired over the interconnect, host software must classify each data
67062 + packet and place it on the appropriate data endpoint. The information
67063 + required to classify data is generally available in-band as an 802.1p/q style
67064 + tag or as the ToS field in the IP header. The information may also be available
67065 + out-of-band depending on the host DDI.
67066 +
67067 +Connection States
67068 +
67069 + Table B-1 describes the AR6000 WLAN connection states:
67070 +
67071 + Table B-1. AR6000 Connection States
67072 +
67073 +Connection State
67074 + Description
67075 +
67076 + DISCONNECTED
67077 + In this state, the AR6000 device is not connected to a wireless
67078 + network. The device is in this state after reset when it sends the
67079 + WIRELESS MODULE \93READY\94 EVENT, after it processes a
67080 + DISCONNECT command, and when it loses its link with the
67081 + access point (AP) that it was connected to. The device signals a
67082 + transition to the DISCONNECTED state with a \93DISCONNECT\94
67083 + event.
67084 +
67085 +CONNECTED
67086 + In this state, the AR6000 device is connected to wireless networks.
67087 + The device enters this state after successfully processing a
67088 + CONNECT, which establishes a connection with a wireless
67089 + network. The device signals a transition to the CONNECTED state
67090 + with a \93CONNECT\94 event.
67091 +
67092 +
67093 +Message Types
67094 +
67095 + WMI uses commands, replies, and events for the control and configuration of
67096 + the AR6000 device. The control protocol is asynchronous. Table B-2 describes
67097 + AR6000 message types:
67098 +
67099 +Table B-2. AR6000 Message Types
67100 +
67101 +Message Type
67102 + Description
67103 +
67104 +Commands
67105 + Control messages that flow from the host to the device
67106 +
67107 +Replies/Events
67108 + Control messages that flow from the device to the host.
67109 +
67110 + The device issues a reply to some WMI commands, but not to others.
67111 + The payload in a reply is command-specific, and some commands do
67112 + not trigger a reply message at all. Events are control messages issued
67113 + by the device to signal the occurrence of an asynchronous event.
67114 +
67115 +
67116 +WMI Message Format
67117 +
67118 + All WMI control commands, replies and events use the header format:
67119 +
67120 + WMI_CMD_HDR Header Format
67121 + {
67122 + UINT16 id
67123 + This 16-bit constant identifies which WMI command the host is issuing,
67124 + which command the target is replying to, or which event has occurred.
67125 + WMI_CMD_HDR
67126 + }
67127 +
67128 +
67129 + A variable-size command-, reply-, or event-specific payload follows the
67130 + header. Over the interconnect, all fields in control messages (including
67131 + WMI_CMD_HDR and the command specific payload) use 32-bit little Endian
67132 + byte ordering and fields are packed. The AR6000 device always executes
67133 + commands in order, and the host may send multiple commands without
67134 + waiting for previous commands to complete. A majority of commands are
67135 + processed to completion once received. Other commands trigger a longer
67136 + duration activity whose completion is signaled to the host through an event.
67137 +
67138 +Command Restrictions
67139 +
67140 + Some commands may only be issued when the AR6000 device is in a certain
67141 + state. The host is required to wait for an event signaling a state transition
67142 + before such a command can be issued. For example, if a command requires
67143 + the device to be in the CONNECTED state, then the host is required to wait
67144 + for a \93CONNECT\94 event before it issues that command.
67145 +
67146 + The device ignores any commands inappropriate for its current state. If the
67147 + command triggers a reply, the device generates an error reply. Otherwise, the
67148 + device silently ignores the inappropriate command.
67149 +
67150 +Command and Data Synchronization
67151 +
67152 + WMI provides a mechanism for a host to advise the device of necessary
67153 + synchronization between commands and data. The device implements
67154 + synchronization; no implicit synchronization exists between endpoints.
67155 +
67156 + The host controls synchronization using the \93SYNCHRONIZE\94 command
67157 + over the control channel and synchronization messages over data channels.
67158 + The device stops each data channel upon receiving a synchronization message
67159 + on that channel, processing all data packets received prior to that message.
67160 + After the device receives synchronization messages for each data endpoint
67161 + and the \93SYNCHRONIZE\94 command, it resumes all channels.
67162 +
67163 + When the host must guarantee a command executes before processing new
67164 + data packets, it first issues the command, then issues the \93SYNCHRONIZE\94
67165 + command and sends synchronization messages on data channels. When the
67166 + host must guarantee the device has processed all old data packets before a
67167 + processing a new command, it issues a \93SYNCHRONIZE\94 command and
67168 + synchronization messages on all data channels, then issues the desired
67169 + command.
67170 +
67171 +
67172 +
67173 +WMI Commands
67174 +
67175 + ADD_BAD_AP
67176 + Cause the AR6000 device to avoid a particular AP
67177 + ADD_CIPHER_KEY
67178 + Add or replace any of the four AR6000 encryption keys
67179 + ADD_WOW_PATTERN
67180 + Used to add a pattern to the WoW pattern list
67181 + CLR_RSSI_SNR
67182 + Clear the current calculated RSSI and SNR value
67183 + CONNECT_CMD
67184 + Request that the AR6000 device establish a wireless connection
67185 + with the specified SSID
67186 + CREATE_PSTREAM
67187 + Create prioritized data endpoint between the host and device
67188 + DELETE_BAD_AP
67189 + Clear an entry in the bad AP table
67190 + DELETE_CIPHER_KEY
67191 + Delete a previously added cipher key
67192 + DELETE_PSTREAM
67193 + Delete a prioritized data endpoint
67194 + DELETE_WOW_PATTERN
67195 + Remove a pre-specified pattern from the WoW pattern list
67196 + EXTENSION
67197 + WMI message interface command
67198 + GET_BIT_RATE
67199 + Retrieve rate most recently used by the AR6000
67200 + GET_CHANNEL_LIST
67201 + Retrieve list of channels used by the AR6000
67202 + GET_FIXRATES
67203 + Retrieves the rate-mask set via the SET_FIXRATES command.
67204 + GET_PMKID_LIST_CMD
67205 + Retrieve the firmware list of PMKIDs
67206 + GET_ROAM_DATA
67207 + Internal use for data collection; available in special build only
67208 + GET_ROAM_TBL
67209 + Retrieve the roaming table maintained on the target
67210 + GET_TARGET_STATS
67211 + Request that the target send the statistics it maintains
67212 + GET_TX_PWR
67213 + Retrieve the current AR6000 device Tx power levels
67214 + GET_WOW_LIST
67215 + Retrieve the current list of WoW patterns
67216 + LQ_THRESHOLD_PARAMS
67217 + Set the link quality thresholds
67218 + OPT_TX_FRAME
67219 + Send a special frame (special feature)
67220 + RECONNECT
67221 + Request a reconnection to a BSS
67222 + RSSI_THRESHOLD_PARAMS
67223 + Configure how the AR6000 device monitors and reports signal
67224 + strength (RSSI) of the connected BSS
67225 + SCAN_PARAMS
67226 + Determine dwell time and changes scanned channels
67227 + SET_ACCESS_PARAMS
67228 + Set access parameters for the wireless network
67229 + SET_ADHOC_BSSID
67230 + Set the BSSID for an ad hoc network
67231 + SET_AKMP_PARAMS
67232 + Set multiPMKID mode
67233 + SET_APPIE
67234 + Add application-specified IE to a management frame
67235 + SET_ASSOC_INFO
67236 + Specify the IEs the device should add to association or
67237 + reassociation requests
67238 + SET_AUTH_MODE
67239 + Set 802.11 authentication mode of reconnection
67240 + SET_BEACON_INT
67241 + Set the beacon interval for an ad hoc network
67242 + SET_BIT_RATE
67243 + Set the AR6000 to a specific fixed bit rate
67244 + SET_BMISS_TIME
67245 + Set the beacon miss time
67246 + SET_BSS_FILTER
67247 + Inform the AR6000 of network types about which it wants to
67248 + receive information using a \93BSSINFO\94 event
67249 + SET_BT_PARAMS
67250 + Set the status of a Bluetooth stream (SCO or A2DP) or set
67251 + Bluetooth coexistence register parameters
67252 + SET_BT_STATUS
67253 + Set the status of a Bluetooth stream (SCO or A2DP)
67254 + SET_CHANNEL_PARAMETERS
67255 + Configure WLAN channel parameters
67256 + SET_DISC_TIMEOUT
67257 + Set the amount of time the AR6000 spends attempting to
67258 + reestablish a connection
67259 + SET_FIXRATES
67260 + Set the device to a specific fixed PHY rate (supported subset)
67261 + SET_HALPARAM
67262 + Internal AR6000 command to set certain hardware parameters
67263 + SET_HOST_SLEEP_MODE
67264 + Set the host mode to asleep or awake
67265 + SET_IBSS_PM_CAPS
67266 + Support a non-standard power management scheme for an
67267 + ad hoc network
67268 + SET_LISTEN_INT
67269 + Request a listen interval
67270 + SET_LPREAMBLE
67271 + Override the short preamble capability of the AR6000 device
67272 + SET_MAX_SP_LEN
67273 + Set the maximum service period
67274 + SET_OPT_MODE
67275 + Set the special mode on/off (special feature)
67276 + SET_PMKID
67277 + Set the pairwise master key ID (PMKID)
67278 + SET_PMKID_LIST_CMD
67279 + Configure the firmware list of PMKIDs
67280 + SET_POWER_MODE
67281 + Set guidelines on trade-off between power utilization
67282 + SET_POWER_PARAMS
67283 + Configure power parameters
67284 + SET_POWERSAVE_PARAMS
67285 + Set the two AR6000 power save timers
67286 + SET_PROBED_SSID
67287 + Provide list of SSIDs the device should seek
67288 + SET_REASSOC_MODE
67289 + Specify whether the disassociated frame should be sent upon
67290 + reassociation
67291 + SET_RETRY_LIMITS
67292 + Limit how many times the device tries to send a frame
67293 + SET_ROAM_CTRL
67294 + Control roaming behavior
67295 + SET_RTS
67296 + Determine when RTS should be sent
67297 + SET_SCAN_PARAMS
67298 + Set the AR6000 scan parameters
67299 + SET_TKIP_COUNTERMEASURES
67300 + Enable/disable reports of TKIP MIC errors
67301 + SET_TX_PWR
67302 + Specify the AR6000 device Tx power levels
67303 + SET_VOICE_PKT_SIZE
67304 + Set voice packet size
67305 + SET_WMM
67306 + Override the AR6000 WMM capability
67307 + SET_WMM_TXOP
67308 + Configure TxOP bursting when sending traffic to a WMM-
67309 + capable AP
67310 + SET_WOW_MODE
67311 + Enable/disable WoW mode
67312 + SET_WSC_STATUS
67313 + Enable/disable profile check in cserv when the WPS protocol
67314 + is in progress
67315 + SNR_THRESHOLD_PARAMS
67316 + Configure how the device monitors and reports SNR of BSS
67317 + START_SCAN
67318 + Start a long or short channel scan
67319 + SYNCHRONIZE
67320 + Force a synchronization point between command and data
67321 + paths
67322 + TARGET_REPORT_ERROR_BITMASK
67323 + Control \93ERROR_REPORT\94 events from the AR6000
67324 +
67325 +
67326 +
67327 +
67328 +Name
67329 + ADD_BAD_AP
67330 +
67331 +Synopsis
67332 + The host uses this command to cause the AR6000 to avoid a particular AP. The
67333 + AR6000 maintain a table with up to two APs to avoid. An ADD_BAD_AP command
67334 + adds or replaces the specified entry in this bad AP table.
67335 +
67336 + If the AR6000 are currently connected to the AP specified in this command, they
67337 + disassociate.
67338 +
67339 +Command
67340 + wmiconfig eth1 --badap <bssid> <badApIndex>
67341 +
67342 +Command Parameters
67343 + UINT8 badApIndex Index [0...1] that identifies which entry in the
67344 + bad AP table to use
67345 +
67346 +
67347 + UINT8 bssid[6] MAC address of the AP to avoid
67348 +
67349 +Command Values
67350 + badApIndex = 0, 1 Entry in the bad AP table to use
67351 +
67352 +Reset Value
67353 + The bad AP table is cleared
67354 +
67355 +Restrictions
67356 + None
67357 +
67358 +See Also
67359 + \93DELETE_BAD_AP\94 on page B-13
67360 +
67361 +=====================================================================
67362 +Name
67363 + ADD_CIPHER_KEY
67364 +
67365 +Synopsis
67366 + The host uses this command to add/replace any of four encryption keys on the
67367 + AR6000. The ADD_CIPHER_KEY command is issued after the CONNECT event
67368 + has been received by the host for all dot11Auth modes except for SHARED_AUTH.
67369 + When the dot11AuthMode is SHARED_AUTH, then the ADD_CIPHER_KEY
67370 + command should be issued before the \93CONNECT\94 command.
67371 +
67372 +Command
67373 + wmiconfig eth1 --cipherkey <keyIndex> <keyType> <keyUsage>
67374 + <keyLength> <keyopctrl> <keyRSC> <key>
67375 +
67376 +Command Parameters
67377 + UINT8 keyIndex Index (0...3) of the key to add/replace;
67378 + uniquely identifies the key
67379 + UINT8 keyType CRYPTO_TYPE
67380 + UINT8 keyUsage Specifies usage parameters of the key when
67381 + keyType = WEP_CRYPT
67382 + UINT8 keyLength Length of the key in bytes
67383 + UINT8 keyOpCtrl bit[0] = Initialize TSC (default),
67384 + bit[1] = Initialize RSC
67385 + UINT8 keyRSC[8] Key replay sequence counter (RSC) initial
67386 + value the device should use
67387 + UINT8 key[32] Key material used for this connection
67388 + Command Values
67389 + {
67390 + NONE_CRYPT = 1
67391 + WEP_CRYPT = 2
67392 + TKIP_CRYPT = 3
67393 + AES_CRYPT = 4
67394 + KEY_OP_INIT_TSC 0x01
67395 + KEY_OP_INIT_RSC 0x02
67396 + KEY_OP_INIT_VAL 0x03
67397 + Default is to Initialize the TSC
67398 + KEY_OP_VALID_MASK 0x04
67399 + Two operations defined
67400 + } CRYPTO_TYPE
67401 +
67402 + {
67403 + PAIRWISE_USAGE = 0 Set if the key is used for unicast traffic only
67404 + GROUP_USAGE = 1 Set if the key is used to receive multicast
67405 + traffic (also set for static WEP keys)
67406 + TX_USAGE = 2 Set for the GROUP key used to transmit frames
67407 + All others are reserved
67408 + } KEY_USAGE
67409 +
67410 +Reset Value
67411 + The four available keys are disabled.
67412 +
67413 +Restrictions
67414 + The cipher should correspond to the encryption mode specified in the \93CONNECT\94
67415 + command.
67416 +
67417 +See Also
67418 + \93DELETE_CIPHER_KEY\94
67419 +
67420 +=====================================================================
67421 +
67422 +
67423 +Name
67424 + ADD_WOW_PATTERN
67425 +
67426 +Synopsis
67427 + The host uses this command to add a pattern to the WoW pattern list; used for
67428 + pattern-matching for host wakeups by the WoW module. If the host mode is asleep
67429 + and WoW is enabled, all packets are matched against the existing WoW patterns. If a
67430 + packet matches any of the patterns specified, the target will wake up the host. All
67431 + non-matching packets are discarded by the target without being sent up to the host.
67432 +
67433 +Command
67434 + wmiconfig \96addwowpattern <list-id> <filter-size> <filter-offset>
67435 + <pattern> <mask>
67436 +
67437 +Command Parameters
67438 + A_UINT8 filter_list_id ID of the list that is to include the new pattern
67439 + A_UINT8 filter_size Size of the new pattern
67440 + A_UINT8 filter_offset Offset at which the pattern matching for this
67441 + new pattern should begin at
67442 + A_UINT8 filter[1] Byte stream that contains both the pattern and
67443 + the mask of the new WoW wake-up pattern
67444 +
67445 +Reply Parameters
67446 + None
67447 +
67448 +Reset Value
67449 + None defined (default host mode is awake)
67450 +
67451 +Restrictions
67452 + None
67453 +
67454 +See Also
67455 + \93DELETE_WOW_PATTERN\94
67456 +
67457 +=====================================================================
67458 +
67459 +
67460 +Name
67461 + CLR_RSSI_SNR
67462 +
67463 +Synopsis
67464 + Clears the current calculated RSSI and SNR value. RSSI and SNR are reported by
67465 + running-average value. This command will clear the history and have a fresh start
67466 + for the running-average mechanism.
67467 +
67468 +Command
67469 + wmiconfig eth1 --cleanRssiSnr
67470 +
67471 +Command Parameters
67472 + None
67473 +
67474 +Reply Parameters
67475 + None
67476 +
67477 +Reset Value
67478 + None defined
67479 +
67480 +Restrictions
67481 + None
67482 +
67483 +=====================================================================
67484 +
67485 +Name
67486 + CONNECT_CMD
67487 +
67488 +Synopsis
67489 + New connect control information (connectCtrl) is added, with 32 possible modifiers.
67490 +
67491 + CONNECT_SEND_REASSOC
67492 + Valid only for a host-controlled connection to a
67493 + particular AP. If this bit is set, a reassociation frame is
67494 + sent. If this bit is clear, an association request frame is
67495 + sent to the AP.
67496 +
67497 + CONNECT_IGNORE_WPAx_GROUP_CIPHER
67498 + No group key is issued in the CONNECT command,
67499 + so use the group key advertised by the AP. In a target-
67500 + initiated roaming situation this allows a STA to roam
67501 + between APs that support different multicast ciphers.
67502 +
67503 + CONNECT_PROFILE_MATCH_DONE
67504 + In a host-controlled connection case, it is possible that
67505 + during connect, firmware may not have the
67506 + information for a profile match (e.g, when the AP
67507 + supports hidden SSIDs and the device may not
67508 + transmit probe requests during connect). By setting
67509 + this bit in the connection control information, the
67510 + firmware waits for a beacon from the AP with the
67511 + BSSID supplied in the CONNECT command. No
67512 + additional profile checks are done.
67513 +
67514 + CONNECT_IGNORE_AAC_BEACON
67515 + Ignore the Admission Capacity information in the
67516 + beacon of the AP
67517 +
67518 + CONNECT_ASSOC_POLICY_USER
67519 + When set, the CONNECT_SEND_REASSOC setting
67520 + determines if an Assoc or Reassoc is sent to an AP
67521 +
67522 +Command
67523 + wmiconfig --setconnectctrl <ctrl flags bitmask>
67524 +
67525 +Command Parameters
67526 + typedef struct{
67527 + A_UINT8 networktype;
67528 + A_UINT8 dot11authmode;
67529 + A_UINT8 authmode;
67530 + A_UINT8 pairwiseCryptoType; /*CRYPTO_TYPE*/
67531 + A_UINT8 pairwiseCryptoLen;
67532 + A_UINT8 groupCryptoType; /*CRYPTO_TYPE*/
67533 + A_UINT8 groupCryptoLen;
67534 + A_UINT8 ssidLength;
67535 + A_UCHAR ssid[WMI_MAX_SSID_LEN];
67536 + A_UINT16 channel;
67537 + A_UINT8 bssid[AUTH_MAC_LEN];
67538 + A_UINT8 ctrl_flags; /*WMI_CONNECT_CTRL_FLAGS_BITS*/
67539 + } WMI_CONNECT_CMD;
67540 +
67541 + ctrl flags bitmask
67542 + = 0x0001 CONNECT_ASSOC_POLICY_USER
67543 + Assoc frames are sent using the policy specified by
67544 + the flag
67545 + = 0x0002 CONNECT_SEND_REASSOC
67546 + Send Reassoc frame while connecting, otherwise send
67547 + assoc frames
67548 + = 0x0004 CONNECT_IGNORE_WPAx_GROUP_CIPHER
67549 + Ignore WPAx group cipher for WPA/WPA2
67550 + = 0x0008 CONNECT_PROFILE_MATCH_DONE
67551 + Ignore any profile check
67552 + = 0x0010 CONNECT_IGNORE_AAC_BEACON
67553 + Ignore the admission control information in the
67554 + beacon
67555 + ... CONNECT_CMD, continued
67556 + Command Values
67557 + typedef enum {
67558 + INFRA_NETWORK = 0x01,
67559 + ADHOC_NETWORK = 0x02,
67560 + ADHOC_CREATOR = 0x04,
67561 + } NETWORK_TYPE;
67562 +
67563 + typedef enum {
67564 + OPEN_AUTH = 0x01,
67565 + SHARED_AUTH = 0x02,
67566 + LEAP_AUTH = 0x04,
67567 + } DOT11_AUTH_MODE;
67568 + typedef enum {
67569 + NONE_AUTH = 0x01,
67570 + WPA_AUTH = 0x02,
67571 + WPA_PSK_AUTH = 0x03,
67572 + WPA2_AUTH = 0x04,
67573 + WPA2_PSK_AUTH = 0x05,
67574 + WPA_AUTH_CCKM = 0x06,
67575 + WPA2_AUTH_CCKM = 0x07,
67576 + } AUTH_MODE;
67577 + typedef enum {
67578 + NONE_CRYPT = 0x01,
67579 + WEP_CRYPT = 0x02,
67580 + TKIP_CRYPT = 0x03,
67581 + AES_CRYPT = 0x04,
67582 + } CRYPTO_TYPE;
67583 + typedef enum {
67584 + CONNECT_ASSOC_POLICY_USER = 0x0001,
67585 + CONNECT_SEND_REASSOC = 0x0002,
67586 + CONNECT_IGNORE_WPAx_GROUP_CIPHER = 0x0004,
67587 + CONNECT_PROFILE_MATCH_DONE = 0x0008,
67588 + CONNECT_IGNORE_AAC_BEACON = 0x0010,
67589 + } WMI_CONNECT_CTRL_FLAGS_BITS;
67590 +
67591 + pairwiseCryptoLen and groupCryptoLen are valid when the respective
67592 + CryptoTypesis WEP_CRYPT, otherwise this value should be 0. This is the length in
67593 + bytes.
67594 +
67595 +Reset Value
67596 + None defined
67597 +
67598 +Restrictions
67599 + None
67600 +
67601 +=====================================================================
67602 +
67603 +
67604 +Name
67605 + CREATE_PSTREAM
67606 +
67607 +Synopsis
67608 + The host uses this command to create a new prioritized data endpoint between the
67609 + host and the AR6000 device that carries a prioritized stream of data. If the AP that the
67610 + device connects to requires TSPEC stream establishment, the device requests the
67611 + corresponding TSPEC with the AP. The maximum and minimum service interval
67612 + ranges from 0 \96 0x7FFFFFFF (ms), where 0 = disabled. The device does not send a
67613 + reply event for this command, as it is always assumed the command has succeeded.
67614 + An AP admission control response comes to the host via a WMI_CAC_INDICATION
67615 + event, once the response for the ADDTS frame comes.
67616 +
67617 + Examples of cases where reassociation is generated (when WMM) and cases where
67618 + ADDTS is generated (when WMM and enabling ACM) are when:
67619 + Changing UAPSD flags in WMM mode, reassociation is generated
67620 + Changing the interval of sending auto QoS Null frame in WMM mode;
67621 + reassociation is not generated
67622 + Issuing a command with same previous parameters in WMM mode and enabling
67623 + ACM, an ADDTS request is generated
67624 + Changing the interval of a QoS null frame sending in WMM mode and enabling
67625 + ACM, an ADDTS request is generated
67626 + Issuing the command in disconnected state, reassociation or ADDTS is not
67627 + generated but the parameters are available after (re)association
67628 +
67629 +Command
67630 + --createqos <user priority> <direction> <traffic class>
67631 +<trafficType> <voice PS capability> <min service interval> <max
67632 +service interval> <inactivity interval> <suspension interval>
67633 +<service start time> <tsid> <nominal MSDU> <max MSDU> <min data
67634 +rate> <mean data rate> <peak data rate> <max burst size> <delay
67635 +bound> <min phy rate> <sba> <medium time> where:
67636 +
67637 + <user priority>
67638 + 802.1D user priority range (0\967)
67639 + <direction>
67640 + = 0 Tx (uplink) traffic
67641 + = 1 Rx (downlink) traffic
67642 + = 2 Bi-directional traffic
67643 + <traffic class>
67644 + = 1 BK
67645 + = 2 VI
67646 + = 3 VO
67647 + <trafficType>
67648 + = 0 Aperiodic
67649 + = 1 Periodic
67650 + <voice PS capability>
67651 + Specifies whether the voice power save mechanism
67652 + (APSD if AP supports it or legacy/simulated APSD
67653 + [using PS-Poll]) should be used
67654 + = 0 Disable voice power save for traffic class
67655 + = 1 Enable APSD voice power save for traffic class
67656 + = 2 Enable voice power save for all traffic classes
67657 + <min service interval>
67658 + (In ms)
67659 + <max service interval>
67660 + Inactivity interval (in ms) (0 = Infinite)
67661 + <suspension interval>
67662 + (In ms)
67663 + <service start time>
67664 + Service start time
67665 + <tsid>
67666 + TSID range (0\9615)
67667 + <nominal MSDU>
67668 + Nominal MAC SDU size
67669 + <max MSDU>
67670 + Maximum MAC SDU size
67671 + <min data rate>
67672 + Minimum data rate (in bps)
67673 + <mean data rate>
67674 + Mean data rate (in bps)
67675 + <peak data rate>
67676 + Peak data rate (in bps)
67677 + <max burst size>
67678 + Maximum burst size (in bps)
67679 + <delay bound>
67680 + Delay bound
67681 + <min phy rate>
67682 + Minimum PHY rate (in bps)
67683 + <sba>
67684 + Surplus bandwidth allowance
67685 + <medium time>
67686 + Medium time in TU of 32-ms periods per sec
67687 + ... CREATE_PSTREAM (continued)
67688 +
67689 +Command Parameters
67690 + UINT8 trafficClass TRAFFIC_CLASS value
67691 + UINT8 traffic
67692 + Direction
67693 + DIR_TYPE value
67694 + UINT8 rxQueueNum
67695 + AR6000 device mailbox index (2 or 3)
67696 + corresponding to the endpoint the host
67697 + wishes to use to receive packets for the
67698 + prioritized stream
67699 + UINT8 trafficType TRAFFIC_TYPE value
67700 + UINT8 voicePS
67701 +Capability
67702 + VOICEPS_CAP_TYPE value
67703 + UINT8 tsid Traffic stream ID
67704 + UINT8 userPriority 802.1D user priority
67705 + UINT16 nominalMSDU Nominal MSDU in octets
67706 + UINT16 maxMSDU Maximum MSDU in octets
67707 + UINT32 minServiceInt Minimum service interval: the min.
67708 + period of traffic specified (in ms)
67709 + UINT32 maxServiceInt Maximum service interval: the max.
67710 + period of traffic specified (in ms)
67711 + UINT32 inactivityInt Indicates how many ms an established
67712 + stream is inactive before the prioritized
67713 + data endpoint is taken down and the
67714 + corresponding T-SPEC deleted
67715 + UINT32 suspensionInt Suspension interval (in ms)
67716 + UINT32 service StartTime Service start time
67717 + UINT32 minDataRate Minimum data rate (in bps)
67718 + UINT32 meanDataRate Mean data rate (in bps)
67719 + UINT32 peakDataRate Peak data rate (in bps)
67720 + UINT32 maxBurstSize
67721 + UINT32 delayBound
67722 + UINT32 minPhyRate Minimum PHY rate for TSPEC (in bps)
67723 + UINT32 sba Surplus bandwidth allowance
67724 + UINT32 mediumTime Medium TSPEC time (in units of 32 ms)
67725 +Command Values
67726 + {
67727 + WMM_AC_BE = 0 Best Effort
67728 + WMM_AC_BK = 1 Background
67729 + WMM_AC_VI = 2 Video
67730 + WMM_AC_VO = 3 Voice
67731 + All other values reserved
67732 + } TRAFFIC_CLASS
67733 + {
67734 + UPLINK_TRAFFIC = 0 From the AR6000 device to the AP
67735 + DOWNLINK_TRAFFIC = 1 From the AP to the AR6000 device
67736 + BIDIR_TRAFFIC = 2 Bi-directional traffic
67737 + All other values reserved
67738 + } DIR_TYPE
67739 + {
67740 + DISABLE_FOR_THIS_AC = 0
67741 + ENABLE_FOR_THIS_AC = 1
67742 + ENABLE_FOR_ALL_AC = 2
67743 + All other values reserved
67744 + } VOICEPS_CAP_TYPE
67745 +
67746 + ... CREATE_PSTREAM (continued)
67747 +
67748 +
67749 + VI BE BK Supported, Y/N?
67750 + 0 0 0 0 Y
67751 + 0 0 0 1 Y
67752 + 0 0 1 0 N
67753 + 0 0 1 1 N
67754 + 0 1 0 0 Y
67755 + 0 1 0 1 Y
67756 + 0 1 1 0 N
67757 + 0 1 1 1 N
67758 + 1 0 0 0 Y
67759 + 1 0 0 1 Y
67760 + 1 0 1 0 N
67761 + 1 1 0 0 N
67762 + 1 1 0 1 Y
67763 + 1 1 0 0 N
67764 + 1 1 1 0 N
67765 + 1 1 1 1 Y
67766 +
67767 +Reset Value
67768 + No pstream is present after reset; each of the BE, BK, VI,VO pstreams must be created
67769 + (either implicitly by data flow or explicitly by user)
67770 +
67771 +Restrictions
67772 + This command can only be issued when the device is in the CONNECTED state. If
67773 + the device receives the command while in DISCONNECTED state, it replies with a
67774 + failure indication. At most four prioritized data endpoints can be created, one for
67775 + each AC.
67776 +
67777 +See Also
67778 + \93DELETE_PSTREAM\94
67779 +=====================================================================
67780 +
67781 +Name
67782 + DELETE_BAD_AP
67783 +
67784 +Synopsis
67785 + The host uses this command to clear a particular entry in the bad AP table
67786 +
67787 +Command
67788 + wmiconfig eth1 --rmAP [--num=<index>] // used to clear a badAP
67789 + entry. num is index from 0-3
67790 +
67791 +Command Parameters
67792 + UINT8 badApIndex Index [0...n] that identifies the entry in the bad
67793 + AP table to delete
67794 +
67795 +Command Values
67796 + badApIndex = 0, 1, 2, 3
67797 + Entry in the bad AP table
67798 +
67799 +Reset Value
67800 + None defined
67801 +
67802 +Restrictions
67803 + None
67804 +
67805 +See Also
67806 + \93ADD_BAD_AP\94
67807 +
67808 +=====================================================================
67809 +
67810 +
67811 +Name
67812 + DELETE_CIPHER_KEY
67813 +
67814 +Synopsis
67815 + The host uses this command to delete a key that was previously added with the
67816 + \93ADD_CIPHER_KEY\94 command.
67817 +
67818 +Command
67819 + TBD
67820 +
67821 +Command Parameters
67822 + UINT8 keyIndex Index (0...3) of the key to be deleted
67823 +
67824 +Command Values
67825 + keyIndex = 0, 1,2, 3 Key to delete
67826 +
67827 +Reset Value
67828 + None
67829 +
67830 +Restrictions
67831 + The host should not delete a key that is currently in use by the AR6000.
67832 +
67833 +See Also
67834 + \93ADD_CIPHER_KEY\94
67835 +
67836 +=====================================================================
67837 +
67838 +Name
67839 + DELETE_PSTREAM
67840 +
67841 +Synopsis
67842 + The host uses this command to delete a prioritized data endpoint created by a
67843 + previous \93CREATE_PSTREAM\94 command
67844 +
67845 +Command
67846 + --deleteqos <trafficClass> <tsid>, where:
67847 +
67848 + <traffic class>
67849 + = 0 BE
67850 + = 1 BK
67851 + = 2 VI
67852 + = 3 VO
67853 + <tsid>
67854 + The TSpec ID; use the -qosqueue option
67855 + to get the active TSpec IDs for each traffic class
67856 +
67857 +Command Parameters
67858 + A_UINT8 trafficClass Indicate the traffic class of the stream
67859 + being deleted
67860 +
67861 +Command Values
67862 + {
67863 + WMM_AC_BE = 0 Best effort
67864 + WMM_AC_BK = 1 Background
67865 + WMM_AC_VI = 2 Video
67866 + WMM_AC_VO = 3 Voice
67867 + } TRAFFIC CLASS
67868 +
67869 + 0-15 for TSID
67870 +
67871 +Reply Values
67872 + N/A
67873 +
67874 +Restrictions
67875 + This command should only be issued after a \93CREATE_PSTREAM\94 command has
67876 + successfully created a prioritized stream
67877 +
67878 +See Also
67879 + \93CREATE_PSTREAM\94
67880 +
67881 +=====================================================================
67882 +
67883 +
67884 +Name
67885 + DELETE_WOW_PATTERN
67886 +
67887 +Synopsis
67888 + The host uses this command to remove a pre-specified pattern from the
67889 + WoW pattern list.
67890 +
67891 +Command
67892 + wmiconfig \96delwowpattern <list-id> <pattern-id>
67893 +
67894 +Command Parameters
67895 + A_UINT8 filter_list_id ID of the list that contains the WoW filter
67896 + pattern to delete
67897 + A_UINT8 filter_id ID of the WoW filter pattern to delete
67898 +
67899 +Reply Parameters
67900 + None
67901 +
67902 +
67903 +
67904 +Reset Value
67905 + None defined
67906 +
67907 +Restrictions
67908 + None
67909 +
67910 +See Also
67911 + \93ADD_WOW_PATTERN\94
67912 +
67913 +=====================================================================
67914 +
67915 +
67916 +Name
67917 + EXTENSION
67918 +
67919 +Synopsis
67920 + The WMI message interface is used mostly for wireless control messages to a wireless
67921 + module applicable to wireless module management regardless of the target platform
67922 + implementation. However, some commands only peripherally related to wireless
67923 + management are desired during operation. These wireless extension commands may
67924 + be platform-specific or implementation-dependent.
67925 +
67926 +Command
67927 + N/A
67928 +
67929 +Command Parameters
67930 + Command-specific
67931 +
67932 +Command Values
67933 + Command-specific
67934 +
67935 +Reply Parameters
67936 + Command-specific
67937 +
67938 +Reset Values
67939 + None defined
67940 +
67941 +Restrictions
67942 + None defined
67943 +
67944 +=====================================================================
67945 +
67946 +
67947 +Name
67948 + GET_BIT_RATE
67949 +
67950 +Synopsis
67951 + Used by the host to obtain the rate most recently used by the AR6000 device
67952 +
67953 +Command
67954 + wmiconfig eth1 --getfixrates
67955 +
67956 +Command Parameters
67957 + None
67958 +
67959 +
67960 +
67961 +Reply Parameters
67962 + INT8
67963 + rateIndex
67964 + See the \93SET_BIT_RATE\94 command
67965 +
67966 +Reset Values
67967 + None
67968 +
67969 +Restrictions
67970 + This command should only be used during development/debug; it is not intended
67971 +for use in production. It is only valid when the device is in the CONNECTED state
67972 +
67973 +See Also
67974 + \93SET_BIT_RATE\94
67975 +
67976 +=====================================================================
67977 +
67978 +
67979 +Name
67980 + GET_CHANNEL_LIST
67981 +
67982 +Synopsis
67983 + Used by the host uses to retrieve the list of channels that can be used by the device
67984 + while in the current wireless mode and in the current regulatory domain.
67985 +
67986 +Command
67987 + TBD
67988 +
67989 +Command Parameters
67990 + None
67991 +
67992 +Reply Parameters
67993 + UINT8 reserved Reserved
67994 + UINT8 numberOfChannels Number of channels the reply contains
67995 + UINT16 channelList[numberOfChannels] Array of channel frequencies (in MHz)
67996 +
67997 +Reset Values
67998 + None defined
67999 +
68000 +Restrictions
68001 + The maximum number of channels that can be reported are 32
68002 +
68003 +=====================================================================
68004 +
68005 +
68006 +Name
68007 + GET_FIXRATES
68008 +
68009 +Synopsis
68010 + Clears the current calculated RSSI and SNR value. RSSI and SNR are reported by
68011 + running-average value. This command will clear the history and have a fresh start for
68012 + the running-average mechanism.
68013 +
68014 +Synopsis
68015 + This returns rate-mask set via WMI_SET_FIXRATES to retrieve the current fixed rate
68016 + that the AR6001 or AR6001 is using. See \93SET_FIXRATES\94.
68017 +
68018 +Command
68019 + wmiconfig eth1 --getfixrates
68020 +
68021 +Command Parameters
68022 + A_UINT16 fixRateMask; Note: if this command is used prior to
68023 + using WMI_SET_FIXRATES, AR6000
68024 + returns 0xffff as fixRateMask, indicating
68025 + all the rates are enabled
68026 +
68027 +Reply Parameters
68028 + None
68029 +
68030 +Reset Value
68031 + None defined
68032 +
68033 +Restrictions
68034 + None
68035 +
68036 +See Also
68037 + \93SET_FIXRATES\94
68038 +
68039 +=====================================================================
68040 +
68041 +
68042 +
68043 +Name
68044 + GET_PMKID_LIST_CMD
68045 +
68046 +Synopsis
68047 + Retrieves the list of PMKIDs on the firmware. The
68048 + WMI_GET_PMKID_LIST_EVENT is generated by the firmware.
68049 +
68050 +Command
68051 + TBD
68052 +
68053 +Command Parameters
68054 +
68055 +Reset Values
68056 + None
68057 +
68058 +Restrictions
68059 + None
68060 +
68061 +See Also
68062 + SET_PMKID_LIST_CMD GET_PMKID_LIST_EVENT
68063 +
68064 +=====================================================================
68065 +
68066 +
68067 +Name
68068 + GET_ROAM_TBL
68069 +
68070 +Synopsis
68071 + Retrieve the roaming table maintained on the target. The response is reported
68072 + asynchronously through the ROAM_TBL_EVENT.
68073 +
68074 +Command
68075 + wmiconfig --getroamtable <roamctrl> <info>
68076 +
68077 +Command Parameters
68078 + A_UINT8 roamCtrlType;
68079 + A_UINT16 roamMode
68080 + A_UINT16 numEntries
68081 + WMI_BSS_ROAM_INFO bssRoamInfo[1]
68082 +
68083 +Reply Value
68084 + Reported asynchronously through the ROAM_TBL_EVENT
68085 +
68086 +Reset Value
68087 + None defined
68088 +
68089 +Restrictions
68090 + None
68091 +
68092 +See Also
68093 + SET_KEEPALIVE
68094 +
68095 +=====================================================================
68096 +
68097 +
68098 +Name
68099 + GET_TARGET_STATS
68100 +
68101 +Synopsis
68102 + The host uses this command to request that the target send the statistics that it
68103 + maintains. The statistics obtained from the target are accrued in the host every time
68104 + the GET_TARGET_STATS command is issued. The --clearStats option is added to
68105 + clear the target statistics maintained in the host.
68106 +
68107 +Command
68108 + wmiconfig --getTargetStats --clearStats
68109 +
68110 +Command Parameters
68111 + TARGET_STATS targetStats
68112 + WMI_TARGET_STATS
68113 + UINT8 clearStats
68114 +
68115 +
68116 +Reply Value
68117 + RSSI return value (0\96100)
68118 +
68119 +Reset Values
68120 + All statistics are cleared (zeroed)
68121 +
68122 +Restrictions
68123 + The --getTargetStats option must be used; the --clearStats option is also available also
68124 +
68125 +
68126 +=====================================================================
68127 +
68128 +Name
68129 + GET_TX_PWR
68130 +
68131 +Synopsis
68132 + The host uses this command to retrieve the current Tx power level
68133 +
68134 +Command
68135 + wmiconfig -i eth1 --getpower
68136 +
68137 +Command Parameters
68138 + None
68139 +
68140 +Reply Parameters
68141 + UINT16 dbM The current Tx power level specified in dbM
68142 +
68143 +Reset Values
68144 + The maximum permitted by the regulatory domain
68145 +
68146 +Restrictions
68147 + None
68148 +
68149 +See Also
68150 + \93SET_TX_PWR\94
68151 +
68152 +=====================================================================
68153 +
68154 +
68155 +Name
68156 + GET_WOW_LIST
68157 +
68158 +Synopsis
68159 + The host uses this command to retrieve the current list of WoW patterns.
68160 +
68161 +Command
68162 + wmiconfig \96getwowlist <list-id>
68163 +
68164 +Command Parameters
68165 + A_UINT8 filter_list_id ID of the list of WoW patterns to retrieve
68166 +
68167 +Reply Value(s)
68168 + A_UINT16 num_filters Number of WoW patterns contained in the list
68169 + A_UINT8 wow_mode Current mode of WoW (enabled or disabled)
68170 + A_UINT8 host_mode Current host mode (asleep or awake)
68171 + WOW_FILTER wow_filters[1]
68172 + Contents of the WoW filter pattern list
68173 + (contains mask, pattern, offset and size
68174 + information for each of the patterns)
68175 +
68176 +Reset Value
68177 + None defined
68178 +
68179 +Restrictions
68180 + None
68181 +
68182 +See Also
68183 + \93SET_WSC_STATUS\94
68184 +
68185 +=====================================================================
68186 +
68187 +
68188 +Name
68189 + LQ_THRESHOLD_PARAMS
68190 +
68191 +Synopsis
68192 + Sets Link Quality thresholds, the sampling will happen at every unicast data frame
68193 + Tx if a certain threshold is met, and the corresponding event will be sent to the host.
68194 +
68195 +Command
68196 + --lqThreshold <enable> <upper_threshold_1> ...
68197 + <upper_threshold_4> <lower_threshold_1> ... <lower_threshold_4>
68198 +
68199 +Command Parameters
68200 + <enable> = 0 Disable link quality sampling
68201 + = 1 Enable link quality sampling
68202 + <upper_threshold_x> Above thresholds (value in [0,100]), in
68203 + ascending order
68204 + <lower_threshold_x> Below thresholds (value in [0,100]), in
68205 + ascending order
68206 +
68207 +Command Values
68208 + See command parameters
68209 +
68210 +Reset Value
68211 + None defined
68212 +
68213 +Restrictions
68214 + None
68215 +
68216 +=====================================================================
68217 +
68218 +
68219 +Name
68220 + OPT_TX_FRAME
68221 +
68222 +Synopsis
68223 + Special feature, sends a special frame.
68224 +
68225 +Command
68226 + wmiconfig --sendframe <frmType> <dstaddr> <bssid> <optIEDatalen>
68227 + <optIEData>
68228 +
68229 +Command Parameters
68230 + {
68231 + A_UINT16 optIEDataLen;
68232 + A_UINT8 frmType;
68233 + A_UINT8 dstAddr[ATH_MAC_LEN];
68234 + A_UINT8 bssid[ATH_MAC_LEN];
68235 + A_UINT8 optIEData[1];
68236 + } WMI_OPT_TX_FRAME_CMD;
68237 +
68238 +Command Values
68239 + <frmtype> = 1 Probe request frame
68240 + = 2 Probe response frame
68241 + = 3 CPPP start
68242 + = 4 CPPP stop
68243 +
68244 +Reset Value
68245 + None defined
68246 +
68247 +Restrictions
68248 + Send a special frame only when special mode is on.
68249 +
68250 +=====================================================================
68251 +
68252 +
68253 +Name
68254 + RECONNECT
68255 +
68256 +Synopsis
68257 + This command requests a reconnection to a BSS to which the AR6000 device was
68258 + formerly connected
68259 +
68260 +Command
68261 + TBD
68262 +
68263 +Command Parameters
68264 + UINT16 channel Provides a hint as to which channel was
68265 + used for a previous connection
68266 + UINT8 bssid[6] If set, indicates which BSSID to connect to
68267 +
68268 +Command Values
68269 + None
68270 +
68271 +Reset Values
68272 + None
68273 +
68274 +Restrictions
68275 + None
68276 +
68277 +See Also
68278 + \93CONNECT_CMD\94
68279 +
68280 +=====================================================================
68281 +
68282 +
68283 +Name
68284 + RSSI_THRESHOLD_PARAMS
68285 +
68286 +Synopsis
68287 + Configures how the AR6000 device monitors and reports signal strength (RSSI) of the
68288 + connected BSS, which is used as a link quality metric. The four RSSI threshold sets (in
68289 + dbM) of the host specification divide the signal strength range into six segments.
68290 + When signal strength increases or decreases across one of the boundaries, an
68291 + RSSI_THRESHOLD event is signaled to the host. The host may then choose to take
68292 + action (such as influencing roaming).
68293 +
68294 +Command
68295 + wmiconfig eth1 --rssiThreshold <weight> <pollTime>
68296 + <above_threshold_val_1> ... <above_threshold_tag_6>
68297 + <above_threshold_val_6>
68298 + <below_threshold_tag_1> <below_threshold_val_1> ...
68299 + <below_threshold_tag_6> <below_threshold_val_6>
68300 +
68301 +Command Parameters
68302 + UINT8 weight Range in [1, 16] used to calculate average RSSI
68303 + UINT32 pollTime RSSI (signal strength) sampling frequency in
68304 + seconds (if pollTime = 0, single strength
68305 + sampling is disabled)
68306 + USER_RSS__THOLD tholds[12] Thresholds (6 x 2)
68307 +
68308 +Command Values
68309 + None defined
68310 +
68311 +Reset Values
68312 + pollTime is 0, and sampling is disabled
68313 +
68314 +Restrictions
68315 + Can only be issued if the AR6000 device is connected
68316 +
68317 +
68318 +=====================================================================
68319 +
68320 +Name
68321 + SCAN_PARAMS
68322 +
68323 +Synopsis
68324 + The minact parameter determines the minimum active channel dwell time, within
68325 + which if the STA receives any beacon, it remains on that channel until the maxact
68326 + channel dwell time. If the STA does not receive a beacon within the minact dwell
68327 + time, it switches to scan the next channel.
68328 +
68329 +Command
68330 + wmiconfig -scan -minact=<ms> --maxact=<ms>
68331 +
68332 +Command Parameters
68333 + UINT16 maxact Channel dwell time (in ms), default = 0
68334 + UINT16 minact Channel dwell time (in ms), default = 105
68335 +
68336 +Command Values
68337 + See channel parameters
68338 +
68339 +Reset Values
68340 + None defined
68341 +
68342 +Restrictions
68343 + The minact value should be greater than 0; maxact should be between 5\9665535 ms
68344 + and greater than minact
68345 +
68346 +=====================================================================
68347 +
68348 +
68349 +Name
68350 + SET_ACCESS_PARAMS
68351 +
68352 +Synopsis
68353 + Allows the host to set access parameters for the wireless network. A thorough
68354 + understanding of IEEE 802.11 is required to properly manipulate these parameters.
68355 +
68356 +Command
68357 + wmiconfig eth1 --acparams --txop <limit> --cwmin <0-15>
68358 + --cwmax <0-15> --aifsn<0-15>
68359 +
68360 +Command Parameters
68361 + UINT16 txop The maximum time (expressed in units of
68362 + 32 ms) the device can spend transmitting
68363 + after acquiring the right to transmit
68364 + UINT8 eCWmin Minimum contention window
68365 + UINT8 eCWmax Maximum contention window
68366 + UINT8 aifsn The arbitration inter-frame space number
68367 +
68368 +Command Values
68369 + None
68370 +
68371 +Reset Values
68372 + Reasonable defaults that vary, between endpoints (prioritized streams)
68373 +
68374 +Restrictions
68375 + None
68376 +
68377 +=====================================================================
68378 +
68379 +
68380 +Name
68381 + SET_ADHOC_BSSID
68382 +
68383 +Synopsis
68384 + Allows the host to set the BSSID for an ad hoc network. If a network with this BSSID
68385 + is not found, the target creates an ad hoc network with this BSSID after the connect
68386 + WMI command is triggered (e.g., by the SIOCSIWESSID IOCTL).
68387 +
68388 +Command
68389 + wmiconfig eth1 --adhocbssid <bssid>
68390 +
68391 +Command Parameters
68392 + A_UINT8 bssid[ATH_MAC_LEN] BSSID is specified in xx:xx:xx:xx:xx:xx format
68393 +
68394 +Command Values
68395 + None
68396 +
68397 +Reset Values
68398 + None
68399 +
68400 +Restrictions
68401 + None
68402 +
68403 +=====================================================================
68404 +
68405 +
68406 +Name
68407 + SET_AKMP_PARAMS
68408 +
68409 +Synopsis
68410 + Enables or disables multi PMKID mode.
68411 +
68412 +Command
68413 + wmiconfig eth1 --setakmp --multipmkid=<on/off>
68414 +
68415 +Command Parameters
68416 + typedef struct {
68417 + A_UINT32 akmpInfo;
68418 + } WMI_SET_AKMP_PARAMS_CMD;
68419 +
68420 +Command Values
68421 + akmpInfo;
68422 + bit[0] = 0
68423 + MultiPMKID mode is disabled and PMKIDs that
68424 + were set using the WMI_SET_PMKID_CMD are
68425 + used in the [Re]AssocRequest frame.
68426 + bit[0] = 1
68427 + MultiPMKID mode is enabled and PMKIDs issued
68428 + by the WMI_SET_PMKID_LIST_CMD are used in
68429 + the next [Re]AssocRequest sent to the AP.
68430 +
68431 +Reset Values
68432 + MultiPMKID mode is disabled
68433 +
68434 +Restrictions
68435 + None
68436 +
68437 +=====================================================================
68438 +
68439 +
68440 +Name
68441 + SET_APPIE
68442 +
68443 +Synopsis
68444 + Add an application-specified IE to a management frame. The maximum length is
68445 + 76 bytes. Including the length and the element ID, this translates to 78 bytes.
68446 +
68447 +Command
68448 + wmiconfig --setappie <frame> <IE>, where:
68449 +
68450 + frame
68451 + One of beacon, probe, respon, assoc
68452 +
68453 + IE
68454 + A hex string beginning with DD (if = 0, no
68455 + IE is sent in the management frame)
68456 +
68457 +Command Parameters
68458 + mgmtFrmType;
68459 + A WMI_MGMT_FRAME_TYPE
68460 +
68461 + ieLen;
68462 + Length of the IE to add to the GMT frame
68463 +
68464 +Command Values
68465 + None
68466 +
68467 +Reset Value
68468 + None defined
68469 +
68470 +Restrictions
68471 + Supported only for the probe request and association request management frame
68472 +types. Also, only one IE can be added per management frame type.
68473 +
68474 +=====================================================================
68475 +
68476 +
68477 +Name
68478 + SET_ASSOC_INFO
68479 +
68480 +Synopsis
68481 + The host uses this command to specify any information elements (IEs) it wishes the
68482 + AR6000 device to add to all future association and reassociation requests. IEs must be
68483 + correct and are used as is by the device. IEs specified through this command are
68484 + cleared with a DISCONNECT.
68485 +
68486 +Command
68487 + wmiconfig eth1 --setAssocIe <IE>
68488 +
68489 +Command Parameters
68490 + UINT8 ieType Used directly in 802.11 frames
68491 + UINT8 bufferSize Size of assocInfo (in bytes) ranging from
68492 + 0\96240. If = 0, previously set IEs are cleared.
68493 + UINT8 assocInfo[bufferSize] Used directly in 802.11 frames
68494 +
68495 +Command Values
68496 + None
68497 +
68498 +Reset Values
68499 + IEs are cleared
68500 +
68501 +Restrictions
68502 + This command can only be issued in the DISCONNECTED state
68503 +
68504 +=====================================================================
68505 +
68506 +
68507 +Name
68508 + SET_AUTHMODE
68509 +
68510 +Synopsis
68511 + Sets the 802.11 authentication mode of reconnection
68512 +
68513 +Command
68514 + wmiconfig eth1 --setauthmode <mode>
68515 +
68516 +Command Parameters
68517 + UINT8 mode
68518 +
68519 +Command Values
68520 + mode = 0x00 Proceed with authentication during reconnect
68521 + = 0x01 Do not proceed with authentication during reconnect
68522 +
68523 +Reset Values
68524 + Authentication
68525 +
68526 +Restrictions
68527 + None
68528 +
68529 +=====================================================================
68530 +
68531 +
68532 +Name
68533 + SET_BEACON_INT
68534 +
68535 +Synopsis
68536 + Sets the beacon interval for an ad hoc network. Beacon interval selection may have an
68537 + impact on power savings. To some degree, a longer interval reduces power
68538 + consumption but also decreases throughput. A thorough understanding of IEEE
68539 + 802.11 ad hoc networks is required to use this command effectively.
68540 +
68541 +Command
68542 + wmiconfig eth1 --ibssconintv
68543 +
68544 +Command Parameters
68545 + UINT16 beaconInterval Specifies the beacon interval in TU units (1024 ms)
68546 +
68547 +Command Values
68548 + None
68549 +
68550 +Reset Values
68551 + The default beacon interval is 100 TUs (102.4 ms)
68552 +
68553 +Restrictions
68554 + This command can only be issued before the AR6000 device starts an ad hoc network
68555 +
68556 +See Also
68557 + \93SET_IBSS_PM_CAPS\94
68558 +
68559 +=====================================================================
68560 +
68561 +
68562 +Name
68563 + SET_BIT_RATE
68564 +
68565 +Synopsis
68566 + The host uses this command to set the AR6000 device to a specific fixed rate.
68567 +
68568 +Command
68569 + wmiconfig eth1 --setfixrates <rate_0> ... <rate_n>
68570 +
68571 +Command Parameters
68572 + INT8 rateIndex
68573 + A WMI_BIT_RATE value
68574 + {
68575 + RATE_AUTO = -1
68576 + RATE_1Mb = 0
68577 + RATE_2Mb = 1
68578 + RATE_5_5M = 2
68579 + RATE_11Mb = 3
68580 + RATE_6Mb = 4
68581 + RATE_9Mb = 5
68582 + RATE_12Mb = 6
68583 + RATE_18Mb = 7
68584 + RATE_24Mb = 8
68585 + RATE_36Mb = 9
68586 + RATE_48Mb = 10
68587 + RATE_54Mb = 11
68588 + } WMI_BIT_RATE
68589 +
68590 +
68591 +Command Values
68592 + See command parameters
68593 +
68594 +Reset Values
68595 + The dynamic rate is determined by the AR6000 device
68596 +
68597 +Restrictions
68598 + This command is intended for use only during development/debug; it is not
68599 +intended for use in production
68600 +
68601 +See Also
68602 + \93GET_BIT_RATE\94
68603 +
68604 +=====================================================================
68605 +
68606 +
68607 +Name
68608 + SET_BMISS_TIME
68609 +
68610 +Synopsis
68611 + This command sets the beacon miss (BMISS) time, which the AR6000 hardware use
68612 + to recognize missed beacons. When an excessive number (15) of consecutive beacons
68613 + are missed, the AR6000 consider switching to a different BSS. The time can be
68614 + specified in number of beacons or in TUs.
68615 +
68616 +Command(s)
68617 + wmiconfig eth1 --setbmissbeacons=<val>
68618 + wmiconfig eth1 --setbmisstime=<val>
68619 +
68620 +Command Parameters
68621 + UINT16 bmissTime Specifies the beacon miss time
68622 + [1000...5000] in TUs (1024 ms)
68623 + UINT16 bmissbeacons Specifies the number of beacons [5...50]
68624 +
68625 +Command Values
68626 + None
68627 +
68628 +Reset Values
68629 + bmissTime is 1500 TUs (1536 ms)
68630 +
68631 +Restrictions
68632 + None
68633 +
68634 +=====================================================================
68635 +
68636 +
68637 +Name
68638 + SET_BSS_FILTER
68639 +
68640 +Synopsis
68641 + The host uses this to inform the AR6000 device of the types of networks about which
68642 + it wants to receive information from the \93BSSINFO\94 event. As the device performs
68643 + either foreground or background scans, it applies the filter and sends \93BSSINFO\94
68644 + events only for the networks that pass the filter. If any of the bssFilter or the ieMask
68645 + filter matches, a BSS Info is sent to the host. The ieMask currently is used as a match
68646 + for the IEs in the beacons, probe reponses and channel switch action management
68647 + frame. See also \93Scan and Roam\94 on page C-1.
68648 +
68649 + The BSS filter command has been enhanced to support IE based filtering. The IEs can
68650 + be specified as a bitmask through this command using this enum.
68651 +
68652 +Command
68653 + wmiconfig eth1 \96filter = <filter> --ieMask 0x<mask>
68654 +
68655 +Command Parameters
68656 + UINT8 BssFilter
68657 +
68658 + Command Values
68659 + typedef struct {
68660 + A_UINT8 bssFilter; See WMI_BSS_FILTER
68661 + A_UINT32 ieMask;
68662 + } __ATTRIB_PACK WMI_BSS_FILTER_CMD;
68663 +
68664 + The ieMask can take this combination of values:
68665 +
68666 + enum {
68667 + BSS_ELEMID_CHANSWITCH = 0x01
68668 + BSS_ELEMID_ATHEROS = 0x02,
68669 + }
68670 +
68671 +Reply Value
68672 + None
68673 +
68674 +Reset Value
68675 + BssFilter = NONE_BSS_FILTER (0)
68676 +
68677 +Restrictions
68678 + None
68679 +
68680 +See Also
68681 + \93CONNECT_CMD\94
68682 +
68683 +=====================================================================
68684 +
68685 +
68686 +Name
68687 + SET_BT_PARAMS
68688 +
68689 +Synopsis
68690 + This command is used to set the status of a Bluetooth stream or set Bluetooth
68691 + coexistence register parameters. The stream may be an SCO or an A2DP stream and
68692 + its status can be started/stopped/suspended/resumed.
68693 +
68694 +Command
68695 + wmiconfig \96setBTparams <paramType> <params>
68696 +
68697 +Command Parameters
68698 + struct {
68699 + union {
68700 + BT_PARAMS_SCO scoParams;
68701 + BT_PARAMS_A2DP a2dpParams;
68702 + BT_PARAMS_MISC miscParams;
68703 + BT_COEX_REGS regs;
68704 + } info;
68705 + A_UINT8 paramType;
68706 + struct {
68707 + A_UINT8 noSCOPkts; Number of SCO packets between consecutive PS-POLLs
68708 + A_UINT8 pspollTimeout;
68709 + A_UINT8 stompbt;
68710 + } BT_PARAMS_SCO;
68711 + struct {
68712 + A2DP BT stream parameters
68713 + A_UINT32 period;
68714 + A_UINT32 dutycycle;
68715 + A_UINT8 stompbt;
68716 + } BT_PARAMS_A2DP;
68717 + struct {
68718 + union {
68719 + WLAN_PROTECT_POLICY_TYPE protectParams;
68720 + A_UINT16 wlanCtrlFlags;
68721 + }info;
68722 + A_UINT8 paramType;
68723 + } BT_PARAMS_MISC;
68724 + struct {
68725 + BT coexistence registers values
68726 + A_UINT32 mode; Coexistence mode
68727 + A_UINT32 scoWghts; WLAN and BT weights
68728 + A_UINT32 a2dpWghts;
68729 + A_UINT32 genWghts;
68730 + A_UINT32 mode2; Coexistence mode2
68731 + A_UINT8 setVal;
68732 + } BT_COEX_REGS;
68733 +
68734 +Command Values
68735 + None defined
68736 +
68737 +Reset Value
68738 + None
68739 +
68740 +Restrictions
68741 + None
68742 +
68743 +=====================================================================
68744 +
68745 +
68746 +Name
68747 + SET_BT_STATUS
68748 +
68749 +Synopsis
68750 + Sets the status of a Bluetooth stream. The stream may be a SCO or an A2DP stream
68751 + and its status can be started/stopped/suspended/resumed.
68752 +
68753 +Command
68754 + wmiconfig \96setBTstatus <streamType> <status>
68755 +
68756 +Command Parameters
68757 + {
68758 + A_UINT8 streamType; Stream type
68759 + A_UINT8 status; Stream status
68760 + }WMI_SET_BT_STATUS_CMD;
68761 +
68762 +Command Values
68763 + {
68764 + BT_STREAM_UNDEF = 0
68765 + BT_STREAM_SCO
68766 + SCO stream
68767 + BT_STREAM_A2DP
68768 + A2DP stream
68769 + BT_STREAM_MAX
68770 + } BT_STREAM_TYPE;
68771 +
68772 + {
68773 + BT_STATUS_UNDEF = 0
68774 + BT_STATUS_START
68775 + BT_STATUS_STOP
68776 + BT_STATUS_RESUME
68777 + BT_STATUS_SUSPEND
68778 + BT_STATUS_MAX
68779 + } BT_STREAM_STATUS;
68780 +
68781 +Reset Value
68782 + None defined
68783 +
68784 +Restrictions
68785 + None
68786 +
68787 +=====================================================================
68788 +
68789 +
68790 +Name
68791 + SET_CHANNEL_PARAMETERS
68792 +
68793 +Synopsis
68794 + Configures various WLAN parameters related to channels, sets the wireless mode,
68795 + and can restrict the AR6000 device to a subset of available channels. The list of
68796 + available channels varies depending on the wireless mode and the regulatory
68797 + domain. The device never operates on a channel outside of its regulatory domain. The
68798 + device starts to scan the list of channels right after this command.
68799 +
68800 +Command
68801 + wmiconfig eth1 --wmode <mode> <list>
68802 +
68803 +Command Parameters
68804 + UINT8 phyMode See Values below.
68805 + UINT8 numberOfChannels
68806 + Number of channels in the channel array that
68807 + follows. If = 0, then the device uses all of the
68808 + channels permitted by the regulatory domain
68809 + and by the specified phyMode.
68810 + UINT16 channel[numberOfChannels]
68811 + Array listing the subset of channels (expressed
68812 + as frequencies in MHz) the host wants the
68813 + device to use. Any channel not permitted by
68814 + the specified phyMode or by the specified
68815 + regulatory domain is ignored by the device.
68816 +
68817 +Command Values
68818 + phyMode = {
68819 + Wireless mode
68820 + 11a = 0x01
68821 + 11g = 0x02
68822 + 11ag = 0x03
68823 + 11b = 0x04
68824 + 11g only = 0x05
68825 + }
68826 +
68827 +Reset Values
68828 + phyMode
68829 + 11ag
68830 + 802.11a/g modules
68831 + 11g
68832 + 802.11g module
68833 + channels
68834 + Defaults to all channels permitted by the
68835 + current regulatory domain.
68836 +
68837 +Restrictions
68838 + This command, if issued, should be issued soon after reset and prior to the first
68839 + connection. This command should only be issued in the DISCONNECTED state.
68840 +
68841 +=====================================================================
68842 +
68843 +
68844 +Name
68845 + SET_DISC_TIMEOUT
68846 +
68847 +Synopsis
68848 + The host uses this command to configure the amount of time that the AR6000 should
68849 + spend when it attempts to reestablish a connection after losing link with its current
68850 + BSS. If this time limit is exceeded, the AR6000 send a \93DISCONNECT\94 event. After
68851 + sending the \93DISCONNECT\94 event the AR6000 continues to attempt to reestablish a
68852 + connection, but they do so at the interval corresponding to a foreground scan as
68853 + established by the \93SET_SCAN_PARAMS\94 command.
68854 +
68855 + A timeout value of 0 indicates that the AR6000 will disable all autonomous roaming,
68856 + so that the AR6000 will not perform any scans after sending a \93DISCONNECT\94
68857 + event to the host. The state is maintained until a shutdown or host sets different
68858 + timeout value from 0.
68859 +
68860 +Command
68861 + wmiconfig eth1 --disc=<timeout in seconds>
68862 +
68863 +Command Parameters
68864 + UINT8 disconnectTimeout
68865 + Specifies the time limit (in seconds) after
68866 + which a failure to reestablish a connection
68867 + results in a \93DISCONNECT\94 event
68868 +
68869 +Command Values
68870 + None
68871 +
68872 +Reset Values
68873 + disconnectTimeout is 10 seconds
68874 +
68875 +Restrictions
68876 + This command can only be issued while in a DISCONNECTED state
68877 +
68878 +=====================================================================
68879 +
68880 +
68881 +Name
68882 + SET_FIXRATES
68883 +
68884 +Synopsis
68885 + By default, the AR6000 device uses all PHY rates based on mode of operation. If the
68886 + host application requires the device to use subset of supported rates, it can set those
68887 + rates with this command. In 802.11g mode, the AR6000 device takes the entire
68888 + 802.11g basic rate set and the rates specified with this command and uses it as the
68889 + supported rate set.
68890 +
68891 + This rate set is advertised in the probe request and the assoc/re-assoc request as
68892 + supported rates. Upon successful association, the device modifies the rate set pool
68893 + using the: intersection of AP-supported rates with the union of the 802.11g basic rate
68894 + set and rates set using this command. The device picks transmission rates from this
68895 + pool based on a rate control algorithm.
68896 +
68897 +Command
68898 + TBD
68899 +
68900 +Command Parameters
68901 + A_UINT16 fixRateMask;
68902 + The individual bit is an index for rate table,
68903 + and setting the that index to 1 would set that
68904 + corresponding rate. E.g., fixRateMask = 9
68905 + (1001) sets 1 Mbps and 11 Mbps.
68906 +
68907 +Command Values
68908 + None
68909 +
68910 +Reset Value
68911 + None defined
68912 +
68913 +Restrictions
68914 + None
68915 +
68916 +See Also
68917 + \93GET_FIXRATES\94
68918 +
68919 +=====================================================================
68920 +
68921 +
68922 +Name
68923 + SET_WHAL_PARAM
68924 +
68925 +Synopsis
68926 + An internal AR6000 command that is used to set certain hardware parameters. The
68927 + description of this command is in $WORKAREA/include/halapi.h.
68928 +
68929 +Command
68930 + TBD
68931 +
68932 +Command Parameters
68933 + ATH_HAL_SETCABTO_CMDID
68934 + Sets the timeout waiting for the multicast
68935 + traffic after a DTIM beacon (in TUs).
68936 +
68937 +Command Values
68938 + None
68939 +
68940 +Reset Value
68941 + Default = 10 TUs
68942 +
68943 +Restrictions
68944 + This command should be executed before issuing a connect command.
68945 +
68946 +=====================================================================
68947 +
68948 +
68949 +Name
68950 + SET_HOST_SLEEP_MODE
68951 +
68952 +Synopsis
68953 + The host uses this command to set the host mode to asleep or awake. All packets are
68954 + delivered to the host when the host mode is awake. When host mode is asleep, only if
68955 + WoW is enabled and the incoming packet matches one of the specified WoW
68956 + patterns, will the packet be delivered to the host. The host will also be woken up by
68957 + the target for pattern-matching packets and important events.
68958 +
68959 +Command
68960 + wmiconfig \96sethostmode=<asleep/awake>
68961 +
68962 +Command Parameters
68963 + A_BOOL awake Set the host mode to awake
68964 + A_BOOL asleep Set the host mode to asleep
68965 +
68966 +Command Values
68967 + 1 = awake, 0 = asleep
68968 +
68969 +Reset Value
68970 + None defined (default host mode is awake)
68971 +
68972 +Restrictions
68973 + None
68974 +
68975 +
68976 +=====================================================================
68977 +
68978 +Name
68979 + SET_IBSS_PM_CAPS
68980 +
68981 +Synopsis
68982 + Used to support a non-standard power management scheme for an ad hoc wireless
68983 + network consisting of up to eight stations (STAs) that support this form of power
68984 + saving (e.g., Atheros-based STAs). A thorough understanding of IEEE 802.11 ad hoc
68985 + networks is required to use this command effectively.
68986 +
68987 +Command
68988 + wmiconfig eth1 --ibsspmcaps --ps=<enable/disable>
68989 + --aw=<ATIM Windows in ms>
68990 + --ttl=<Time to live in number of beacon periods>
68991 + --to=<timeout in ms>
68992 +
68993 +Command Parameters
68994 + UINT8 power_saving
68995 + = 0
68996 + The non-standard power saving scheme is
68997 + disabled and maximum throughput (with no
68998 + power saving) is obtained.
68999 +
69000 + = 1
69001 + Ad hoc power saving scheme is enabled (but
69002 + throughput may be decreased)
69003 +
69004 + UINT16 atim_windows
69005 + Specifies the length (in ms) of the ad hoc traffic
69006 + indication message (ATIM) windows used in an ad
69007 + hoc network. All Atheros-based STAs that join the
69008 + network use this duration ATIM window.
69009 +
69010 + The duration is communicated between wireless
69011 + STAs through an IE in beacons and probe responses.
69012 +
69013 + The host sets atim_windows to control trade-offs
69014 + between power use and throughput. The value
69015 + chosen should be based on the beacon interval (see
69016 + the \93SET_BEACON_INT\94 command) on the
69017 + expected number of STAs in the IBSS, and on the
69018 + amount of traffic and traffic patterns between STAs.
69019 +
69020 + UINT16 timeout_value
69021 + Specifies the timeout (in ms). The value is the same
69022 + for all ad hoc connections, but tracks separately for
69023 + each.
69024 +
69025 + Applicable only for a beacon period and used to
69026 + derive actual timeout values on the Tx and Rx sides.
69027 + On the Tx side, the value defines a window during
69028 + which the STA accepts the frame(s) from the host for a
69029 + particular connection. Until closed, the window
69030 + restarts with every frame received from the host. On
69031 + the Rx side, indicates the time until which the STA
69032 + continues accepting frames from a particular
69033 + connection. The value resets with every frame
69034 + received. The value can be used to determine the
69035 + trade off between throughput and power.
69036 + Default = 10 ms
69037 +
69038 + UINT8 ttl
69039 + Specifies the value in number of beacon periods. The
69040 + value is used to set a limit on the time until which a
69041 + frame is kept alive in the AR6001 before being
69042 + discarded. Default = 5
69043 +
69044 +Command Values
69045 + None
69046 +
69047 +Reset Values
69048 + By default, power_saving is enabled with atim_window = 20 ms
69049 +
69050 +Restrictions
69051 + Can only be issued before the AR6000 starts an ad hoc network
69052 +
69053 +See Also
69054 + \93SET_BEACON_INT\94
69055 +
69056 +=====================================================================
69057 +
69058 +
69059 +
69060 +Name
69061 + SET_LISTEN_INT
69062 +
69063 +Synopsis
69064 + The host uses this command to request a listen interval, which determines how often
69065 + the AR6000 device should wake up and listen for traffic. The listen interval can be set
69066 + by the TUs or by the number of beacons. The device may not be able to comply with
69067 + the request (e.g., if the beacon interval is greater than the requested listen interval, the
69068 + device sets the listen interval to the beacon interval). The actual listen interval used
69069 + by the device is available in the \93CONNECT\94 event.
69070 +
69071 +Command
69072 + wmiconfig eth1 --listen=<#of TUs, can range from 15 to 3000>
69073 +
69074 + --listenbeacons=<#of beacons, can range from 1 to 50>
69075 +
69076 +Command Parameters
69077 + UINT16 listenInterval
69078 + Specifies the listen interval in Kms
69079 + (1024 ms), ranging from 100 to 1000
69080 +
69081 + UINT16 listenbeacons
69082 + Specifies the listen interval in beacons,
69083 + ranging from 1 to 50
69084 +
69085 +Command Values
69086 + None
69087 +
69088 +Reset Values
69089 + The device sets the listen interval equal to the beacon interval of the AP it associates
69090 + to.
69091 +
69092 +Restrictions
69093 + None
69094 +
69095 +=====================================================================
69096 +
69097 +
69098 +Name
69099 + SET_LPREAMBLE
69100 +
69101 +Synopsis
69102 + Overrides the short preamble capability of the AR6000 device
69103 +
69104 +Command
69105 + TBD
69106 +
69107 +Command Parameters
69108 + WMI_LPREAMBLE_DISABLED
69109 + The device is short-preamble capable
69110 +
69111 + WMI_LPREAMBLE_ENABLED
69112 + The device supports only the long-
69113 + preamble mode
69114 +
69115 +Command Values
69116 + None
69117 +
69118 +Reset Value
69119 + None defined
69120 +
69121 +Restrictions
69122 + None
69123 +
69124 +
69125 +=====================================================================
69126 +
69127 +Name
69128 + SET_MAX_SP_LEN
69129 +
69130 +Synopsis
69131 + Set the maximum service period; indicates the number of packets the AR6001 can
69132 + receive from the AP when triggered
69133 +
69134 +Command
69135 + wmiconfig eth1 --setMaxSPLength <maxSPLen>
69136 +
69137 +Command Parameters
69138 + UINT8 maxSPLen
69139 + An APSD_SP_LEN_TYPE value
69140 +
69141 +Command Values
69142 + {
69143 + DELIVER_ALL_PKT = 0x0
69144 + DELIVER_2_PKT = 0x1
69145 + DELIVER_4_PKT = 0x2
69146 + DELIVER_6_PKT = 0x3
69147 + }APSD_SP_LEN_TYPE
69148 +
69149 +
69150 +Reset Values
69151 + maxSPLen is DELIVER_ALL_PKT
69152 +
69153 +Restrictions
69154 + None
69155 +
69156 +=====================================================================
69157 +
69158 +
69159 +Name
69160 + SET_OPT_MODE
69161 +
69162 +Synopsis
69163 + Special feature, sets the special mode on/off
69164 +
69165 +Command
69166 + wmiconfig eth1 --mode <mode>
69167 + Set the optional mode, where mode is special or off
69168 +
69169 +Command Parameters
69170 + enum {
69171 + SPECIAL_OFF
69172 + SPECIAL_ON
69173 + } OPT_MODE_TYPE;
69174 +
69175 +Command Values
69176 +
69177 +Reset Value
69178 + Mode = Off
69179 +
69180 +Restrictions
69181 + None
69182 +
69183 +=====================================================================
69184 +
69185 +
69186 +Name
69187 + SET_PMKID
69188 +
69189 +Synopsis
69190 + The host uses this command to enable or disable a pairwise master key ID (PMKID)
69191 + in the AR6000 PMKID cache. The AR6000 clears its PMKID cache on receipt of a
69192 + DISCONNECT command from the host. Individual entries in the cache might be
69193 + deleted as the AR6000 detect new APs and decides to remove old ones.
69194 +
69195 +Command
69196 + wmiconfig eth1 --setbsspmkid --bssid=<aabbccddeeff>
69197 + --bsspmkid=<pmkid>
69198 +
69199 +Command Parameters
69200 + UINT8 bssid[6]
69201 + The MAC address of the AP that the
69202 + PMKID corresponds to (6 bytes in hex
69203 + format)
69204 +
69205 + UINT8 enable
69206 + Either PMKID_DISABLE (0) to disable
69207 + the PMKID or PMKID_ENABLE (1) to
69208 + enable it (16 bytes in hex format)
69209 +
69210 + UINT8 pmkid[16]
69211 + Meaningful only if enable is
69212 + PMKID_ENABLE, when it is the PMKID
69213 + that the AR6000 should use on the next
69214 + reassociation with the specified AP
69215 +
69216 +Command Values
69217 + enable
69218 + = 0 (disable), 1 (enable)
69219 + PKMID enabled/disabled
69220 +
69221 +Reset Values
69222 + None defined
69223 +
69224 +Restrictions
69225 + Only supported in infrastructure networks
69226 +
69227 +=====================================================================
69228 +
69229 +
69230 +Name
69231 + SET_PMKID_LIST_CMD
69232 +
69233 +Synopsis
69234 + Configures the list of PMKIDs on the firmware.
69235 +
69236 +Command
69237 + wmiconfig --setpmkidlist --numpmkid=<n> --pmkid=<pmkid_1>
69238 + ... --pmkid=<pmkid_n>
69239 +
69240 + Where n is the number of pmkids (maximum = 8) and pmkid_i is the ith pmkid (16
69241 + bytes in hex format)
69242 +
69243 +Command Parameters
69244 + {
69245 + A_UINT8 pmkid[WMI_PMKID_LEN];
69246 + } __ATTRIB_PACK WMI_PMKID;
69247 +
69248 + {
69249 + A_UINT32 numPMKID;
69250 + WMI_PMKID pmkidList[WMI_MAX_PMKID_CACHE];
69251 + } __ATTRIB_PACK WMI_SET_PMKID_LIST_CMD;
69252 +
69253 +Command Values
69254 + None
69255 +
69256 +Reset Values
69257 + None
69258 +
69259 +Restrictions
69260 + Supported only in infrastructure modes
69261 +
69262 +=====================================================================
69263 +
69264 +
69265 +Name
69266 + SET_POWER_MODE
69267 +
69268 +Synopsis
69269 + The host uses this command to provide the AR6000 device with guidelines on the
69270 + desired trade-off between power utilization and performance.
69271 +
69272 + In normal power mode, the device enters a sleep state if they have nothing to do,
69273 + which conserves power but may cost performance as it can take up to 2 ms to
69274 + resume operation after leaving sleep state.
69275 +
69276 + In maximum performance mode, the device never enters sleep state, thus no time
69277 + is spent waking up, resulting in higher power consumption and better
69278 + performance.
69279 +
69280 +Command
69281 + TBD
69282 +
69283 +Command Parameters
69284 + UINT8 powerMode
69285 + WMI_POWER_MODE value
69286 + {
69287 + REC_POWER = 1
69288 + (Recommended setting) Tries to conserve
69289 + power without sacrificing performance
69290 + MAX_PERF_POWER = 2
69291 + Setting that maximizes performance at
69292 + the expense of power
69293 +
69294 + All other values are reserved
69295 + } WMI_POWER_MODE
69296 +
69297 +Command Values
69298 + See command parameters
69299 +
69300 +Reset Values
69301 + powerMode is REC_POWER
69302 +
69303 +Restrictions
69304 + This command should only be issued in the DISCONNECTED state for the
69305 + infrastructure network.
69306 +
69307 + For a PM-disabled ad hoc network, the power mode should remain in
69308 + MAX_PERF_POWER.
69309 +
69310 + For a PM-enabled ad hoc network, the device can have REC_POWER or
69311 + MAX_PERF_POWER set, but either way it must follow the power save ad hoc
69312 + protocol. The host can change power modes in the CONNECTED state.
69313 +
69314 + Host changes to the PS setting when the STA is off the home channel take no effect
69315 + and cause a TARGET_PM_FAIL event.
69316 +
69317 +=====================================================================
69318 +
69319 +
69320 +Name
69321 + SET_POWER_PARAMS
69322 +
69323 +Synopsis
69324 + The host uses this command to configure power parameters
69325 +
69326 +Command
69327 + wmiconfig eth1 --pmparams --it=<ms> --np=<number of PS POLL>
69328 + --dp=<DTIM policy: ignore/normal/stick>
69329 +
69330 +Command Parameters
69331 + UINT16 idle_period
69332 + Length of time (in ms) the AR6000 device
69333 + remains awake after frame Rx/Tx before going
69334 + to SLEEP state
69335 +
69336 + UINT16 pspoll_number
69337 + The number of PowerSavePoll (PS-poll)
69338 + messages the device should send before
69339 + notifying the AP it is awake
69340 +
69341 + UINT16 dtim_policy
69342 + A WMI_POWER_PARAMS_CMD value
69343 +
69344 + {
69345 + IGNORE_DTIM =1
69346 + The device does not listen to any content after
69347 + beacon (CAB) traffic
69348 + NORMAL_DTIM = 2
69349 + DTIM period follows the listen interval (e.g., if
69350 + the listen interval is 4 and the DTIM period is 2,
69351 + the device wakes up every fourth beacon)
69352 + STICK_DTIM = 3
69353 + Device attempt to receive all CAB traffic (e.g., if
69354 + the DTIM period is 2 and the listen interval is 4,
69355 + the device wakes up every second beacon)
69356 + } WMI_POWER_PARAMS_CMD
69357 +
69358 +Command Parameters
69359 + See command parameters
69360 +
69361 +Reset Values
69362 + idle_period
69363 + 200 ms
69364 +
69365 + pspoll_number
69366 + = 1
69367 +
69368 + dtim_policy
69369 + = NORMAL_DTIM
69370 +
69371 +Restrictions
69372 + None
69373 +
69374 +=====================================================================
69375 +
69376 +
69377 +Name
69378 + SET_POWERSAVE_PARAMS
69379 +
69380 +Synopsis
69381 + Set the two AR6000 power save timers (PS-POLL timer and APSD trigger timer) and
69382 + the two ASPD TIM policies
69383 +
69384 +Command
69385 + wmiconfig eth1--psparams --psPollTimer=<psPollTimeout in ms>
69386 + --triggerTimer=<triggerTimeout in ms> --apsdTimPolicy=<ignore/
69387 + adhere> --simulatedAPSDTimPolicy=<ignore/adhere>
69388 +
69389 +Command Parameters
69390 + typedef struct {
69391 + A_UINT16 psPollTimeout;
69392 + Timeout (in ms) after sending PS-POLL; the
69393 + AR6000 device sleeps if it does not receive a
69394 + data packet from the AP
69395 +
69396 + A_UINT16 triggerTimeout;
69397 + Timeout (in ms) after sending a trigger; the
69398 + device sleeps if it does not receive any data
69399 + or null frame from the AP
69400 +
69401 + APSD_TIM_POLICY apsdTimPolicy;
69402 + TIM behavior with queue APSD enabled
69403 +
69404 + APSD_TIM_POLICY simulatedAPSD
69405 +
69406 + TimPolicy;
69407 + TIM behavior with simulated APSD
69408 + enabled
69409 +
69410 + typedef enum {
69411 + IGNORE_TIM_ALL_QUEUES_APSD = 0,
69412 + PROCESS_TIM_ALL_QUEUES_APSD = 1,
69413 + IGNORE_TIM_SIMULATED_APSD = 2,
69414 + POWERSAVE_TIMERS_POLICY = 3,
69415 + } APSD_TIM_POLICY;
69416 +
69417 +Command Values
69418 + None
69419 +
69420 +Reset Values
69421 + psPollTimeout is 50 ms; triggerTimeout is 10 ms;
69422 + apsdTimPolicy = IGNORE_TIM_ALL_QUEUES_APSD;
69423 + simulatedAPSDTimPolicy = POWERSAVE_TIMERS_POLICY
69424 +
69425 +Restrictions
69426 + When this command is used, all parameters must be set; this command does not
69427 + allow setting only one parameter.
69428 +
69429 +=====================================================================
69430 +
69431 +
69432 +Name
69433 + SET_PROBED_SSID
69434 +
69435 +Synopsis
69436 + The host uses this command to provide a list of up to MAX_PROBED_SSID_INDEX
69437 + (six) SSIDs that the AR6000 device should actively look for. It lists the active SSID
69438 + table. By default, the device actively looks for only the SSID specified in the
69439 + \93CONNECT_CMD\94 command, and only when the regulatory domain allows active
69440 + probing. With this command, specified SSIDs are probed for, even if they are hidden.
69441 +
69442 +Command
69443 + wmiconfig eth1 --ssid=<ssid> [--num=<index>]
69444 +
69445 +Command Parameters
69446 + {
69447 + A_UINT8 numSsids
69448 + A number from 0 to
69449 + MAX_PROBED_SSID_INDEX indicating
69450 + the active SSID table entry index for this
69451 + command (if the specified entry index
69452 + already has an SSID, the SSID specified in
69453 + this command replaces it)
69454 +
69455 + WMI_PROBED_SSID_INFO probedSSID[1]
69456 + } WMI_PROBED_SSID_CMD
69457 +
69458 + {
69459 + A_UINT8 flag
69460 + WMI_SSID_FLAG indicates the current
69461 + entry in the active SSID table
69462 + A_UINT8 ssidLength
69463 + Length of the specified SSID in bytes.
69464 + If = 0, the entry corresponding to the
69465 + index is erased
69466 + A_UINT8 ssid[32]
69467 + SSID string actively probed for when
69468 + permitted by the regulatory domain
69469 + } WMI_PROBED_SSID_INFO
69470 +
69471 +Command Values
69472 + WMI_SSID_FLAG
69473 + {
69474 + DISABLE_SSID_FLAG = 0
69475 + Disables entry
69476 + SPECIFIC_SSID_FLAG = 1
69477 + Probes specified SSID
69478 + ANY_SSID_FLAG = 2
69479 + Probes for any SSID
69480 + } WMI_SSID_FLAG
69481 +
69482 +Reset Value
69483 + The entries are unused.
69484 +
69485 +Restrictions
69486 + None
69487 +
69488 +=====================================================================
69489 +
69490 +
69491 +Name
69492 + SET_REASSOC_MODE
69493 +
69494 +Synopsis
69495 + Specify whether the disassociated frame should be sent or not upon reassociation.
69496 +
69497 +Command
69498 + wmiconfig eth1 --setreassocmode <mode>
69499 +
69500 +Command Parameters
69501 + UINT8 mode
69502 +
69503 +Command Values
69504 + mode
69505 + = 0x00
69506 + Send disassoc to a previously connected AP
69507 + upon reassociation
69508 + = 0x01
69509 + Do not send disassoc to previously connected
69510 + AP upon reassociation
69511 +
69512 +Reset Values
69513 + None defined
69514 +
69515 +Restrictions
69516 + None
69517 +
69518 +
69519 +=====================================================================
69520 +
69521 +Name
69522 + SET_RETRY_LIMITS
69523 +
69524 +Synopsis
69525 + Allows the host to influence the number of times that the AR6000 device should
69526 + attempt to send a frame before they give up.
69527 +
69528 +Command
69529 + wmiconfig --setretrylimits <frameType> <trafficClass> <maxRetries>
69530 + <enableNotify>
69531 +
69532 +Command Parameters
69533 + {
69534 + UINT8 frameType
69535 + A WMI_FRAMETYPE specifying
69536 + which type of frame is of interest.
69537 + UINT8 trafficClass
69538 + Specifies a traffic class (see
69539 + \93CREATE_PSTREAM\94). This
69540 + parameter is only significant when
69541 + frameType = DATA_FRAMETYPE.
69542 + UINT8 maxRetries
69543 + Maximum number of times the
69544 + device attempts to retry a frame Tx,
69545 + ranging from WMI_MIN_RETRIES
69546 + (2) to WMI_MAX_RETRIES (15). If
69547 + the special value 0 is used,
69548 + maxRetries is set to 15.
69549 + A_UINT8 enableNotify
69550 + Notify when enabled
69551 + } WMI_RETRY_LIMIT_INFO
69552 +
69553 + {
69554 + A_UINT8 numEntries
69555 + WMI_RETRY_LIMIT_INFO retryLimitInfo[1]
69556 + } WMI_SET_RETRY_LIMITS_CMD
69557 +
69558 +Command Values
69559 + {
69560 + MGMT_FRAMETYPE = 0 Management frame
69561 + CONTROL_FRAMETYPE = 1 Control frame
69562 + DATA_FRAMETYPE = 2 Data frame
69563 + } WMI_FRAMETYPE
69564 +
69565 +Reset Values
69566 + Retries are set to 15
69567 +
69568 +Restrictions
69569 + None
69570 +
69571 +=====================================================================
69572 +
69573 +
69574 +Name
69575 + SET_ROAM_CTRL
69576 +
69577 +Synopsis
69578 + Affects how the AR6000 device selects a BSS. The host uses this command to set and
69579 + enable low RSSI scan parameters. The time period of low RSSI background scan is
69580 + mentioned in scan period. Low RSSI scan is triggered when the current RSSI
69581 + threshold (75% of current RSSI) is equal to or less than scan threshold.
69582 +
69583 + Low RSSI roam is triggered when the current RSSI threshold falls below the roam
69584 + threshold and roams to a better AP by the end of the scan cycle. During Low RSSI
69585 + roam, if the STA finds a new AP with an RSSI greater than roam RSSI to floor, during
69586 + scan, it roams immediately to it instead of waiting for the end of the scan cycle. See
69587 + also \93Scan and Roam\94 on page C-1.
69588 +
69589 +Command
69590 + wmiconfig --roam <roamctrl> <info>, where info is <scan period>
69591 + <scan threshold> <roam threshold> <roam rssi floor>
69592 +
69593 +Command Parameters
69594 + A_UINT8 roamCtrlType;
69595 +
69596 +Command Values
69597 + WMI_FORCE_ROAM = 1
69598 + Roam to the specified BSSID
69599 +
69600 + WMI_SET_ROAM_MODE = 2
69601 + Default, progd bias, no roam
69602 +
69603 + WMI_SET_HOST_BIAS = 3
69604 + Set the host bias
69605 +
69606 + WMI_SET_LOWRSSI_SCAN_PARAMS = 4
69607 + Info parameters
69608 +
69609 + A_UINT8 bssid[ATH_MAC_LEN];
69610 + WMI_FORCE_ROAM
69611 +
69612 + A_UINT8 roamMode;
69613 + WMI_SET_ROAM_MODE
69614 +
69615 + A_UINT8 bssBiasInfo;
69616 + WMI_SET_HOST_BIAS
69617 +
69618 + A_UINT16 lowrssi_scan_period;
69619 + WMI_SET_LOWRSSI_SCAN_PARAMS
69620 +
69621 + A_INT16
69622 + lowrssi_scan_threshold;
69623 + WMI_SET_LOWRSSI_SCAN_PARAMS
69624 +
69625 + A_INT16 lowrssi_roam_threshold;
69626 + WMI_SET_LOWRSSI_SCAN_PARAMS
69627 +
69628 + A_UINT8 roam_rssi_floor;
69629 + WMI_SET_LOWRSSI_SCAN_PARAMS
69630 +
69631 +Reset Value
69632 + None defined (default lowrssi scan is disabled. Enabled only when scan period is set.)
69633 +
69634 +Restrictions
69635 + None
69636 +
69637 +=====================================================================
69638 +
69639 +
69640 +Name
69641 + SET_RTS
69642 +
69643 +Synopsis
69644 + Decides when RTS should be sent.
69645 +
69646 +Command
69647 + wmiconfig eth1 --setRTS <pkt length threshold>
69648 +
69649 +Command Parameters
69650 + A_UINT16
69651 + threshold;
69652 + Command parameter threshold in bytes. An RTS is
69653 + sent if the data length is more than this threshold.
69654 + The default is to NOT send RTS.
69655 +
69656 +Command Values
69657 + None
69658 +
69659 +Reset Value
69660 + Not to send RTS.
69661 +
69662 +Restrictions
69663 + None
69664 +
69665 +
69666 +=====================================================================
69667 +
69668 +Name
69669 + SET_SCAN_PARAMS
69670 +
69671 +Synopsis
69672 + The host uses this command to set the AR6000 scan parameters, including the duty
69673 + cycle for both foreground and background scanning. Foreground scanning takes
69674 + place when the AR6000 device is not connected, and discovers all available wireless
69675 + networks to find the best BSS to join. Background scanning takes place when the
69676 + device is already connected to a network and scans for potential roaming candidates
69677 + and maintains them in order of best to worst. A second priority of background
69678 + scanning is to find new wireless networks.
69679 +
69680 + The device initiates a scan when necessary. For example, a foreground scan is always
69681 + started on receipt of a \93CONNECT_CMD\94 command or when the device cannot find
69682 + a BSS to connect to. Foreground scanning is disabled by default until receipt of a
69683 + CONNECT command. Background scanning is enabled by default and occurs every
69684 + 60 seconds after the device is connected.
69685 +
69686 + The device implements a binary backoff interval for foreground scanning when it
69687 + enters the DISCONNECTED state after losing connectivity with an AP or when a
69688 + CONNECT command is received. The first interval is ForegroundScanStartPeriod,
69689 + which doubles after each scan until the interval reaches ForegroundScanEndPeriod.
69690 + If the host terminates a connection with DISCONNECT, the foreground scan period
69691 + is ForegroundScanEndPeriod. All scan intervals are measured from the time a full
69692 + scan ends to the time the next full scan starts. The host starts a scan by issuing a
69693 + \93START_SCAN\94 command. See also \93Scan and Roam\94 on page C-1.
69694 +
69695 +Command
69696 + wmiconfig eth1 --scan --fgstart=<sec> --fgend=<sec> --bg=<sec> --
69697 + act=<msec> --pas=<msec> --sr=<short scan ratio> --scanctrlflags
69698 + <connScan> <scanConnected> <activeScan> <reportBSSINFO>
69699 +
69700 +Command Parameters
69701 + UINT16 fgStartPeriod
69702 + First interval used by the device when it
69703 + disconnects from an AP or receives a
69704 + CONNECT command, specified in seconds (0\96
69705 + 65535). If = 0, the device uses the reset value.
69706 + If = 65535, the device disables foreground
69707 + scanning.
69708 +
69709 + UINT16 fgEndPeriod
69710 + The maximum interval the device waits between
69711 + foreground scans specified in seconds (from
69712 + ForegroundScanStartPeriod to 65535). If = 0, the
69713 + device uses the reset value.
69714 +
69715 + UINT16 bgScanPeriod
69716 + The period of background scan specified in
69717 + seconds (0\9665535). By default, it is set to the reset
69718 + value of 60 seconds. If 0 or 65535 is specified, the
69719 + device disables background scanning.
69720 +
69721 + UINT16 maxactChDwellTime
69722 + The period of time the device stays on a
69723 + particular channel while active scanning. It is
69724 + specified in ms (10\9665535). If the special value of
69725 + 0 is specified, the device uses the reset value.
69726 +
69727 + UINT16 PasChDwellTime
69728 + The period of time the device remains on a
69729 + particular channel while passive scanning. It is
69730 + specified in ms (10\9665535). If the special value of
69731 + 0 is specified, the device uses the reset value.
69732 +
69733 + UINT8 shortScanRatio
69734 + Number of short scans to perform for each
69735 + long scan.
69736 +
69737 + UINT8 scanCtrlFlasgs
69738 +
69739 + UINT16 minactChDwellTime
69740 + Specified in ms
69741 +
69742 + UINT32 maxDFSchActTime
69743 + The maximum time a DFS channel can stay
69744 + active before being marked passive, specified in
69745 + ms.
69746 +
69747 +Command Values
69748 + None
69749 +
69750 +Reset Values
69751 + ForegroundScanStart
69752 +Period
69753 + 1 sec
69754 +
69755 + ForegroundScanEndPeriod
69756 + 60 sec
69757 +
69758 + BackgroundScanPeriod
69759 + 60 sec
69760 +
69761 + ActiveChannelDwellTime
69762 + 105 ms
69763 +
69764 +=====================================================================
69765 +
69766 +
69767 +Name
69768 + SET_TKIP_COUNTERMEASURES
69769 +
69770 +Synopsis
69771 + The host issues this command to tell the target whether to enable or disable TKIP
69772 + countermeasures.
69773 +
69774 +Command
69775 + TBD
69776 +
69777 +Command Parameters
69778 + UINT8 WMI_TKIP_CM_ENABLE
69779 + Enables the countermeasures
69780 +
69781 +
69782 + UINT8 TKIP_CM_DISABLE
69783 + Disables the countermeasures
69784 +
69785 +Command Values
69786 + None
69787 +
69788 +Reset Values
69789 + By default, TKIP MIC reporting is disabled
69790 +
69791 +Restrictions
69792 + None
69793 +
69794 +=====================================================================
69795 +
69796 +
69797 +Name
69798 + SET_TX_PWR
69799 +
69800 +Synopsis
69801 + The host uses this command to specify the Tx power level of the AR6000. Cannot be
69802 + used to exceed the power limit permitted by the regulatory domain. The maximum
69803 + output power is limited in the chip to 31.5 dBm; the range is 0 \96 31.5 dbm.
69804 +
69805 +Command
69806 + wmiconfig --power <dbM>
69807 +
69808 +Command Parameters
69809 + UINT8 dbM
69810 + The desired Tx power specified in dbM.
69811 + If = 0, the device chooses the maximum
69812 + permitted by the regulatory domain.
69813 +
69814 +Command Values
69815 + None
69816 +
69817 +Reset Values
69818 + The maximum permitted by the regulatory domain
69819 +
69820 +Restrictions
69821 + None
69822 +
69823 +See Also
69824 + \93GET_TX_PWR\94
69825 +
69826 +
69827 +=====================================================================
69828 +
69829 +Name
69830 + SET_VOICE_PKT_SIZE
69831 +
69832 +Synopsis
69833 + If an AP does not support WMM, it has no way to differentiate voice from data.
69834 + Because the voice packet is typically small, packet in size less than voicePktSize are
69835 + assumed to be voice, otherwise it is treated as data.
69836 +
69837 +Command
69838 + wmiconfig eth1 --setVoicePktSize <size-in-bytes>
69839 +
69840 +Command Parameters
69841 + UINT16 voicePktSize
69842 + Packet size in octets
69843 +
69844 +Command Values
69845 + None
69846 +
69847 +Reset Values
69848 + voicePktSize default is 400 bytes
69849 +
69850 +Restrictions
69851 + No effect if WMM is unavailable
69852 +
69853 +
69854 +=====================================================================
69855 +
69856 +Name
69857 + SET_WMM
69858 +
69859 +Synopsis
69860 + Overrides the AR6000 device WMM capability
69861 +
69862 +Command
69863 + wmiconfig eth1 --setwmm <enable>
69864 +
69865 +Command Parameters
69866 + WMI_WMM_ENABLED
69867 + Enables WMM
69868 +
69869 + WMI_WMM_DISABLED
69870 + Disables WMM support
69871 +
69872 +Command Values
69873 + 0 = disabled
69874 + 1 = enabled
69875 +
69876 +Reset Value
69877 + WMM Disabled
69878 +
69879 +Restrictions
69880 + None
69881 +
69882 +
69883 +=====================================================================
69884 +
69885 +Name
69886 + SET_WMM_TXOP
69887 +
69888 +Synopsis
69889 + Configures TxOP Bursting when sending traffic to a WMM capable AP
69890 +
69891 +Command
69892 + wmiconfig eth1 --txopbursting <burstEnable>
69893 +
69894 + <burstEnable>
69895 + = 0
69896 + Disallow TxOp bursting
69897 +
69898 + = 1
69899 + Allow TxOp bursting
69900 +
69901 +Command Parameters
69902 + txopEnable
69903 + = WMI_TXOP_DISABLED
69904 + Disabled
69905 +
69906 + = WMI_TXOP_ENABLED
69907 + Enabled
69908 +
69909 +Command Values
69910 + txopEnable
69911 + = 0 Disabled
69912 +
69913 + = 1 Enabled
69914 +
69915 +Reset Value
69916 + Bursting is off by default
69917 +
69918 +Restrictions
69919 + None
69920 +
69921 +=====================================================================
69922 +
69923 +
69924 +Name
69925 + SET_WOW_MODE
69926 +
69927 +Synopsis
69928 + The host uses this command to enable or disable the WoW mode. When WoW mode
69929 + is enabled and the host is asleep, pattern matching takes place at the target level.
69930 + Only packets that match any of the pre-specified WoW filter patterns, will be passed
69931 + up to the host. The host will also be woken up by the target. Packets which do not
69932 + match any of the WoW patterns are discarded.
69933 +
69934 +Command
69935 + wmiconfig \96setwowmode <enable/disable>
69936 +
69937 +Command Parameters
69938 + A_BOOL enable_wow
69939 + Enable or disable WoW:
69940 +
69941 +Command Values
69942 + = 0
69943 + Disable WoW
69944 +
69945 + = 1
69946 + Enable WoW
69947 +
69948 +Reset Value
69949 + None defined (default WoW mode is disabled).
69950 +
69951 +Restrictions
69952 + None
69953 +
69954 +See Also
69955 + \93GET_WOW_LIST\94
69956 +
69957 +
69958 +=====================================================================
69959 +
69960 +Name
69961 + SET_WSC_STATUS
69962 +
69963 +Synopsis
69964 + The supplicant uses this command to inform the target about the status of the WSC
69965 + registration protocol. During the WSC registration protocol, a flag is set so the target
69966 + bypasses some of the checks in the CSERV module. At the end of the registration, this
69967 + flag is reset.
69968 +
69969 +Command
69970 + N/A
69971 +
69972 +Command Parameters
69973 + A_BOOL status
69974 + = 1 WSC registration in progress
69975 + = 0 WSC protocol not running
69976 +
69977 +Reply Parameters
69978 + None
69979 +
69980 +Reset Value
69981 + None defined (default = 0)
69982 +
69983 +Restrictions
69984 + None
69985 +
69986 +
69987 +=====================================================================
69988 +
69989 +Name
69990 + SNR_THRESHOLD_PARAMS
69991 +
69992 +Synopsis
69993 + Configures how the AR6000 device monitors and reports SNR of the connected BSS,
69994 + used as a link quality metric.
69995 +
69996 +Command
69997 + --snrThreshold <weight> <upper_threshold_1> ...
69998 + <upper_threshold_4> <lower_threshold_1> ... <lower_threshold_4>
69999 + <pollTimer>
70000 +
70001 +Command Parameters
70002 + <weight>
70003 + Share with rssiThreshold. Range in [1, 16], used
70004 + in the formula to calculate average RSSI
70005 +
70006 + <upper_threshold_x>
70007 + Above thresholds expressed in db, in ascending
70008 + order
70009 +
70010 + <lower_threshold_x>
70011 + Below thresholds expressed in db, in ascending
70012 + order
70013 +
70014 + <pollTimer>
70015 + The signal strength sampling frequency in
70016 + seconds. If polltime = 0, signal strength
70017 + sampling is disabled
70018 +
70019 +Command Values
70020 + None
70021 +
70022 +Reset Value
70023 + None defined
70024 +
70025 +Restrictions
70026 + None
70027 +
70028 +=====================================================================
70029 +
70030 +
70031 +Name
70032 + START_SCAN
70033 +
70034 +Synopsis
70035 + The host uses this command to start a long or short channel scan. All future scans are
70036 + relative to the time the AR6000 device processes this command. The device performs
70037 + a channel scan on receipt of this command, even if a scan was already in progress.
70038 + The host uses this command when it wishes to refresh its cached database of wireless
70039 + networks. The isLegacy field will be removed (0 for now) because it is achieved by
70040 + setting CONNECT_PROFILE_MATCH_DONE in the CONNECT command. See also
70041 + \93Scan and Roam\94
70042 +
70043 +Command
70044 + wmiconfig eth1 --startscan <scan type> <forcefgscan> 0
70045 + <homeDwellTime> <forceScanInterval>
70046 +
70047 +Command Parameters
70048 + UINT8 scanType
70049 + WMI_SCAN_TYPE
70050 +
70051 +Command Values
70052 + {
70053 + WMI_LONG_SCAN =0x0
70054 + Requests a full scan
70055 + WMI_SHORT_SCAN =0x1
70056 + Requests a short scan
70057 + } WMI_SCAN_TYPE
70058 +
70059 + A_BOOL forceFgScan
70060 + forceFgScan
70061 + = 0
70062 + Disable the foreground scan
70063 +
70064 + forceFgScan
70065 + = 1
70066 + Forces a foreground scan
70067 +
70068 + A_UINT32 homeDwellTime
70069 + Maximum duration in the home
70070 + channel (in ms)
70071 +
70072 + A_UINT32 forceScanInterval
70073 + Time interval between scans (in ms)
70074 +
70075 + A_UINT32 scanType
70076 + WMI_SCAN_TYPE
70077 +
70078 +Reset Value
70079 + Disable forcing foreground scan
70080 +
70081 +Restrictions
70082 + isLegacy field will no longer be supported (pass as 0 for now)
70083 +
70084 +
70085 +=====================================================================
70086 +
70087 +Name
70088 + SYNCHRONIZE
70089 +
70090 +Synopsis
70091 + The host uses this command to force a synchronization point between the command
70092 + and data paths
70093 +
70094 +Command
70095 + TBD
70096 +
70097 +Command Parameters
70098 + None
70099 +
70100 +
70101 +
70102 +Command Values
70103 + None
70104 +
70105 +
70106 +
70107 +Reset Values
70108 + None
70109 +
70110 +
70111 +
70112 +Restrictions
70113 + None
70114 +
70115 +
70116 +=====================================================================
70117 +
70118 +Name
70119 + TARGET_ERROR_REPORT_BITMASK
70120 +
70121 +Synopsis
70122 + Allows the host to control \93ERROR_REPORT\94 events from the AR6000 device.
70123 +
70124 + If error reporting is disabled for an error type, a count of errors of that type is
70125 + maintained by the device.
70126 +
70127 + If error reporting is enabled for an error type, an \93ERROR_REPORT\94 event is
70128 + sent when an error occurs and the error report bit is cleared.
70129 +
70130 + Error counts for each error type are available through the \93GET_TARGET_STATS\94
70131 + command.
70132 +
70133 +Command
70134 + wmiconfig eth1 --setErrorReportingBitmask
70135 +
70136 +Command Parameters
70137 + UINT32 bitmask
70138 + Represents the set of
70139 + WMI_TARGET_ERROR_VAL error types
70140 + enabled for reporting
70141 +
70142 +Command Values
70143 + {
70144 + WMI_TARGET_PM_ERR_FAIL = 0x00000001
70145 + Power save fails (only two cases):
70146 + Retry out of null function/QoS null
70147 + function to associated AP for PS
70148 + indication'
70149 + Host changes the PS setting when
70150 + STA is off home channel
70151 +
70152 + WMI_TARGET_KEY_NOT_FOUND = 0x00000002
70153 + No cipher key
70154 + WMI_TARGET_DECRYPTION_ERR = 0x00000004
70155 + Decryption error
70156 + WMI_TARGET_BMISS = 0x00000008
70157 + Beacon miss
70158 + WMI_PSDISABLE_NODE_JOIN = 0x00000010
70159 + A non-PS-enabled STA joined the
70160 + PS-enabled network
70161 + WMI_TARGET_COM_ERR = 0x00000020
70162 + Host/target communication error
70163 + WMI_TARGET_FATAL_ERR = 0x00000040
70164 + Fatal error
70165 + } WMI_TARGET_ERROR_VAL
70166 +
70167 +Reset Values
70168 + Bitmask is 0, and all error reporting is disabled
70169 +
70170 +Restrictions
70171 + None
70172 +
70173 +
70174 +=====================================================================
70175 +WMI Events
70176 +
70177 +Event
70178 + Description
70179 + Page
70180 +
70181 +
70182 +BSSINFO
70183 + Contains information describing BSSs collected during a scan
70184 +
70185 +CAC_EVENTID
70186 + Indicates signalling events in admission control
70187 +
70188 +CMDERROR
70189 + The AR6000 device encounters an error while attempting to process
70190 + a command
70191 +
70192 +CONNECT
70193 + The device has connected to a wireless network
70194 +
70195 +DISCONNECT
70196 + The device lost connectivity with a wireless network
70197 +
70198 +ERROR_REPORT
70199 + An error has occurred for which the host previously requested
70200 + notification with the command
70201 + \93TARGET_ERROR_REPORT_BITMASK\94
70202 +
70203 +EXTENSION
70204 + WMI extension event
70205 +
70206 +GET_PMKID_LIST_EVENT
70207 + Created in response to a \93GET_PMKID_LIST_CMD\94 command
70208 +
70209 +GET_WOW_LIST_EVENT
70210 + Response to the wmiconfig \93GET_WOW_LIST\94 command to
70211 + retrieve the configured WoW patterns
70212 +
70213 +NEIGHBOR_REPORT
70214 + Neighbor APs that match the current profile were detected
70215 +
70216 +OPT_RX_FRAME_EVENT
70217 + (Special feature) informs the host of the reception of a special frame
70218 +
70219 +PSTREAM_TIMEOUT
70220 + A prioritized stream has been idle for a specified interval
70221 +
70222 +READY
70223 + The AR6000 device is ready to accept commands
70224 +
70225 +REGDOMAIN
70226 + The regulatory domain has changed
70227 +
70228 +REPORT_ROAM_DATA_EVENT
70229 + Reports the roam time calculations made by the device
70230 + (generated with a special build)
70231 + \97
70232 +
70233 +REPORT_STATISTICS
70234 + Reply to a \93GET_TARGET_STATS\94 command
70235 +
70236 +ROAM_TBL_EVENT
70237 + Reports the roam table
70238 +
70239 +RSSI_THRESHOLD
70240 + Signal strength from the connected AP has crossed the threshold
70241 + defined in the \93RSSI_THRESHOLD_PARAMS\94 command
70242 +
70243 +SCAN_COMPLETE_EVENT
70244 + A scan has completed (added status SCAN_ABORTED in release 2.0)
70245 +
70246 +TEST_EVENT
70247 + Event generated by the TCMD
70248 +
70249 +TKIP_MICERROR
70250 + TKIP MIC errors were detected
70251 +
70252 +=====================================================================
70253 +
70254 +Name
70255 + BSSINFO
70256 +
70257 +Synopsis
70258 + Contains information describing one or more BSSs as collected during a scan.
70259 + Information includes the BSSID, SSID, RSSI, network type, channel, supported rates,
70260 + and IEs. BSSINFO events are sent only after the device receives a beacon or probe-
70261 + response frame that pass the filter specified in the \93SET_BSS_FILTER\94 command.
70262 + BSSINFO events consist of a small header followed by a copy of the beacon or probe
70263 + response frame. The 802.11 header is not present. For formats of beacon and probe-
70264 + response frames please consult the IEEE 802.11 specification.
70265 +
70266 + The beacons or probe responses containing the IE specified by the
70267 + WMI_BSS_FILTER_CMD are passed to the host through the
70268 + WMI_BSSINFO_EVENT. The event carries a 32-bit bitmask that indicates the IEs that
70269 + were detected in the management frame. The frame type field has been extended to
70270 + indicate action management frames. This would be helpful to route these frames
70271 + through the same event mechanism as used by the beacon processing function.
70272 +
70273 + If the bssFilter in the SET_BSS_FILTER matches, then the ieMask is not relevant
70274 + because the BSSINFO event is sent to the host. If the bssFilter doesnot match in the
70275 + beacons/probe respones, then the ieMask match dictates whether the BSSINFO
70276 + event is sent to the host. In the case of action management frames, the ieMask is the
70277 + filter that is applied.
70278 +
70279 +Event ID
70280 + 0x1004
70281 +
70282 +Event Parameters
70283 + typedef struct {
70284 + A_UINT16 channel;
70285 + Specifies the frequency (in MHz) where the
70286 + frame was received
70287 + A_UINT8 frameType;
70288 + A WMI_BI_FTYPE value
70289 + A_UINT8 snr;
70290 + A_INT16 rssi;
70291 + Indicates signal strength
70292 + A_UINT8 bssid[ATH_MAC_LEN];
70293 + A_UINT32 ieMask;
70294 + } _ATTRIB_PACK_WMI_BSS_INFO_HDR;
70295 +
70296 + Beacon or Probe Response Frame
70297 +
70298 +Event Values
70299 + {
70300 + BEACON_FTYPE = 0x1
70301 + Indicates a beacon frame
70302 + PROBERESP_FTYPE
70303 + Indicates a probe response frame
70304 + ACTION_MGMT_FTYPE
70305 + } WMI_BI_FTYPE
70306 +
70307 +=====================================================================
70308 +
70309 +Name
70310 + CAC_EVENTID
70311 +
70312 +Synopsis
70313 + Indicates signalling events in admission control. Events are generated when
70314 + admission is accepted, rejected, or deleted by either the host or the AP. If the AP does
70315 + not respond to an admission request within a timeout of 500 ms, an event is
70316 + generated to the host.
70317 +
70318 +Event ID
70319 + 0x1011
70320 +
70321 +Event Parameters
70322 + UINT8
70323 + ac
70324 + Access class pertaining to the
70325 +signalling
70326 +
70327 + UINT8 cac_indication
70328 + Type of indication; indications are
70329 + listed in WMI_CAC_INDICATION
70330 +
70331 + UINT8 statusCode
70332 + AP response status code for a
70333 + request
70334 +
70335 + UINT8 tspecSuggestion[63]
70336 + Suggested TSPEC from AP
70337 +
70338 +Event Values
70339 + {
70340 + CAC_INDICATION_ADMISSION = 0x00
70341 + CAC_INDICATION_ADMISSION_RESP = 0x01
70342 + CAC_INDICATION_DELETE = 0x02
70343 + CAC_INDICATION_NO_RESP = 0x03
70344 + } WMI_CAC_INDICATION
70345 +
70346 +
70347 +=====================================================================
70348 +
70349 +
70350 +Name
70351 + CMDERROR
70352 +
70353 +Synopsis
70354 + Indicates that the AR6000 device encountered an error while attempting to process a
70355 + command. This error is fatal and indicates that the device requires a reset.
70356 +
70357 +Event ID
70358 + 0x1005
70359 +
70360 +Event Parameters
70361 + UINT16 commandId
70362 + Corresponds to the command which generated
70363 + the error
70364 + UINT8 errorCode
70365 + A WMI_ERROR_CODE value
70366 +
70367 +Event Values
70368 + {
70369 + INVALID_PARAM = 1
70370 + Invalid parameter
70371 + ILLEGAL_STATE = 2
70372 + Illegal state
70373 + INTERNAL_ERROR = 3
70374 + Internal Error
70375 + All other values reserved
70376 + } WMI_ERROR_CODE
70377 +
70378 +
70379 +=====================================================================
70380 +
70381 +
70382 +Name
70383 + CONNECT
70384 +
70385 +Synopsis
70386 + Signals that the AR6000 connected to a wireless network. Connection occurs due to a
70387 + \93CONNECT\94 command or roaming to a new AP. For infrastructure networks, shows
70388 + that the AR6000 successfully performed 802.11 authentication and AP association.
70389 +
70390 +Event ID
70391 + 0x1002
70392 +
70393 +Event Parameters
70394 + UINT16 channel
70395 + Channel frequency (in MHz) of the network the
70396 + AR6000 are connected to
70397 +
70398 + UINT8 bssid[6]
70399 + MAC address of the AP the AR6000 are
70400 + connected to or the BSSID of the ad hoc
70401 + network
70402 +
70403 + UINT16 listenInterval
70404 + Listen interval (in Kms) that the AR6000 are
70405 + using
70406 +
70407 + UINT 8 beaconIeLen
70408 + Length (in bytes) of the beacon IEs
70409 +
70410 + UINT8 assocInfo
70411 + Pointer to an array containing beacon IEs,
70412 + followed first by association request IEs then by
70413 + association response IEs
70414 +
70415 + UINT8 assocReqLen
70416 + Length (in bytes) of the assocReqIEs array
70417 +
70418 + UINT8 assocRespLen
70419 + Length (in bytes) of the assocRespIEs array
70420 +
70421 +Event Values
70422 + None defined
70423 +
70424 +=====================================================================
70425 +
70426 +
70427 +Name
70428 + DISCONNECT
70429 +
70430 +Synopsis
70431 + Signals that the AR6000 device lost connectivity with the wireless network.
70432 + DISCONENCT is generated when the device fails to complete a \93CONNECT\94
70433 + command or as a result of a transition from a connected state to disconnected state.
70434 +
70435 + After sending the \93DISCONNECT\94 event the device continually tries to re-establish
70436 + a connection. A LOST_LINK occurs when STA cannot receive beacons within the
70437 + specified time for the SET_BMISS_TIME command.
70438 +
70439 +Event ID
70440 + 0x1003
70441 +
70442 +Event Parameters
70443 + UINT8 disconnect
70444 + Reason
70445 + A WMI_DISCONNECT_REASON value
70446 +
70447 + UINT8 bssid[6]
70448 + Indicates which BSS the device was connected to
70449 +
70450 + UINT8 assocRespLen
70451 + Length of the 802.11 association response frame
70452 + that triggered this event, or 0 if not applicable
70453 +
70454 + UINT8 assocInfo[assocRespLen]
70455 + Copy of the 802.11 association response frame
70456 +
70457 +Event Values
70458 + {
70459 + NO_NETWORK_AVAIL =0x01
70460 + Indicates that the device was unable to
70461 + establish or find the desired network
70462 + LOST_LINK =0x02
70463 + Indicates the devices is no longer receiving
70464 + beacons from the BSS it was previously
70465 + connected to
70466 +
70467 + DISCONNECT_CMD =0x03
70468 + Indicates a \93DISCONNECT\94 command was
70469 + processed
70470 + BSS_DISCONNECTED =0x04
70471 + Indicates the BSS explicitly disconnected the
70472 + device. Possible mechanisms include the AP
70473 + sending 802.11 management frames
70474 + (e.g., disassociate or deauthentication
70475 + messages).
70476 + AUTH_FAILED =0x05
70477 + Indicates that the device failed 802.11
70478 + authentication with the BSS
70479 + ASSOC_FAILED =0x06
70480 + Indicates that the device failed 802.11
70481 + association with the BSS
70482 + NO_RESOURCES_AVAIL =0x07
70483 + Indicates that a connection failed because the
70484 + AP had insufficient resources to complete the
70485 + connection
70486 + CSERV_DISCONNECT =0x08
70487 + Indicates that the device\92s connection services
70488 + module decided to disconnect from a BSS,
70489 + which can happen for a variety of reasons (e.g.,
70490 + the host marks the current connected AP as a
70491 + bad AP).
70492 + INVALID_PROFILE =0x0A
70493 + Indicates that an attempt was made to
70494 + reconnect to a BSS that no longer matches the
70495 + current profile
70496 + All other values are reserved
70497 + } WMI_DISCONNECT_REASON
70498 +
70499 +
70500 +=====================================================================
70501 +
70502 +
70503 +Name
70504 + ERROR_REPORT
70505 +
70506 +Synopsis
70507 + Signals that a type of error has occurred for which the host previously requested
70508 + notification through the \93TARGET_ERROR_REPORT_BITMASK\94 command.
70509 +
70510 +Event ID
70511 + 0x100D
70512 +
70513 +Event Parameters
70514 + UINT32 errorVal
70515 + WMI_TARGET_ERROR_VAL value. See
70516 + \93TARGET_ERROR_REPORT_BITMASK\94.
70517 +
70518 +Event Values
70519 + errorVal
70520 + = 0x00000001
70521 + Power save fails
70522 +
70523 + = 0x00000002
70524 + No cipher key
70525 +
70526 + = 0x00000004
70527 + Decryption error
70528 +
70529 + = 0x00000008
70530 + Beacon miss
70531 +
70532 + = 0x00000010
70533 + A non-power save disabled node has joined
70534 + the PS-enabled network
70535 +
70536 +
70537 +=====================================================================
70538 +
70539 +
70540 +Name
70541 + EXTENSION
70542 +
70543 +Synopsis
70544 + The WMI is used mostly for wireless control messages to a wireless module that
70545 + apply to wireless module management regardless of the target platform
70546 + implementation. However, some events peripherally related to wireless management
70547 + are desired during operation. These wireless extension events may be platform-
70548 + specific or implementation-dependent. See \93WMI Extension Commands\94
70549 +
70550 +
70551 +Event ID
70552 + 0x1010
70553 +
70554 +
70555 +=====================================================================
70556 +
70557 +
70558 +Name
70559 + GET_PMKID_LIST_EVENT
70560 +
70561 +Synopsis
70562 + Generated by firmware in response to a \93GET_PMKID_LIST_CMD\94 command.
70563 +
70564 +Event Parameters
70565 + typedef struct {
70566 + A_UINT32 numPMKID;
70567 + Contains the number of PMKIDs in the reply
70568 + WMI_PMKID pmkidList[1];
70569 + } __ATTRIB_PACK WMI_PMKID_LIST_REPLY;
70570 +
70571 +Event Values
70572 + None
70573 +
70574 +
70575 +=====================================================================
70576 +
70577 +
70578 +Name
70579 + GET_WOW_LIST_EVENT
70580 +
70581 +Synopsis
70582 + Response to the wmiconfig \96getwowlist command to retrieve the configured Wake on
70583 + Wireless patterns
70584 +
70585 +Event ID
70586 + 0x10018
70587 +
70588 +Event Parameters
70589 + {
70590 +
70591 + A_UINT8 num_filters
70592 + Total number of patterns in the list
70593 + A_UINT8 this_filter_num
70594 + The filter number
70595 + A_UINT8 wow_mode
70596 + Shows whether WoW is enabled or disabled
70597 + A_UINT8 host_mode
70598 + Shows whether the host is asleep or awake
70599 + WOW_FILTER wow_filters[1]
70600 + List of WoW filters (pattern and mask data bytes)
70601 + } WMI_GET_WOW_LIST_REPLY;
70602 +
70603 + {
70604 + Each wow_filter_list element shows:
70605 + A_UINT8 wow_valid_filter
70606 + Whether the filter is valid
70607 + A_UINT8 wow_filter_list_id
70608 + Filter List ID (23 = default)
70609 + A_UINT8 wow_filter_size
70610 + Size in bytes of the filter
70611 + A_UINT8 wow_filter_offset
70612 + Offset of the pattern to search in the data packet
70613 + A_UINT8 wow_filter_mask[MASK_SIZE]
70614 + The mask to be applied to the pattern
70615 + A_UINT8 wow_filter_pattern[WOW_PATTERN_SIZE]
70616 + The pattern that to match to wake up the host
70617 + } WOW_FILTER
70618 +
70619 +Event Values
70620 + None
70621 +
70622 +=====================================================================
70623 +
70624 +
70625 +
70626 +Name
70627 + NEIGHBOR_REPORT
70628 +
70629 +Synopsis
70630 + Indicates the existence of neighbor APs that match the current profile. The host uses
70631 + this event to populate the PMKID cache on the AR6000 and/or to perform
70632 + preauthentication. This event is only generated in infrastructure mode.
70633 +
70634 + A total of numberOfAps pairs of bssid/bssFlags exist, one pair for each AP.
70635 +
70636 +Event ID
70637 + 0x1008
70638 +
70639 +Event Parameters
70640 + UINT8 numberOfAps
70641 + The number of APs reported about in
70642 + this event
70643 + {
70644 + UINT8 bssid[6]
70645 + MAC address of a neighbor AP
70646 + UINT8 bssFlags
70647 + A WMI_BSS_FLAGS value
70648 + }[numberOfAps]
70649 +
70650 +
70651 +Event Values
70652 + {
70653 + WMI_DEFAULT_BSS_FLAGS = 0
70654 + Logical OR of 1 or more
70655 + WMI_BSS_FLAGS
70656 + WMI_PREAUTH_CAPABLE_BSS
70657 + = 1
70658 + Indicates that this AP is capable of
70659 + preauthentication
70660 + WMI_PMKID_VALID_BSS
70661 + = 2
70662 + Indicates that the AR6000 have a
70663 + valid pairwise master key for this AP
70664 + } WMI_BSS_FLAGS
70665 +
70666 +
70667 +=====================================================================
70668 +
70669 +
70670 +
70671 +Name
70672 + OPT_RX_FRAME_EVENT
70673 +
70674 +Synopsis
70675 + Special feature, informs host of the reception of a special frame.
70676 +
70677 +Event ID
70678 + 0x100E
70679 +
70680 +Event Parameters
70681 + {
70682 + A_UINT16 channel;
70683 + A_UINT8 frameType;
70684 + A_INT8 snr;
70685 + A_UINT8 srcAddr[ATH_MAC_LEN];
70686 + A_UINT8 bssid[ATH_MAC_LEN];
70687 + }WMI_OPT_RX_INFO_HDR
70688 +
70689 +Event Values
70690 + None
70691 +
70692 +=====================================================================
70693 +
70694 +
70695 +
70696 +Name
70697 + PSTREAM_TIMEOUT
70698 +
70699 +Synopsis
70700 + Indicates that a priority stream that got created as a result of priority-marked data
70701 + flow (priority marked in IP TOS) being idle for the default inactivity interval period
70702 + (specified in the \93CREATE_PSTREAM\94 command) used for priority streams created
70703 + implicitly by the driver. This event is not indicated for user-created priority streams.
70704 + User-created priority streams exist until the users delete them explicitly. They do not
70705 + timeout due to data inactivity.
70706 +
70707 +Event ID
70708 + 0x1007
70709 +
70710 +Event Parameters
70711 + A_UINT8
70712 + trafficClass
70713 + Indicated the traffic class of priority
70714 + stream that timed out
70715 +
70716 +Event Values
70717 + {
70718 + WMM_AC_BE = 0
70719 + Best effort
70720 + WMM_AC_BK = 1
70721 + Background
70722 + WMM_AC_VI = 2
70723 + Video
70724 + WMM_AC_VO = 3
70725 + Voice
70726 + } TRAFFIC CLASS
70727 +
70728 +
70729 +=====================================================================
70730 +
70731 +Name
70732 + READY
70733 +
70734 +Synopsis
70735 + Indicates that the AR6000 device is prepared to accept commands. It is sent once after
70736 + power on or reset. It also indicates the MAC address of the device.
70737 +
70738 +Event ID
70739 + 0x1001
70740 +
70741 +Event Parameters
70742 + UINT8 macAddr[6]
70743 + Device MAC address
70744 + UINT8 phyCapability
70745 + A WMI_PHY_CAPABILITY value. Indicates the
70746 + capabilities of the device wireless module\92s radio
70747 +
70748 +Event Values
70749 + {
70750 + WMI_11A_CAPABILITY = 1
70751 + WMI_11G_CAPABILITY = 2
70752 + WMI_11AG_CAPABILITY = 3
70753 + } WMI_PHY_CAPABILITY
70754 +
70755 +
70756 +=====================================================================
70757 +
70758 +Name
70759 + REGDOMAIN
70760 +
70761 +Synopsis
70762 + Indicates that the regulatory domain has changed. It initially occurs when the
70763 + AR6000 device reads the board data information. The regulatory domain can also
70764 + change when the device is a world-mode SKU. In this case, the regulatory domain is
70765 + based on the country advertised by APs per the IEEE 802.11d specification. A
70766 + potential side effect of a regulatory domain change is a change in the list of available
70767 + channels. Any channel restrictions that exist as a result of a previous
70768 + \93SET_CHANNEL_PARAMETERS\94 command are lifted.
70769 +
70770 +Event ID
70771 + 0x1006
70772 +
70773 +Event Parameters
70774 + UINT32 regDomain
70775 + The range of 0x0000 \96 0x00FF
70776 + corresponds to an ISO country code.
70777 +
70778 + Other regCodes are reserved for world
70779 + mode settings and specific regulatory
70780 + domains.
70781 +
70782 +Event Values
70783 + None
70784 +
70785 +
70786 +=====================================================================
70787 +
70788 +
70789 +
70790 +Name
70791 + REPORT_STATISTICS
70792 +
70793 +Synopsis
70794 + A reply to a \93GET_TARGET_STATS\94 command.
70795 +
70796 +Event ID
70797 + 0x100B
70798 +
70799 +Event Parameters
70800 + When the statistics are sent to the host, the AR6001 clear them so that a new set of
70801 + statistics are collected for the next report.
70802 +
70803 + UINT32 tx_packets
70804 + UINT32 tx_bytes
70805 + UINT32 tx_unicast_pkts
70806 + UINT32 tx_unicast_bytes
70807 + UINT32 tx_multicast_pkts
70808 + UINT32 tx_multicast_bytes
70809 + UINT32 tx_broadcast_pkts
70810 + UINT32 tx_broadcast_bytes
70811 + UINT32 tx_rts_success_cnt
70812 + UINT32 tx_packet_per_ac[4]
70813 + Tx packets per AC: [0] = BE, [1] = BK,
70814 + [2] = VI, [3] = VO
70815 + UINT32 tx_errors
70816 + Number of packets which failed Tx, due
70817 + to all failures
70818 + ... REPORT_STATISTICS, continued
70819 + UINT32 tx_failed_cnt
70820 + Number of data packets that failed Tx
70821 + UINT32 tx_retry_cnt
70822 + Number of Tx retries for all packets
70823 + UINT32 tx_rts_fail_cnt
70824 + Number of RTS Tx failed count
70825 + UINT32 rx_packets
70826 + UINT32 rx_bytes
70827 + UINT32 rx_unicast_pkts
70828 + UINT32 rx_unicast_bytes
70829 + UINT32 rx_multicast_pkts
70830 + UINT32 rx_multicast_bytes
70831 + UINT32 rx_broadcast_pkts
70832 + UINT32 rx_broadcast_bytes
70833 + UINT32 rx_fragment_pkt
70834 + Number of fragmented packets received
70835 + UINT32 rx_errors
70836 + Number of Rx errors due to all failures
70837 + UINT32 rx_crcerr
70838 + Number of Rx errors due to CRC errors
70839 + UINT32 rx_key_cache_miss
70840 + Number of Rx errors due to a key not
70841 + being plumbed
70842 + UINT32 rx_decrypt_err
70843 + Number of Rx errors due to decryption
70844 + failure
70845 + UINT32 rx_duplicate_frames
70846 + Number of duplicate frames received
70847 + UINT32 tkip_local_mic_failure
70848 + Number of TKIP MIC errors detected
70849 + UINT32 tkip_counter_measures_invoked
70850 + Number of times TKIP countermeasures
70851 + were invoked
70852 + UINT32 tkip_replays
70853 + Number of frames that replayed a TKIP
70854 + encrypted frame received earlier
70855 + UINT32 tkip_format_errors
70856 + Number of frames that did not conform
70857 + to the TKIP frame format
70858 + UINT32 ccmp_format_errors
70859 + Number of frames that did not conform
70860 + to the CCMP frame format
70861 + UINT32 ccmp_replays
70862 + Number of frames that replayed a CCMP
70863 + encrypted frame received earlier
70864 + UINT32 power_save_failure_cnt
70865 + Number of failures that occurred when
70866 + the AR6001 could not go to sleep
70867 + UINT32 cs_bmiss_cnt
70868 + Number of BMISS interrupts since
70869 + connection
70870 + UINT32 cs_lowRssi_cnt
70871 + Number of the times the RSSI went below
70872 + the low RSSI threshold
70873 + UINT16 cs_connect_cnt
70874 + Number of connection times
70875 + UINT16 cs_disconnect_cnt
70876 + Number of disconnection times
70877 + UINT8 cs_aveBeacon_rssi
70878 + The current averaged value of the RSSI
70879 + from the beacons of the connected BSS
70880 + UINT8 cs_lastRoam_msec
70881 + Time that the last roaming took, in ms.
70882 + This time is the difference between
70883 + roaming start and actual connection.
70884 +
70885 +Event Values
70886 + None defined
70887 +
70888 +
70889 +=====================================================================
70890 +
70891 +Name
70892 + ROAM_TBL_EVENT
70893 +
70894 +Synopsis
70895 + Reports the roam table, which contains the current roam mode and this information
70896 + for every BSS:
70897 +
70898 +Event ID
70899 + 0x100F
70900 +
70901 +Event Parameters
70902 + A_UINT8 bssid[ATH_MAC_LEN];
70903 + BSSID
70904 + A_UINT8 rssi
70905 + Averaged RSSI
70906 + A_UINT8 rssidt
70907 + Change in RSSI
70908 + A_UINT8 last_rssi
70909 + Last recorded RSSI
70910 + A_UINT8 roam_util
70911 + Utility value used in roaming decision
70912 + A_UINT8 util
70913 + Base utility with the BSS
70914 + A_UINT8 bias
70915 + Host configured for this BSS
70916 +
70917 +Event Values
70918 + roamMode
70919 + Current roam mode
70920 +
70921 + = 1
70922 + RSSI based roam
70923 +
70924 + = 2
70925 + Host bias-based roam
70926 +
70927 + = 3
70928 + Lock to the current BSS
70929 +
70930 + = 4
70931 + Autonomous roaming disabled
70932 +
70933 +
70934 +=====================================================================
70935 +
70936 +Name
70937 + RSSI_THRESHOLD
70938 +
70939 +Synopsis
70940 + Alerts the host that the signal strength from the connected AP has crossed a
70941 + interesting threshold as defined in a previous \93RSSI_THRESHOLD_PARAMS\94
70942 + command.
70943 +
70944 +Event ID
70945 + 0x100C
70946 +
70947 +Event Parameters
70948 + UINT8 range
70949 + A WMI_RSSI_THRESHOLD_VAL
70950 + value, which indicates the range of
70951 + the average signal strength
70952 +
70953 +Event Values
70954 + {
70955 + WMI_RSSI_LOWTHRESHOLD_BELOW_LOWERVAL = 1
70956 + WMI_RSSI_LOWTHRESHOLD_LOWERVAL = 2
70957 + WMI_RSSI_LOWTHRESHOLD_UPPERVAL = 3
70958 + WMI_RSSI_HIGHTHRESHOLD_LOWERVAL = 4
70959 + WMI_RSSI_HIGHTHRESHOLD_HIGHERVAL = 5
70960 + } WMI_RSSI_THRESHOLD_VAL
70961 +
70962 +
70963 +=====================================================================
70964 +
70965 +Name
70966 + SCAN_COMPLETE_EVENT
70967 +
70968 +Synopsis
70969 + Indicates the scan status. if the Scan was not completed, this event is generated with
70970 + the status A_ECANCELED.
70971 +
70972 +Event ID
70973 + 0x100A
70974 +
70975 +Event Parameters
70976 + A_UINT8 scanStatus
70977 +
70978 +Event Values
70979 + {
70980 + #define SCAN_ABORTED 16
70981 + #define SCAN_COMPLETED 0
70982 + A_UINT8 scanStatus
70983 + A_OK or A_ECANCELED
70984 + } WMI_SCAN_COMPLETE_EVENT;
70985 +
70986 +
70987 +=====================================================================
70988 +
70989 +Name
70990 + TEST_EVENT
70991 +
70992 +Synopsis
70993 + The TCMD application uses a single WMI event (WMI_TEST_EVENTID) to
70994 + communicate events from target to host. The events are parsed by the TCMD
70995 + application and WMI layer is oblivious of it.
70996 +
70997 +Event ID
70998 + 0x1016
70999 +
71000 +Event Parameters
71001 + WMI_TEST_EVENTID
71002 +
71003 +
71004 +Event Values
71005 + None
71006 +
71007 +
71008 +=====================================================================
71009 +
71010 +
71011 +
71012 +Name
71013 + TKIP_MICERR
71014 +
71015 +Synopsis
71016 + Indicates that TKIP MIC errors were detected.
71017 +
71018 +Event ID
71019 + 0x1009
71020 +
71021 +Event Parameters
71022 + UINT8 keyid
71023 + Indicates the TKIP key ID
71024 +
71025 + UINT8 ismcast
71026 + 0 = Unicast
71027 + 1 = Multicast
71028 +
71029 +Event Values
71030 + See event parameters
71031 +
71032 +=====================================================================
71033 +
71034 +WMI Extension Commands
71035 +
71036 +The WMI EXTENSION command is used to multiplex a collection of
71037 +commands that:
71038 +
71039 + Are not generic wireless commands
71040 + May be implementation-specific
71041 + May be target platform-specific
71042 + May be optional for a host implementation
71043 +
71044 + An extension command is sent to the AR6000 targets like any other WMI
71045 +command message and uses the WMI_EXTENSION. The first field of the
71046 +payload for this EXTENSION command is another commandId, sometimes
71047 +called the subcommandId, which indicates which extension command is
71048 +being used. A subcommandId-specific payload follows the subcommandId.
71049 +
71050 +All extensions (subcommandIds) are listed in the header file include/wmix.h.
71051 +See also \93WMI Extension Events\94 on page B-58.
71052 +
71053 +
71054 +WMI Extension Commands
71055 +
71056 +
71057 +GPIO_INPUT_GET
71058 + Read GPIO pins configured for input
71059 +
71060 +GPIO_INTR_ACK
71061 + Acknowledge and re-arm GPIO interrupts reported earlier
71062 +
71063 +GPIO_OUTPUT_SET
71064 + Manage output on GPIO pins configured for output
71065 +
71066 +GPIO_REGISTER_GET
71067 + Read an arbitrary GPIO register
71068 +
71069 +GPIO_REGISTER_SET
71070 + Dynamically change GPIO configuration
71071 +
71072 +SET_LQTHRESHOLD
71073 + Set link quality thresholds; the sampling happens at every unicast
71074 + data frame Tx, if certain thresholds are met, and corresponding
71075 + events are sent to the host
71076 +
71077 +
71078 +=====================================================================
71079 +
71080 +Name
71081 + GPIO_INPUT_GET
71082 +
71083 +Synopsis
71084 + Allows the host to read GPIO pins that are configured for input. The values read are
71085 + returned through a \93GPIO_DATA\94 extension event.
71086 +
71087 +NOTE: Support for GPIO is optional.
71088 +
71089 +Command
71090 + N/A
71091 +
71092 +Command Parameters
71093 + None
71094 +
71095 +
71096 +
71097 +Reply Parameters
71098 + None
71099 +
71100 +
71101 +Reset Value
71102 + None
71103 +
71104 +
71105 +
71106 +Restrictions
71107 + None
71108 +
71109 +=====================================================================
71110 +
71111 +
71112 +Name
71113 + GPIO_INTR_ACK
71114 +
71115 +Synopsis
71116 + The host uses this command to acknowledge and to re-arm GPIO interrupts reported
71117 + through an earlier \93GPIO_INTR\94 extension event. A single \93GPIO_INTR_ACK\94
71118 + command should be used to acknowledge all GPIO interrupts that the host knows to
71119 + be outstanding (if pending interrupts are not acknowledged through
71120 + \93GPIO_INTR_ACK\94, another \93GPIO_INTR\94 extension event is raised).
71121 +
71122 +NOTE: Support for GPIO is optional.
71123 +
71124 +Command
71125 + N/A
71126 +
71127 +Command Parameters
71128 + UINT32 ack_mask
71129 + A mask of interrupting GPIO pins (e.g., ack_mask
71130 + bit [3] acknowledges an interrupt from the pin GPIO3).
71131 +
71132 +Command Values
71133 + None
71134 +
71135 +Reset Value
71136 + None
71137 +
71138 +Restrictions
71139 + The host should acknowledge only interrupts about which it was notified.
71140 +
71141 +
71142 +=====================================================================
71143 +
71144 +Name
71145 + GPIO_OUTPUT_SET
71146 +
71147 +Synopsis
71148 + Manages output on GPIO pins configured for output.
71149 +
71150 + Conflicts between set_mask and clear_mask or enable_mask and disable_mask result
71151 + in undefined behavior.
71152 +
71153 +NOTE: Support for GPIO is optional.
71154 +
71155 +Command
71156 + N/A
71157 +
71158 +Command Parameters
71159 + UINT32 set_mask
71160 + Specifies which pins should drive a 1 out
71161 + UINT32 clear_mask
71162 + Specifies which pins should drive a 0 out
71163 + UINT32 enable_mask
71164 + Specifies which pins should be enabled for output
71165 + UINT32 disable_mask
71166 + Specifies which pins should be disabled for output
71167 +
71168 +Command Values
71169 + None
71170 +
71171 +
71172 +Reset Value
71173 + None
71174 +
71175 +
71176 +Restrictions
71177 + None
71178 +
71179 +
71180 +
71181 +=====================================================================
71182 +
71183 +
71184 +Name
71185 + GPIO_REGISTER_GET
71186 +
71187 +Synopsis
71188 + Allows the host to read an arbitrary GPIO register. It is intended for use during
71189 + bringup/debug. The target responds to this command with a \93GPIO_DATA\94 event.
71190 +
71191 +NOTE: Support for GPIO is optional.
71192 +
71193 +Command
71194 + N/A
71195 +
71196 +Command Parameters
71197 + UINT32
71198 + gpioreg_id
71199 + Specifies a GPIO register identifier, as defined
71200 +in include/AR6000/AR6000_gpio.h
71201 +
71202 +Reply Parameters
71203 + None
71204 +
71205 +Reset Value
71206 + N/A
71207 +
71208 +Restrictions
71209 + None
71210 +
71211 +
71212 +=====================================================================
71213 +
71214 +Name
71215 + GPIO_REGISTER_SET
71216 +
71217 +Synopsis
71218 + Allows the host to dynamically change GPIO configuration (usually handled
71219 + statically through the GPIO configuration DataSet).
71220 +
71221 +NOTE: Support for GPIO is optional.
71222 +
71223 +Command
71224 + N/A
71225 +
71226 +Command Parameters
71227 + UINT32 gpioreg_id
71228 + Specifies a GPIO register identifier, as defined in
71229 + include/AR6000/AR6000_gpio.h
71230 + UINT32 value
71231 + Specifies a value to write to the specified
71232 + GPIO register
71233 +
71234 +Command Values
71235 + None
71236 +
71237 +
71238 +Reset Value
71239 + Initial hardware configuration is as defined in the AR6001 or AR6002 ROCmTM
71240 + Single-Chip MAC/BB/Radio for 2.4/5 GHz Embedded WLAN Applications data sheet. This
71241 + configuration is modified by the GPIO Configuration DataSet, if one exists.
71242 +
71243 +Restrictions
71244 + None
71245 +
71246 +
71247 +=====================================================================
71248 +
71249 +
71250 +Name
71251 + SET_LQTHRESHOLD
71252 +
71253 +Synopsis
71254 + Set link quality thresholds, the sampling happens at every unicast data frame Tx, if
71255 + certain threshold is met, corresponding event will be sent to host.
71256 +
71257 +Command
71258 + wmiconfig eth1 --lqThreshold <enable> <upper_threshold_1>...
71259 + <upper_threshold_4> <lower_threshold_1>... <lower_threshold_4>
71260 +
71261 +Command Parameters
71262 + A_UINT8 enable;
71263 + A_UINT8 thresholdAbove1_Val;
71264 + A_UINT8 thresholdAbove2_Val;
71265 + A_UINT8 thresholdAbove3_Val;
71266 + A_UINT8 thresholdAbove4_Val;
71267 + A_UINT8 thresholdBelow1_Val;
71268 + A_UINT8 thresholdBelow2_Val;
71269 + A_UINT8 thresholdBelow3_Val;
71270 + A_UINT8 thresholdBelow4_Val;
71271 +
71272 +Command Values
71273 + enable
71274 + = 0
71275 + Disable link quality sampling
71276 +
71277 + = 1
71278 + Enable link quality sampling
71279 +
71280 +
71281 + thresholdAbove_Val
71282 + [1...4]
71283 + Above thresholds (value in [0,100]), in ascending
71284 + order threshold
71285 +
71286 + Below_Val [1...4] = below thresholds (value
71287 + in [0,100]), in ascending order
71288 +
71289 +Reset Values
71290 + None
71291 +
71292 +Restrictions
71293 + None
71294 +
71295 +=====================================================================
71296 +WMI Extension Events
71297 +
71298 +The WMI EXTENSION event is used for a collection of events that:
71299 +
71300 + Are not generic wireless events
71301 + May be implementation-specific
71302 + May be target platform-specific
71303 + May be optional for a host implementation
71304 +
71305 + An extension event is sent from the AR6000 device targets to the host just like
71306 +any other WMI event message, using the WMI_EXTENSION_EVENTID. The
71307 +first field of the payload for this \93EXTENSION\94 event is another commandId
71308 +(sometimes called the subcommandId) that indicates which \93EXTENSION\94
71309 +event is being used. A subcommandId-specific payload follows the
71310 +subcommandId.
71311 +
71312 +All extensions (subcommandIds) are listed in the header file include/wmix.h.
71313 +See also \93WMI Extension Commands\94 on page B-55.
71314 +
71315 +
71316 +WMI Extension Events
71317 +
71318 +
71319 +GPIO_ACK
71320 + Acknowledges a host set command has been processed by the device
71321 +
71322 +GPIO_DATA
71323 + Response to a host\92s request for data
71324 +
71325 +GPIO_INTR
71326 + Signals that GPIO interrupts are pending
71327 +
71328 +
71329 +=====================================================================
71330 +
71331 +Name
71332 + GPIO_ACK
71333 +
71334 +Synopsis
71335 + Acknowledges that a host set command (either \93GPIO_OUTPUT_SET\94 or
71336 + \93GPIO_REGISTER_SET\94) has been processed by the AR6000 device.
71337 +
71338 +NOTE: Support for GPIO is optional.
71339 +
71340 +Event ID
71341 + N/A
71342 +
71343 +Event Parameters
71344 + None
71345 +
71346 +
71347 +Event Values
71348 + None
71349 +
71350 +=====================================================================
71351 +
71352 +
71353 +Name
71354 + GPIO_DATA
71355 +
71356 +Synopsis
71357 + The AR6000 device uses this event to respond to the host\92s earlier request for data
71358 + (through either a \93GPIO_REGISTER_GET\94 or a \93GPIO_INPUT_GET\94 command).
71359 +
71360 +NOTE: Support for GPIO is optional.
71361 +
71362 +Event ID
71363 + N/A
71364 +
71365 +Event Parameters
71366 + UINT32 value
71367 + Holds the data of interest, which is either a register value
71368 + (in the case of \93GPIO_REGISTER_GET\94) or a mask of
71369 + pin inputs (in the case of \93GPIO_INPUT_GET\94).
71370 + UINT32 reg_id
71371 + Indicates which register was read (in the case of
71372 + \93GPIO_REGISTER_GET\94) or is GPIO_ID_NONE (in the
71373 + case of \93GPIO_INPUT_GET\94)
71374 +
71375 +Event Values
71376 + None
71377 +
71378 +
71379 +=====================================================================
71380 +
71381 +
71382 +
71383 +Name
71384 + GPIO_INTR
71385 +
71386 +Synopsis
71387 + The AR6000 device raises this event to signal that GPIO interrupts are pending.
71388 + These GPIOs may be interrupts that occurred after the last \93GPIO_INTR_ACK\94
71389 + command was issued, or may be GPIO interrupts that the host failed to acknowledge
71390 + in the last \93GPIO_INTR_ACK\94. The AR6000 will not raise another GPIO_INTR
71391 + event until this event is acknowledged through a \93GPIO_INTR_ACK\94 command.
71392 +
71393 +NOTE: Support for GPIO is optional.
71394 +
71395 +Event ID
71396 + N/A
71397 +
71398 +Event Parameters
71399 + UINT32 intr_mask
71400 + Indicates which GPIO interrupts are currently pending
71401 +
71402 + UINT32 input_values
71403 + A recent copy of the GPIO input values, taken at the
71404 + time the most recent GPIO interrupt was processed
71405 +
71406 +Event Values
71407 + None
71408 +
71409 +
71410 +
71411 +=====================================================================
71412 +#endif
71413 Index: linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wmi/wmi_host.h
71414 ===================================================================
71415 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
71416 +++ linux-2.6.24.7/drivers/sdio/function/wlan/ar6000/wmi/wmi_host.h 2008-12-11 22:46:49.000000000 +0100
71417 @@ -0,0 +1,71 @@
71418 +#ifndef _WMI_HOST_H_
71419 +#define _WMI_HOST_H_
71420 +/*
71421 + * Copyright (c) 2004-2006 Atheros Communications Inc.
71422 + * All rights reserved.
71423 + *
71424 + * This file contains local definitios for the wmi host module.
71425 + *
71426 + * $Id: //depot/sw/releases/olca2.0-GPL/host/wmi/wmi_host.h#1 $
71427 + *
71428 + *
71429 + * This program is free software; you can redistribute it and/or modify
71430 + * it under the terms of the GNU General Public License version 2 as
71431 + * published by the Free Software Foundation;
71432 + *
71433 + * Software distributed under the License is distributed on an "AS
71434 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
71435 + * implied. See the License for the specific language governing
71436 + * rights and limitations under the License.
71437 + *
71438 + *
71439 + *
71440 + */
71441 +
71442 +#ifdef __cplusplus
71443 +extern "C" {
71444 +#endif
71445 +
71446 +struct wmi_stats {
71447 + A_UINT32 cmd_len_err;
71448 + A_UINT32 cmd_id_err;
71449 +};
71450 +
71451 +struct wmi_t {
71452 + A_BOOL wmi_ready;
71453 + A_BOOL wmi_numQoSStream;
71454 + A_UINT8 wmi_wmiStream2AcMapping[WMI_PRI_MAX_COUNT];
71455 + WMI_PRI_STREAM_ID wmi_ac2WmiStreamMapping[WMM_NUM_AC];
71456 + A_UINT16 wmi_streamExistsForAC[WMM_NUM_AC];
71457 + A_UINT8 wmi_fatPipeExists;
71458 + void *wmi_devt;
71459 + struct wmi_stats wmi_stats;
71460 + struct ieee80211_node_table wmi_scan_table;
71461 + A_UINT8 wmi_bssid[ATH_MAC_LEN];
71462 + A_UINT8 wmi_powerMode;
71463 + A_UINT8 wmi_phyMode;
71464 + A_UINT8 wmi_keepaliveInterval;
71465 + A_MUTEX_T wmi_lock;
71466 +};
71467 +
71468 +#define WMI_INIT_WMISTREAM_AC_MAP(w) \
71469 +{ (w)->wmi_wmiStream2AcMapping[WMI_BEST_EFFORT_PRI] = WMM_AC_BE; \
71470 + (w)->wmi_wmiStream2AcMapping[WMI_LOW_PRI] = WMM_AC_BK; \
71471 + (w)->wmi_wmiStream2AcMapping[WMI_HIGH_PRI] = WMM_AC_VI; \
71472 + (w)->wmi_wmiStream2AcMapping[WMI_HIGHEST_PRI] = WMM_AC_VO; \
71473 + (w)->wmi_ac2WmiStreamMapping[WMM_AC_BE] = WMI_BEST_EFFORT_PRI; \
71474 + (w)->wmi_ac2WmiStreamMapping[WMM_AC_BK] = WMI_LOW_PRI; \
71475 + (w)->wmi_ac2WmiStreamMapping[WMM_AC_VI] = WMI_HIGH_PRI; \
71476 + (w)->wmi_ac2WmiStreamMapping[WMM_AC_VO] = WMI_HIGHEST_PRI; }
71477 +
71478 +#define WMI_WMISTREAM_ACCESSCATEGORY(w,s) (w)->wmi_wmiStream2AcMapping[s]
71479 +#define WMI_ACCESSCATEGORY_WMISTREAM(w,ac) (w)->wmi_ac2WmiStreamMapping[ac]
71480 +
71481 +#define LOCK_WMI(w) A_MUTEX_LOCK(&(w)->wmi_lock);
71482 +#define UNLOCK_WMI(w) A_MUTEX_UNLOCK(&(w)->wmi_lock);
71483 +
71484 +#ifdef __cplusplus
71485 +}
71486 +#endif
71487 +
71488 +#endif /* _WMI_HOST_H_ */
71489 Index: linux-2.6.24.7/drivers/sdio/function/wlan/Makefile
71490 ===================================================================
71491 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
71492 +++ linux-2.6.24.7/drivers/sdio/function/wlan/Makefile 2008-12-11 22:46:49.000000000 +0100
71493 @@ -0,0 +1,4 @@
71494 +#
71495 +# SDIO wlan ar600 card function driver
71496 +#
71497 +obj-$(CONFIG_SDIO_AR6000_WLAN) += ar6000/
71498 \ No newline at end of file
71499 Index: linux-2.6.24.7/drivers/sdio/hcd/Kconfig
71500 ===================================================================
71501 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
71502 +++ linux-2.6.24.7/drivers/sdio/hcd/Kconfig 2008-12-11 22:46:49.000000000 +0100
71503 @@ -0,0 +1,14 @@
71504 +config SDIO_S3C24XX
71505 + tristate "Samsung s3c24xx host controller"
71506 + depends on PLAT_S3C24XX && SDIO
71507 + default m
71508 + help
71509 + good luck.
71510 +
71511 +config SDIO_S3C24XX_DMA
71512 + bool "Samsung s3c24xx host controller DMA I/O"
71513 + depends on SDIO_S3C24XX
71514 + default n
71515 + help
71516 + good luck.
71517 +
71518 Index: linux-2.6.24.7/drivers/sdio/hcd/Makefile
71519 ===================================================================
71520 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
71521 +++ linux-2.6.24.7/drivers/sdio/hcd/Makefile 2008-12-11 22:46:49.000000000 +0100
71522 @@ -0,0 +1 @@
71523 +obj-$(CONFIG_PLAT_S3C24XX) += s3c24xx/
71524 Index: linux-2.6.24.7/drivers/sdio/hcd/s3c24xx/Makefile
71525 ===================================================================
71526 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
71527 +++ linux-2.6.24.7/drivers/sdio/hcd/s3c24xx/Makefile 2008-12-11 22:46:49.000000000 +0100
71528 @@ -0,0 +1,2 @@
71529 +obj-$(CONFIG_PLAT_S3C24XX) += sdio_s3c24xx_hcd.o
71530 +sdio_s3c24xx_hcd-objs := s3c24xx_hcd.o
71531 Index: linux-2.6.24.7/drivers/sdio/hcd/s3c24xx/s3c24xx_hcd.c
71532 ===================================================================
71533 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
71534 +++ linux-2.6.24.7/drivers/sdio/hcd/s3c24xx/s3c24xx_hcd.c 2008-12-11 22:46:49.000000000 +0100
71535 @@ -0,0 +1,1567 @@
71536 +/*
71537 + * s3c24xx_hcd.c - Samsung S3C MCI driver, Atheros SDIO API compatible.
71538 + *
71539 + * Copyright (C) 2007 by Openmoko, Inc.
71540 + * Written by Samuel Ortiz <sameo@openedhand.com>
71541 + * All Rights Reserved
71542 + *
71543 + * This program is free software; you can redistribute it and/or modify
71544 + * it under the terms of the GNU General Public License as published by
71545 + * the Free Software Foundation; either version 2 of the License, or
71546 + * (at your option) any later version.
71547 + *
71548 + * This program is distributed in the hope that it will be useful,
71549 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
71550 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
71551 + * GNU General Public License for more details.
71552 + *
71553 + * You should have received a copy of the GNU General Public License along
71554 + * with this program; if not, write to the Free Software Foundation, Inc.,
71555 + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
71556 + */
71557 +
71558 +#include <linux/kernel.h>
71559 +#include <linux/interrupt.h>
71560 +#include <linux/list.h>
71561 +#include <linux/dma-mapping.h>
71562 +#include <linux/errno.h>
71563 +#include <linux/platform_device.h>
71564 +#include <linux/device.h>
71565 +#include <linux/clk.h>
71566 +#include <linux/fs.h>
71567 +#include <linux/ioport.h>
71568 +#include <linux/workqueue.h>
71569 +#include <linux/completion.h>
71570 +#include <linux/delay.h>
71571 +#include <linux/seq_file.h>
71572 +#include <linux/debugfs.h>
71573 +
71574 +#include <linux/sdio/ctsystem.h>
71575 +#include <linux/sdio/sdio_busdriver.h>
71576 +#include <linux/sdio/sdio_lib.h>
71577 +
71578 +#include <asm/io.h>
71579 +#include <asm/irq.h>
71580 +#include <asm/uaccess.h>
71581 +#include <asm/dma.h>
71582 +#include <asm/dma-mapping.h>
71583 +
71584 +#include <asm/arch/regs-sdi.h>
71585 +#include <asm/arch/regs-gpio.h>
71586 +#include <asm/arch/mci.h>
71587 +#include <asm/arch/gta02.h>
71588 +
71589 +#include "s3c24xx_hcd.h"
71590 +
71591 +#define DESCRIPTION "S3c24xx SDIO host controller"
71592 +#define AUTHOR "Samuel Ortiz <sameo@openedhand.com>"
71593 +
71594 +#define RESSIZE(ressource) (((ressource)->end - (ressource)->start)+1)
71595 +
71596 +static struct s3c2410_dma_client s3c24xx_hcd_dma_client = {
71597 + .name = "s3c24xx_hcd",
71598 +};
71599 +
71600 +extern struct platform_device s3c_device_sdi;
71601 +
71602 +static void dump_request(struct s3c24xx_hcd_context * context)
71603 +{
71604 + if (context->hcd.pCurrentRequest != NULL) {
71605 + DBG_PRINT(SDDBG_ERROR, ("Current Request Command:%d, ARG:0x%8.8X flags: 0x%04x\n",
71606 + context->hcd.pCurrentRequest->Command, context->hcd.pCurrentRequest->Argument,
71607 + context->hcd.pCurrentRequest->Flags));
71608 + if (IS_SDREQ_DATA_TRANS(context->hcd.pCurrentRequest->Flags)) {
71609 + DBG_PRINT(SDDBG_ERROR, ("Data %s, Blocks: %d, BlockLen:%d Remaining: %d \n",
71610 + IS_SDREQ_WRITE_DATA(context->hcd.pCurrentRequest->Flags) ? "WRITE":"READ",
71611 + context->hcd.pCurrentRequest->BlockCount,
71612 + context->hcd.pCurrentRequest->BlockLen,
71613 + context->hcd.pCurrentRequest->DataRemaining));
71614 + }
71615 + }
71616 +}
71617 +
71618 +static void s3c24xx_dump_regs(struct s3c24xx_hcd_context * context)
71619 +{
71620 + u32 con, pre, cmdarg, cmdcon, cmdsta, r0, r1, r2, r3, timer, bsize;
71621 + u32 datcon, datcnt, datsta, fsta, imask;
71622 +
71623 + con = readl(context->base + S3C2410_SDICON);
71624 + pre = readl(context->base + S3C2410_SDIPRE);
71625 + cmdarg = readl(context->base + S3C2410_SDICMDARG);
71626 + cmdcon = readl(context->base + S3C2410_SDICMDCON);
71627 + cmdsta = readl(context->base + S3C2410_SDICMDSTAT);
71628 + r0 = readl(context->base + S3C2410_SDIRSP0);
71629 + r1 = readl(context->base + S3C2410_SDIRSP1);
71630 + r2 = readl(context->base + S3C2410_SDIRSP2);
71631 + r3 = readl(context->base + S3C2410_SDIRSP3);
71632 + timer = readl(context->base + S3C2410_SDITIMER);
71633 + bsize = readl(context->base + S3C2410_SDIBSIZE);
71634 + datcon = readl(context->base + S3C2410_SDIDCON);
71635 + datcnt = readl(context->base + S3C2410_SDIDCNT);
71636 + datsta = readl(context->base + S3C2410_SDIDSTA);
71637 + fsta = readl(context->base + S3C2410_SDIFSTA);
71638 + imask = readl(context->base + S3C2440_SDIIMSK);
71639 +
71640 + printk("SDICON: 0x%08x\n", con);
71641 + printk("SDIPRE: 0x%08x\n", pre);
71642 + printk("SDICmdArg: 0x%08x\n", cmdarg);
71643 + printk("SDICmdCon: 0x%08x\n", cmdcon);
71644 + printk("SDICmdSta: 0x%08x\n", cmdsta);
71645 + printk("SDIRSP0: 0x%08x\n", r0);
71646 + printk("SDIRSP1: 0x%08x\n", r1);
71647 + printk("SDIRSP2: 0x%08x\n", r2);
71648 + printk("SDIRSP3: 0x%08x\n", r3);
71649 + printk("SDIDTimer: 0x%08x\n", timer);
71650 + printk("SDIBSize: 0x%08x\n", bsize);
71651 + printk("SDIDatCon: 0x%08x\n", datcon);
71652 + printk("SDIDatCnt: 0x%08x\n", datcnt);
71653 + printk("SDIDatSta: 0x%08x\n", datsta);
71654 + printk("SDIFSta: 0x%08x\n", fsta);
71655 + printk("SDIIntMsk: 0x%08x\n", imask);
71656 +}
71657 +
71658 +static inline void s3c24xx_hcd_clear_imask(struct s3c24xx_hcd_context * context)
71659 +{
71660 + if (context->int_sdio) {
71661 + writel(S3C2410_SDIIMSK_SDIOIRQ | S3C2410_SDIIMSK_READWAIT,
71662 + context->base + S3C2440_SDIIMSK);
71663 + } else {
71664 + writel(0, context->base + S3C2440_SDIIMSK);
71665 + }
71666 +}
71667 +
71668 +static inline void s3c24xx_hcd_set_imask(struct s3c24xx_hcd_context * context)
71669 +{
71670 + writel(context->int_mask, context->base + S3C2440_SDIIMSK);
71671 +}
71672 +
71673 +
71674 +static inline void s3c24xx_hcd_clear_dsta(struct s3c24xx_hcd_context * context)
71675 +{
71676 + u32 dsta;
71677 +
71678 + dsta = readl(context->base + S3C2410_SDIDSTA);
71679 + writel(dsta, context->base + S3C2410_SDIDSTA);
71680 +}
71681 +
71682 +static inline void s3c24xx_hcd_clear_csta(struct s3c24xx_hcd_context * context)
71683 +{
71684 + u32 csta, csta_clear = 0;
71685 +
71686 + csta = readl(context->base + S3C2410_SDICMDSTAT);
71687 +
71688 + if (csta & S3C2410_SDICMDSTAT_CRCFAIL)
71689 + csta_clear |= S3C2410_SDICMDSTAT_CRCFAIL;
71690 + if (csta & S3C2410_SDICMDSTAT_CMDSENT)
71691 + csta_clear |= S3C2410_SDICMDSTAT_CMDSENT;
71692 + if (csta & S3C2410_SDICMDSTAT_CMDTIMEOUT)
71693 + csta_clear |= S3C2410_SDICMDSTAT_CMDTIMEOUT;
71694 + if (csta & S3C2410_SDICMDSTAT_RSPFIN)
71695 + csta_clear |= S3C2410_SDICMDSTAT_RSPFIN;
71696 +
71697 + writel(csta_clear, context->base + S3C2410_SDICMDSTAT);
71698 +}
71699 +
71700 +static inline void s3c24xx_hcd_clear_sta(struct s3c24xx_hcd_context * context)
71701 +{
71702 + u32 csta, dsta, csta_clear = 0, dsta_clear = 0;
71703 +
71704 + csta = readl(context->base + S3C2410_SDICMDSTAT);
71705 + dsta = readl(context->base + S3C2410_SDIDSTA);
71706 +
71707 + if (csta & S3C2410_SDICMDSTAT_CRCFAIL)
71708 + csta_clear |= S3C2410_SDICMDSTAT_CRCFAIL;
71709 + if (csta & S3C2410_SDICMDSTAT_CMDSENT)
71710 + csta_clear |= S3C2410_SDICMDSTAT_CMDSENT;
71711 + if (csta & S3C2410_SDICMDSTAT_CMDTIMEOUT)
71712 + csta_clear |= S3C2410_SDICMDSTAT_CMDTIMEOUT;
71713 + if (csta & S3C2410_SDICMDSTAT_RSPFIN)
71714 + csta_clear |= S3C2410_SDICMDSTAT_RSPFIN;
71715 +
71716 +
71717 + if (dsta & S3C2410_SDIDSTA_RDYWAITREQ)
71718 + dsta_clear |= S3C2410_SDIDSTA_RDYWAITREQ;
71719 + if (dsta & S3C2410_SDIDSTA_SDIOIRQDETECT)
71720 + dsta_clear |= S3C2410_SDIDSTA_SDIOIRQDETECT;
71721 + if (dsta & S3C2410_SDIDSTA_FIFOFAIL)
71722 + dsta_clear |= S3C2410_SDIDSTA_FIFOFAIL;
71723 + if (dsta & S3C2410_SDIDSTA_CRCFAIL)
71724 + dsta_clear |= S3C2410_SDIDSTA_CRCFAIL;
71725 + if (dsta & S3C2410_SDIDSTA_RXCRCFAIL)
71726 + dsta_clear |= S3C2410_SDIDSTA_RXCRCFAIL;
71727 + if (dsta & S3C2410_SDIDSTA_DATATIMEOUT)
71728 + dsta_clear |= S3C2410_SDIDSTA_DATATIMEOUT;
71729 + if (dsta & S3C2410_SDIDSTA_XFERFINISH)
71730 + dsta_clear |= S3C2410_SDIDSTA_XFERFINISH;
71731 + if (dsta & S3C2410_SDIDSTA_BUSYFINISH)
71732 + dsta_clear |= S3C2410_SDIDSTA_BUSYFINISH;
71733 + if (dsta & S3C2410_SDIDSTA_SBITERR)
71734 + dsta_clear |= S3C2410_SDIDSTA_SBITERR;
71735 +
71736 + writel(csta_clear, context->base + S3C2410_SDICMDSTAT);
71737 + writel(dsta_clear, context->base + S3C2410_SDIDSTA);
71738 +}
71739 +
71740 +static inline void s3c24xx_hcd_fifo_reset(struct s3c24xx_hcd_context * context)
71741 +{
71742 + u32 fsta;
71743 +
71744 + fsta = readl(context->base + S3C2410_SDIFSTA);
71745 + fsta |= S3C2440_SDIFSTA_FIFORESET;
71746 + writel(fsta, context->base + S3C2410_SDIFSTA);
71747 +}
71748 +
71749 +#if 0
71750 +static void s3c24xx_hcd_reset(struct s3c24xx_hcd_context * context)
71751 +{
71752 + u32 con, counter;
71753 + unsigned long flags;
71754 +
71755 + spin_lock_irqsave(&context->lock, flags);
71756 +
71757 + con = readl(context->base + S3C2410_SDICON);
71758 +
71759 + con |= S3C2440_SDICON_SDRESET;
71760 +
71761 + writel(con, context->base + S3C2410_SDICON);
71762 +
71763 + counter = 1000;
71764 + while(counter) {
71765 + con = readl(context->base + S3C2410_SDICON);
71766 + if (!(con & S3C2440_SDICON_SDRESET))
71767 + break;
71768 + counter--;
71769 + mdelay(1);
71770 + }
71771 +
71772 + spin_unlock_irqrestore(&context->lock, flags);
71773 +}
71774 +#endif
71775 +
71776 +static SDIO_STATUS s3c24xx_hcd_clock_enable(struct s3c24xx_hcd_context * context,
71777 + unsigned int clock_rate,
71778 + unsigned char enable)
71779 +{
71780 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
71781 + unsigned long flags;
71782 + u32 con;
71783 +
71784 + spin_lock_irqsave(&context->lock, flags);
71785 +
71786 + con = readl(context->base + S3C2410_SDICON);
71787 +
71788 + if (enable && clock_rate) {
71789 + con |= S3C2410_SDICON_CLOCKTYPE;
71790 + } else {
71791 + con &= ~S3C2410_SDICON_CLOCKTYPE;
71792 + }
71793 +
71794 + if (clock_rate) {
71795 + int prescaler;
71796 +
71797 + for (prescaler = 0; prescaler < 0xff; prescaler++) {
71798 + context->device.actual_clock_rate =
71799 + context->device.max_clock_rate / (prescaler + 1);
71800 +
71801 + if (context->device.actual_clock_rate <= clock_rate &&
71802 + context->device.actual_clock_rate <= context->hcd.MaxClockRate)
71803 + break;
71804 + }
71805 +
71806 + if (prescaler == 0xff)
71807 + DBG_PRINT(SDDBG_ERROR , ("Using lowest clock rate\n"));
71808 +
71809 + writel(prescaler, context->base + S3C2410_SDIPRE);
71810 + }
71811 +
71812 + writel(con, context->base + S3C2410_SDICON);
71813 +
71814 + spin_unlock_irqrestore(&context->lock, flags);
71815 +
71816 + return SDIOErrorToOSError(status);
71817 +}
71818 +
71819 +static void s3c24xx_hcd_set_bus_mode(struct s3c24xx_hcd_context *context,
71820 + PSDCONFIG_BUS_MODE_DATA pMode)
71821 +{
71822 + u32 datacon;
71823 + unsigned long flags;
71824 +
71825 + DBG_PRINT(SDDBG_TRACE , ("SetBusMode\n"));
71826 +
71827 + spin_lock_irqsave(&context->lock, flags);
71828 + datacon = readl(context->base + S3C2410_SDIDCON);
71829 +
71830 + switch (SDCONFIG_GET_BUSWIDTH(pMode->BusModeFlags)) {
71831 + case SDCONFIG_BUS_WIDTH_1_BIT:
71832 + context->bus_width = 1;
71833 + datacon &= S3C2410_SDIDCON_WIDEBUS;
71834 + break;
71835 + case SDCONFIG_BUS_WIDTH_4_BIT:
71836 + context->bus_width = 4;
71837 + datacon |= S3C2410_SDIDCON_WIDEBUS;
71838 + break;
71839 + default:
71840 + DBG_PRINT(SDDBG_TRACE , ("Unknown bus width: %d\n", SDCONFIG_GET_BUSWIDTH(pMode->BusModeFlags)));
71841 + break;
71842 + }
71843 +
71844 + writel(datacon, context->base + S3C2410_SDIDCON);
71845 + spin_unlock_irqrestore(&context->lock, flags);
71846 +
71847 + /* Set clock rate and enable clock */
71848 + s3c24xx_hcd_clock_enable(context, pMode->ClockRate, 1);
71849 + pMode->ActualClockRate = context->device.actual_clock_rate;
71850 +
71851 + DBG_PRINT(SDDBG_TRACE , ("BUS mode: %d bits wide, actual clock rate: %d kHz (requested %d kHz)\n",
71852 + context->bus_width, pMode->ActualClockRate / 1000, pMode->ClockRate / 1000));
71853 +}
71854 +
71855 +
71856 +static void s3c24xx_hcd_dma_complete(struct s3c24xx_hcd_context * context)
71857 +{
71858 + u32 dsta, counter, i;
71859 + PSDREQUEST req;
71860 + SDIO_STATUS status = SDIO_STATUS_ERROR;
71861 +
71862 + req = GET_CURRENT_REQUEST(&context->hcd);
71863 + if (req == NULL) {
71864 + DBG_PRINT(SDDBG_ERROR, ("%s(): No current request\n", __FUNCTION__));
71865 + return;
71866 + }
71867 +
71868 + if (context->complete == S3C24XX_HCD_DATA_READ) {
71869 + /* DMA READ completion */
71870 + if (context->latest_xfer_size != req->DataRemaining) {
71871 + DBG_PRINT(SDDBG_ERROR, ("Unexpected read xfer size: %d <-> %d\n",
71872 + context->latest_xfer_size, req->DataRemaining));
71873 + status = SDIO_STATUS_BUS_WRITE_ERROR;
71874 + }
71875 +
71876 + counter = 0;
71877 + dsta = readl(context->base + S3C2410_SDIDSTA);
71878 + while (!(dsta & S3C2410_SDIDSTA_XFERFINISH)) {
71879 + if (counter > 500) {
71880 + printk("read xfer timed out\n");
71881 + s3c24xx_dump_regs(context);
71882 + memcpy(req->pDataBuffer, context->io_buffer,
71883 + req->BlockCount * req->BlockLen);
71884 + printk("Transfer: %dx%d\n", req->BlockCount, req->BlockLen);
71885 + for (i = 0; i < req->DataRemaining; i++)
71886 + printk("0x%x ", *(((char *)context->io_buffer) + i));
71887 + printk("\n");
71888 + status = SDIO_STATUS_BUS_READ_TIMEOUT;
71889 + goto out;
71890 + }
71891 + dsta = readl(context->base + S3C2410_SDIDSTA);
71892 + counter++;
71893 + mdelay(1);
71894 + };
71895 +
71896 + dma_sync_single(NULL, context->io_buffer_dma,
71897 + req->BlockCount * req->BlockLen, DMA_BIDIRECTIONAL);
71898 +
71899 + writel(S3C2410_SDIDSTA_XFERFINISH, context->base + S3C2410_SDIDSTA);
71900 +
71901 + memcpy(req->pDataBuffer, context->io_buffer,
71902 + req->BlockCount * req->BlockLen);
71903 +
71904 + req->DataRemaining = 0;
71905 + status = SDIO_STATUS_SUCCESS;
71906 +
71907 + } else if (context->complete == S3C24XX_HCD_DATA_WRITE) {
71908 + /* DMA WRITE completion */
71909 + if (context->latest_xfer_size != req->DataRemaining) {
71910 + DBG_PRINT(SDDBG_ERROR, ("Unexpected write xfer size: %d <-> %d\n",
71911 + context->latest_xfer_size, req->DataRemaining));
71912 + status = SDIO_STATUS_BUS_WRITE_ERROR;
71913 + }
71914 +
71915 + dsta = readl(context->base + S3C2410_SDIDSTA);
71916 + counter = 0;
71917 + while (!(dsta & S3C2410_SDIDSTA_XFERFINISH)) {
71918 + if (counter > 500) {
71919 + printk("write xfer timed out\n");
71920 + status = SDIO_STATUS_BUS_WRITE_ERROR;
71921 + goto out;
71922 + }
71923 + dsta = readl(context->base + S3C2410_SDIDSTA);
71924 + counter++;
71925 + mdelay(1);
71926 + };
71927 +
71928 + writel(S3C2410_SDIDSTA_XFERFINISH, context->base + S3C2410_SDIDSTA);
71929 + req->DataRemaining = 0;
71930 + status = SDIO_STATUS_SUCCESS;
71931 + }
71932 +
71933 + out:
71934 + req->Status = status;
71935 +}
71936 +
71937 +static void s3c24xx_hcd_pio_complete(struct s3c24xx_hcd_context * context)
71938 +{
71939 + u32 fsta, counter;
71940 + u8 *ptr;
71941 + int fifo_count;
71942 + PSDREQUEST req;
71943 + SDIO_STATUS status = SDIO_STATUS_ERROR;
71944 +
71945 + req = GET_CURRENT_REQUEST(&context->hcd);
71946 + if (req == NULL) {
71947 + DBG_PRINT(SDDBG_ERROR, ("%s(): No current request\n", __FUNCTION__));
71948 + return;
71949 + }
71950 +
71951 + ptr = req->pDataBuffer;
71952 +
71953 + if (context->complete == S3C24XX_HCD_DATA_READ) {
71954 + counter = 0;
71955 + DBG_PRINT(SDDBG_TRACE, ("Data read..."));
71956 + do {
71957 + counter++;
71958 + fsta = readl(context->base + S3C2410_SDIFSTA);
71959 + mdelay(1);
71960 + if (counter > 1000) {
71961 + DBG_PRINT(SDDBG_ERROR, ("DATA read timeout\n"));
71962 + status = SDIO_STATUS_BUS_READ_TIMEOUT;
71963 + s3c24xx_dump_regs(context);
71964 + goto out;
71965 + }
71966 + } while(!(fsta & S3C2410_SDIFSTA_RFDET));
71967 + DBG_PRINT(SDDBG_TRACE, ("RX detected\n"));
71968 +
71969 + while (1) {
71970 + counter = 0;
71971 + fifo_count = (readl(context->base + S3C2410_SDIFSTA) & S3C2410_SDIFSTA_COUNTMASK);
71972 + while (!fifo_count) {
71973 + counter++;
71974 + mdelay(1);
71975 + if (counter > 500) {
71976 + s3c24xx_dump_regs(context);
71977 + DBG_PRINT(SDDBG_ERROR, ("No more bytes in FIFO\n"));
71978 + goto out;
71979 + }
71980 + fifo_count = (readl(context->base + S3C2410_SDIFSTA) & S3C2410_SDIFSTA_COUNTMASK);
71981 + }
71982 +
71983 + if (fifo_count > req->DataRemaining) {
71984 + DBG_PRINT(SDDBG_ERROR, ("DATA read, fifo_count %d > expected %d\n", fifo_count, req->DataRemaining));
71985 + fifo_count = req->DataRemaining;
71986 + }
71987 +
71988 + req->DataRemaining -= fifo_count;
71989 + while (fifo_count > 0) {
71990 + if (context->data_size == 4)
71991 + *(ptr) = readl(context->base + S3C2440_SDIDATA);
71992 + else if (context->data_size == 2)
71993 + *(ptr) = readw(context->base + S3C2440_SDIDATA);
71994 + else
71995 + *(ptr) = readb(context->base + S3C2440_SDIDATA);
71996 +
71997 + ptr += context->data_size;
71998 + fifo_count -= context->data_size;
71999 +
72000 + }
72001 +
72002 + if (!req->DataRemaining) {
72003 + /* We poll for xfer finish */
72004 + counter = 0;
72005 + while (!(readl(context->base + S3C2410_SDIDSTA)
72006 + & S3C2410_SDIDSTA_XFERFINISH)) {
72007 + counter++;
72008 + mdelay(1);
72009 + if (counter > 500) {
72010 + DBG_PRINT(SDDBG_ERROR, ("RX XFERFINISH missing\n"));
72011 + s3c24xx_dump_regs(context);
72012 + break;
72013 + }
72014 + }
72015 +
72016 + status = SDIO_STATUS_SUCCESS;
72017 + goto out;
72018 + }
72019 + }
72020 +
72021 + } else if (context->complete == S3C24XX_HCD_DATA_WRITE) {
72022 + counter = 0;
72023 + DBG_PRINT(SDDBG_TRACE, ("Data write..."));
72024 + do {
72025 + counter++;
72026 + fsta = readl(context->base + S3C2410_SDIFSTA);
72027 + mdelay(1);
72028 + if (counter > 1000) {
72029 + DBG_PRINT(SDDBG_ERROR, ("DATA write timeout\n"));
72030 + status = SDIO_STATUS_BUS_WRITE_ERROR;
72031 + goto out;
72032 + break;
72033 + }
72034 +
72035 + } while(!(fsta & S3C2410_SDIFSTA_TFDET));
72036 + DBG_PRINT(SDDBG_TRACE, ("TX detected\n"));
72037 +
72038 + while (1) {
72039 + counter = 0;
72040 + fifo_count = 63 - (readl(context->base + S3C2410_SDIFSTA) & S3C2410_SDIFSTA_COUNTMASK);
72041 + while (!fifo_count) {
72042 + counter++;
72043 + mdelay(1);
72044 + if (counter > 500) {
72045 + s3c24xx_dump_regs(context);
72046 + DBG_PRINT(SDDBG_ERROR, ("No more space in FIFO\n"));
72047 + goto out;
72048 + }
72049 + fifo_count = 63 - (readl(context->base + S3C2410_SDIFSTA) & S3C2410_SDIFSTA_COUNTMASK);
72050 + }
72051 +
72052 + if (fifo_count > req->DataRemaining)
72053 + fifo_count = req->DataRemaining;
72054 +
72055 + req->DataRemaining -= fifo_count;
72056 +
72057 + while (fifo_count > 0) {
72058 + if (context->data_size == 4)
72059 + writel(*(ptr), context->base + S3C2440_SDIDATA);
72060 + else if (context->data_size == 2)
72061 + writew(*(ptr), context->base + S3C2440_SDIDATA);
72062 + else
72063 + writeb(*(ptr), context->base + S3C2440_SDIDATA);
72064 +
72065 + ptr += context->data_size;
72066 + fifo_count -= context->data_size;
72067 + }
72068 +
72069 + if (!req->DataRemaining) {
72070 + /* We poll for xfer finish */
72071 + counter = 0;
72072 + while (!(readl(context->base + S3C2410_SDIDSTA)
72073 + & S3C2410_SDIDSTA_XFERFINISH)) {
72074 + counter++;
72075 + mdelay(1);
72076 + if (counter > 500) {
72077 + DBG_PRINT(SDDBG_ERROR, ("RX XFERFINISH missing\n"));
72078 + s3c24xx_dump_regs(context);
72079 + break;
72080 + }
72081 + }
72082 +
72083 + status = SDIO_STATUS_SUCCESS;
72084 + goto out;
72085 + }
72086 + }
72087 +
72088 + } else {
72089 + DBG_PRINT(SDDBG_ERROR, ("Wrong context: %d\n", context->complete));
72090 + }
72091 +
72092 + out:
72093 + req->Status = status;
72094 +}
72095 +
72096 +static void s3c24xx_hcd_io_work(struct work_struct *work)
72097 +{
72098 + PSDREQUEST req;
72099 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
72100 + struct s3c24xx_hcd_context * context =
72101 + container_of(work, struct s3c24xx_hcd_context, io_work);
72102 +
72103 + req = GET_CURRENT_REQUEST(&context->hcd);
72104 + if (req == NULL) {
72105 + DBG_PRINT(SDDBG_ERROR, ("%s(): No current request\n", __FUNCTION__));
72106 + return;
72107 + }
72108 +
72109 + if (req->Status == SDIO_STATUS_BUS_RESP_TIMEOUT) {
72110 + DBG_PRINT(SDDBG_ERROR, ("### TIMEOUT ###\n"));
72111 + s3c24xx_dump_regs(context);
72112 + goto out;
72113 + }
72114 +
72115 + if (context->complete == S3C24XX_HCD_NO_RESPONSE &&
72116 + req->Status == SDIO_STATUS_SUCCESS) {
72117 + DBG_PRINT(SDDBG_TRACE, ("CMD done, Status: %d\n", req->Status));
72118 + printk("CMD done, Status: %d\n", req->Status);
72119 + goto out;
72120 + }
72121 +
72122 + if ((context->complete == S3C24XX_HCD_RESPONSE_SHORT ||
72123 + context->complete == S3C24XX_HCD_RESPONSE_LONG ||
72124 + context->complete == S3C24XX_HCD_DATA_READ ||
72125 + context->complete == S3C24XX_HCD_DATA_WRITE) &&
72126 + req->Status == SDIO_STATUS_SUCCESS) {
72127 + u32 resp[4];
72128 +
72129 + /* We need to copy the response data and send it over */
72130 + resp[0] = readl(context->base + S3C2410_SDIRSP0);
72131 + resp[1] = readl(context->base + S3C2410_SDIRSP1);
72132 + resp[2] = readl(context->base + S3C2410_SDIRSP2);
72133 + resp[3] = readl(context->base + S3C2410_SDIRSP3);
72134 +
72135 + if (GET_SDREQ_RESP_TYPE(req->Flags) != SDREQ_FLAGS_RESP_R2) {
72136 + DBG_PRINT(SDDBG_TRACE, ("SHORT response: 0x%08x\n", resp[0]));
72137 + memcpy(&req->Response[1], (u8*)resp, 4);
72138 + req->Response[5] = (readl(context->base + S3C2410_SDICMDSTAT) & 0xff);
72139 + } else {
72140 + printk("LONG response: 0x%08x\n", resp[0]);
72141 + DBG_PRINT(SDDBG_TRACE, ("LONG response: 0x%08x\n", resp[0]));
72142 + memcpy(&req->Response[1], (u8*)resp, 16);
72143 + //req->Response[17] = (readl(context->base + S3C2410_SDICMDSTAT) & 0xff);
72144 + }
72145 +
72146 + /* There is a data stage */
72147 + if (context->complete == S3C24XX_HCD_DATA_READ ||
72148 + context->complete == S3C24XX_HCD_DATA_WRITE) {
72149 + status = SDIO_CheckResponse(&context->hcd, req,
72150 + SDHCD_CHECK_DATA_TRANS_OK);
72151 +
72152 + if (!SDIO_SUCCESS(status)) {
72153 + DBG_PRINT(SDDBG_ERROR,
72154 + ("Target not ready for data xfer\n"));
72155 + return;
72156 + }
72157 +
72158 + if (context->dma_en) {
72159 + dma_sync_single(NULL, context->io_buffer_dma,
72160 + req->BlockCount * req->BlockLen, DMA_BIDIRECTIONAL);
72161 +
72162 + s3c2410_dma_ctrl(context->dma_channel, S3C2410_DMAOP_START);
72163 +
72164 + wait_for_completion(&context->dma_complete);
72165 +
72166 + s3c24xx_hcd_dma_complete(context);
72167 + } else {
72168 + s3c24xx_hcd_pio_complete(context);
72169 + }
72170 + }
72171 + }
72172 +
72173 + out:
72174 + s3c24xx_hcd_clear_sta(context);
72175 + s3c24xx_hcd_clear_imask(context);
72176 +
72177 + writel(0, context->base + S3C2410_SDICMDARG);
72178 + writel(0, context->base + S3C2410_SDICMDCON);
72179 +
72180 + SDIO_HandleHcdEvent(&context->hcd, EVENT_HCD_TRANSFER_DONE);
72181 +}
72182 +
72183 +static void s3c24xx_hcd_irq_work(struct work_struct *work)
72184 +{
72185 + struct s3c24xx_hcd_context * context =
72186 + container_of(work, struct s3c24xx_hcd_context, irq_work);
72187 +
72188 + disable_irq(context->io_irq);
72189 +
72190 + writel(S3C2410_SDIDSTA_SDIOIRQDETECT, context->base + S3C2410_SDIDSTA);
72191 +
72192 + SDIO_HandleHcdEvent(&context->hcd, EVENT_HCD_SDIO_IRQ_PENDING);
72193 +
72194 + enable_irq(context->io_irq);
72195 +}
72196 +
72197 +void s3c24xx_hcd_dma_done(struct s3c2410_dma_chan *dma_ch, void *buf_id,
72198 + int size, enum s3c2410_dma_buffresult result)
72199 +{
72200 + struct s3c24xx_hcd_context * context =
72201 + (struct s3c24xx_hcd_context *) buf_id;
72202 +
72203 + if (result != S3C2410_RES_OK) {
72204 + DBG_PRINT(SDDBG_ERROR, ("%s(): DMA xfer failed: %d\n", __FUNCTION__, result));
72205 + s3c24xx_dump_regs(context);
72206 + }
72207 +
72208 + context->latest_xfer_size = size;
72209 + complete(&context->dma_complete);
72210 +}
72211 +
72212 +static int s3c24xx_hcd_prepare_dma(struct s3c24xx_hcd_context * context)
72213 +{
72214 + PSDREQUEST req;
72215 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
72216 + int read = 0, hwcfg = S3C2410_DISRCC_INC | S3C2410_DISRCC_APB;
72217 + enum s3c2410_dmasrc source = S3C2410_DMASRC_MEM;
72218 +
72219 + req = GET_CURRENT_REQUEST(&context->hcd);
72220 + if (req == NULL) {
72221 + DBG_PRINT(SDDBG_ERROR, ("%s(): No current request\n", __FUNCTION__));
72222 + status = SDIO_STATUS_ERROR;
72223 + }
72224 +
72225 + if (!context->dma_en) {
72226 + DBG_PRINT(SDDBG_ERROR, ("%s(): DMA is disabled\n", __FUNCTION__));
72227 + status = SDIO_STATUS_ERROR;
72228 + }
72229 +
72230 + if (!IS_SDREQ_DATA_TRANS(req->Flags)) {
72231 + DBG_PRINT(SDDBG_ERROR, ("%s(): No data to transfer\n", __FUNCTION__));
72232 + status = SDIO_STATUS_ERROR;
72233 + }
72234 +
72235 + if(!IS_SDREQ_WRITE_DATA(req->Flags)) {
72236 + read = 1;
72237 + source = S3C2410_DMASRC_HW;
72238 + hwcfg = S3C2410_DISRCC_APB | 1;
72239 + } else {
72240 + memcpy(context->io_buffer, req->pDataBuffer, req->DataRemaining);
72241 + dma_sync_single(NULL, context->io_buffer_dma,
72242 + req->BlockCount * req->BlockLen, DMA_BIDIRECTIONAL);
72243 +
72244 + }
72245 +
72246 + s3c2410_dma_devconfig(context->dma_channel, source, hwcfg,
72247 + (unsigned long)context->mem->start + S3C2440_SDIDATA);
72248 +
72249 + s3c2410_dma_config(context->dma_channel, context->data_size,
72250 + S3C2410_DCON_CH0_SDI);
72251 + //(S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI));
72252 +
72253 + s3c2410_dma_set_buffdone_fn(context->dma_channel, s3c24xx_hcd_dma_done);
72254 +
72255 +// s3c2410_dma_setflags(context->dma_channel, S3C2410_DMAF_AUTOSTART);
72256 +
72257 + s3c2410_dma_ctrl(context->dma_channel, S3C2410_DMAOP_FLUSH);
72258 +
72259 + s3c2410_dma_enqueue(context->dma_channel, context,
72260 + context->io_buffer_dma,
72261 + req->DataRemaining);
72262 +
72263 + return 0;
72264 +}
72265 +
72266 +
72267 +static irqreturn_t s3c24xx_hcd_irq(int irq, void *dev_id)
72268 +{
72269 + u32 cmdsta, dsta, fsta;
72270 + unsigned long flags, trace = 0;
72271 + PSDREQUEST req;
72272 + struct s3c24xx_hcd_context * context =
72273 + (struct s3c24xx_hcd_context *)dev_id;
72274 +
72275 + spin_lock_irqsave(&context->lock, flags);
72276 +
72277 + s3c24xx_hcd_clear_imask(context);
72278 +
72279 + cmdsta = readl(context->base + S3C2410_SDICMDSTAT);
72280 + dsta = readl(context->base + S3C2410_SDIDSTA);
72281 + fsta = readl(context->base + S3C2410_SDIFSTA);
72282 +
72283 + context->cmdsta = cmdsta;
72284 + context->dsta = dsta;
72285 + context->fsta = fsta;
72286 +
72287 + s3c24xx_hcd_clear_csta(context);
72288 +
72289 + if (dsta & S3C2410_SDIDSTA_SDIOIRQDETECT) {
72290 + writel(S3C2410_SDIDSTA_SDIOIRQDETECT, context->base + S3C2410_SDIDSTA);
72291 +
72292 + if (context->int_sdio) {
72293 + u32 imask;
72294 +
72295 + context->int_sdio = 0;
72296 +
72297 + imask = readl(context->base + S3C2440_SDIIMSK);
72298 + imask &= ~S3C2410_SDIIMSK_SDIOIRQ;
72299 + writel(imask, context->base + S3C2440_SDIIMSK);
72300 + schedule_work(&context->irq_work);
72301 + }
72302 + }
72303 +
72304 + req = GET_CURRENT_REQUEST(&context->hcd);
72305 + if (req == NULL) {
72306 + DBG_PRINT(SDDBG_TRACE, ("%s(): No current request\n", __FUNCTION__));
72307 + goto out;
72308 + }
72309 +
72310 + if (cmdsta & S3C2410_SDICMDSTAT_CMDTIMEOUT) {
72311 + DBG_PRINT(SDDBG_ERROR, ("TIMEOUT\n"));
72312 + printk("TIMEOUT\n");
72313 + req->Status = SDIO_STATUS_BUS_RESP_TIMEOUT;
72314 + writel(S3C2410_SDICMDSTAT_CMDTIMEOUT, context->base + S3C2410_SDICMDSTAT);
72315 + schedule_work(&context->io_work);
72316 + }
72317 +
72318 + if (cmdsta & S3C2410_SDICMDSTAT_CRCFAIL) {
72319 + DBG_PRINT(SDDBG_ERROR, ("CRCFAIL 0x%x\n", cmdsta));
72320 + printk("CRCFAIL 0x%x\n", cmdsta);
72321 + req->Status = SDIO_STATUS_BUS_RESP_CRC_ERR;
72322 + dump_request(context);
72323 + writel(S3C2410_SDICMDSTAT_CRCFAIL, context->base + S3C2410_SDICMDSTAT);
72324 + schedule_work(&context->io_work);
72325 + }
72326 +
72327 +
72328 + if (cmdsta & S3C2410_SDICMDSTAT_CMDSENT) {
72329 + writel(S3C2410_SDICMDSTAT_CMDSENT, context->base + S3C2410_SDICMDSTAT);
72330 +
72331 + if (context->complete == S3C24XX_HCD_NO_RESPONSE) {
72332 + req->Status = SDIO_STATUS_SUCCESS;
72333 + trace = 1;
72334 + schedule_work(&context->io_work);
72335 + }
72336 + }
72337 +
72338 + if (cmdsta & S3C2410_SDICMDSTAT_RSPFIN ||
72339 + (IS_SDREQ_WRITE_DATA(req->Flags) && (fsta & S3C2410_SDIFSTA_TFDET)) ||
72340 + (!IS_SDREQ_WRITE_DATA(req->Flags) && (fsta & S3C2410_SDIFSTA_RFDET))) {
72341 +
72342 + writel(S3C2410_SDICMDSTAT_RSPFIN, context->base + S3C2410_SDICMDSTAT);
72343 +
72344 + if (context->complete == S3C24XX_HCD_RESPONSE_SHORT ||
72345 + context->complete == S3C24XX_HCD_RESPONSE_LONG ||
72346 + context->complete == S3C24XX_HCD_DATA_READ ||
72347 + context->complete == S3C24XX_HCD_DATA_WRITE) {
72348 + req->Status = SDIO_STATUS_SUCCESS;
72349 + if (trace)
72350 + printk("IO work already scheduled, cmdsta: 0x%x\n", cmdsta);
72351 + schedule_work(&context->io_work);
72352 + }
72353 + }
72354 +
72355 + out:
72356 + if (dsta & S3C2410_SDIDSTA_RDYWAITREQ) {
72357 + printk("S3C2410_SDIDSTA_RDYWAITREQ\n");
72358 + //writel(S3C2410_SDIDSTA_RDYWAITREQ, context->base + S3C2410_SDIDSTA);
72359 + }
72360 +
72361 + if (dsta & S3C2410_SDIDSTA_FIFOFAIL) {
72362 + printk("S3C2410_SDIDSTA_FIFOFAIL\n");
72363 + writel(S3C2410_SDIDSTA_FIFOFAIL, context->base + S3C2410_SDIDSTA);
72364 + }
72365 +
72366 + if (dsta & S3C2410_SDIDSTA_CRCFAIL) {
72367 + printk("S3C2410_SDIDSTA_CRCFAIL\n");
72368 + writel(S3C2410_SDIDSTA_CRCFAIL, context->base + S3C2410_SDIDSTA);
72369 + }
72370 +
72371 + if (dsta & S3C2410_SDIDSTA_RXCRCFAIL) {
72372 + printk("S3C2410_SDIDSTA_RXCRCFAIL\n");
72373 + writel(S3C2410_SDIDSTA_RXCRCFAIL, context->base + S3C2410_SDIDSTA);
72374 + }
72375 +
72376 + if (dsta & S3C2410_SDIDSTA_DATATIMEOUT) {
72377 + printk("S3C2410_SDIDSTA_DATATIMEOUT\n");
72378 + writel(S3C2410_SDIDSTA_DATATIMEOUT, context->base + S3C2410_SDIDSTA);
72379 + }
72380 +
72381 + if (dsta & S3C2410_SDIDSTA_BUSYFINISH) {
72382 + printk("S3C2410_SDIDSTA_BUSYFINISH\n");
72383 + writel(S3C2410_SDIDSTA_BUSYFINISH, context->base + S3C2410_SDIDSTA);
72384 + }
72385 +
72386 + if (dsta & S3C2410_SDIDSTA_SBITERR) {
72387 + printk("S3C2410_SDIDSTA_SBIERR\n");
72388 + writel(S3C2410_SDIDSTA_SBITERR, context->base + S3C2410_SDIDSTA);
72389 + }
72390 +
72391 + spin_unlock_irqrestore(&context->lock, flags);
72392 + return IRQ_HANDLED;
72393 +}
72394 +
72395 +
72396 +SDIO_STATUS s3c24xx_hcd_config(PSDHCD hcd, PSDCONFIG config)
72397 +{
72398 + u32 con, imsk;
72399 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
72400 + PSDCONFIG_SDIO_INT_CTRL_DATA int_data;
72401 + struct s3c24xx_hcd_context * context = (struct s3c24xx_hcd_context *)hcd->pContext;
72402 +
72403 + switch (GET_SDCONFIG_CMD(config)){
72404 + case SDCONFIG_GET_WP:
72405 + DBG_PRINT(SDDBG_TRACE, ("config GET_WP\n"));
72406 + *((SDCONFIG_WP_VALUE *)config->pData) = 0;
72407 + status = SDIO_STATUS_SUCCESS;
72408 + break;
72409 + case SDCONFIG_SEND_INIT_CLOCKS:
72410 + DBG_PRINT(SDDBG_TRACE, ("config SEND_INIT_CLOCKS\n"));
72411 +
72412 + /* We stop/start the clock */
72413 + con = readl(context->base + S3C2410_SDICON);
72414 +
72415 + con &= ~S3C2410_SDICON_CLOCKTYPE;
72416 + writel(con, context->base + S3C2410_SDICON);
72417 +
72418 + mdelay(100);
72419 +
72420 + con |= S3C2410_SDICON_CLOCKTYPE;
72421 + writel(con, context->base + S3C2410_SDICON);
72422 +
72423 + mdelay(100);
72424 +
72425 + status = SDIO_STATUS_SUCCESS;
72426 + break;
72427 + case SDCONFIG_SDIO_INT_CTRL:
72428 + DBG_PRINT(SDDBG_TRACE, ("config SDIO_INT_CTRL\n"));
72429 + int_data = GET_SDCONFIG_CMD_DATA(PSDCONFIG_SDIO_INT_CTRL_DATA, config);
72430 +
72431 + if (int_data->SlotIRQEnable &
72432 + (IRQ_DETECT_1_BIT | IRQ_DETECT_4_BIT | IRQ_DETECT_MULTI_BLK) ) {
72433 + imsk = readl(context->base + S3C2440_SDIIMSK);
72434 +
72435 + if (int_data->SlotIRQEnable) {
72436 + printk("SDIO_INT_CTRL enable IRQ\n");
72437 + DBG_PRINT(SDDBG_TRACE, ("SDIO_INT_CTRL enable IRQ\n"));
72438 + context->int_sdio = 1;
72439 + imsk |= S3C2410_SDIIMSK_SDIOIRQ;
72440 + writel(imsk, context->base + S3C2440_SDIIMSK);
72441 + } else {
72442 + printk("SDIO_INT_CTRL disable IRQ\n");
72443 + DBG_PRINT(SDDBG_TRACE, ("SDIO_INT_CTRL disable IRQ\n"));
72444 + context->int_sdio = 0;
72445 + imsk &= ~S3C2410_SDIIMSK_SDIOIRQ;
72446 + writel(imsk, context->base + S3C2440_SDIIMSK);
72447 + }
72448 + }
72449 + status = SDIO_STATUS_SUCCESS;
72450 + break;
72451 + case SDCONFIG_SDIO_REARM_INT:
72452 + DBG_PRINT(SDDBG_TRACE, ("config SDIO_REARM_INT\n"));
72453 +
72454 + context->int_sdio = 1;
72455 + imsk = readl(context->base + S3C2440_SDIIMSK);
72456 + imsk |= S3C2410_SDIIMSK_SDIOIRQ;
72457 + writel(imsk, context->base + S3C2440_SDIIMSK);
72458 +
72459 + status = SDIO_STATUS_SUCCESS;
72460 + break;
72461 + case SDCONFIG_FUNC_CHANGE_BUS_MODE:
72462 + case SDCONFIG_BUS_MODE_CTRL:
72463 + s3c24xx_hcd_set_bus_mode(context, (PSDCONFIG_BUS_MODE_DATA)(config->pData));
72464 + DBG_PRINT(SDDBG_TRACE, ("config BUS_MODE_CTRL\n"));
72465 + status = SDIO_STATUS_SUCCESS;
72466 + break;
72467 + case SDCONFIG_POWER_CTRL:
72468 + DBG_PRINT(SDDBG_TRACE, ("config POWER_CTRL\n"));
72469 + status = SDIO_STATUS_SUCCESS;
72470 + break;
72471 + case SDCONFIG_GET_HCD_DEBUG:
72472 + DBG_PRINT(SDDBG_TRACE, ("config GET_HCD_DEBUG\n"));
72473 + status = SDIO_STATUS_SUCCESS;
72474 + break;
72475 + case SDCONFIG_SET_HCD_DEBUG:
72476 + DBG_PRINT(SDDBG_TRACE, ("config SET_HCD_DEBUG\n"));
72477 + status = SDIO_STATUS_SUCCESS;
72478 + break;
72479 + default:
72480 + /* invalid request */
72481 + DBG_PRINT(SDDBG_ERROR, ("%s() - unsupported command: 0x%X\n",
72482 + __FUNCTION__, GET_SDCONFIG_CMD(config)));
72483 + status = SDIO_STATUS_INVALID_PARAMETER;
72484 + }
72485 +
72486 + return SDIOErrorToOSError(status);
72487 +}
72488 +
72489 +
72490 +SDIO_STATUS s3c24xx_hcd_request(PSDHCD hcd)
72491 +{
72492 + SDIO_STATUS status = SDIO_STATUS_PENDING;
72493 + PSDREQUEST req;
72494 + u32 cmdcon, imask;
72495 + unsigned long flags;
72496 + struct s3c24xx_hcd_context * context =
72497 + (struct s3c24xx_hcd_context *)hcd->pContext;
72498 +
72499 + req = GET_CURRENT_REQUEST(hcd);
72500 + DBG_ASSERT(req != NULL);
72501 +
72502 + if (req->Flags & SDREQ_FLAGS_DATA_SHORT_TRANSFER)
72503 + printk("### SHORT TRANSFER ###\n");
72504 +
72505 + spin_lock_irqsave(&context->lock, flags);
72506 +
72507 + /* Clear command, data and fifo status registers */
72508 + writel(0xFFFFFFFF, context->base + S3C2410_SDICMDSTAT);
72509 + writel(0xFFFFFFFF, context->base + S3C2410_SDIDSTA);
72510 + writel(0xFFFFFFFF, context->base + S3C2410_SDIFSTA);
72511 +
72512 + /* Enabling irqs */
72513 + imask = S3C2410_SDIIMSK_READWAIT;
72514 +
72515 + cmdcon = readl(context->base + S3C2410_SDICMDCON);
72516 +
72517 + switch (GET_SDREQ_RESP_TYPE(req->Flags)) {
72518 + case SDREQ_FLAGS_NO_RESP:
72519 + cmdcon &= ~S3C2410_SDICMDCON_WAITRSP;
72520 + context->complete = S3C24XX_HCD_NO_RESPONSE;
72521 + imask |= S3C2410_SDIIMSK_CMDSENT;
72522 + break;
72523 + case SDREQ_FLAGS_RESP_R1:
72524 + case SDREQ_FLAGS_RESP_R1B:
72525 + case SDREQ_FLAGS_RESP_R3:
72526 + case SDREQ_FLAGS_RESP_SDIO_R4:
72527 + case SDREQ_FLAGS_RESP_SDIO_R5:
72528 + case SDREQ_FLAGS_RESP_R6:
72529 + cmdcon &= ~S3C2410_SDICMDCON_LONGRSP;
72530 + cmdcon |= S3C2410_SDICMDCON_WAITRSP;
72531 + context->complete = S3C24XX_HCD_RESPONSE_SHORT;
72532 + imask |= S3C2410_SDIIMSK_CRCSTATUS | S3C2410_SDIIMSK_RESPONSEND
72533 + | S3C2410_SDIIMSK_CMDTIMEOUT | S3C2410_SDIIMSK_RESPONSECRC;
72534 + break;
72535 + case SDREQ_FLAGS_RESP_R2:
72536 + cmdcon |= S3C2410_SDICMDCON_LONGRSP;
72537 + cmdcon |= S3C2410_SDICMDCON_WAITRSP;
72538 + context->complete = S3C24XX_HCD_RESPONSE_LONG;
72539 + imask |= S3C2410_SDIIMSK_CRCSTATUS | S3C2410_SDIIMSK_RESPONSEND
72540 + | S3C2410_SDIIMSK_CMDTIMEOUT | S3C2410_SDIIMSK_RESPONSECRC;
72541 + break;
72542 +
72543 + }
72544 +
72545 + /* There is a data part */
72546 + if (IS_SDREQ_DATA_TRANS(req->Flags)) {
72547 + u32 dcon = 0;
72548 +
72549 + if (readl(context->base + S3C2410_SDIDSTA) &
72550 + (S3C2410_SDIDSTA_TXDATAON | S3C2410_SDIDSTA_RXDATAON)) {
72551 + printk("##### DATA ON: 0x%x ######\n", readl(context->base + S3C2410_SDIDSTA));
72552 + }
72553 +
72554 + /* Setting timer */
72555 + writel(0x7fffff, context->base + S3C2410_SDITIMER);
72556 +
72557 + /* Block size */
72558 + writel(req->BlockLen, context->base + S3C2410_SDIBSIZE);
72559 + /* Number of blocks */
72560 + dcon |= (0xfff & req->BlockCount);
72561 +
72562 + if (context->bus_width == 4)
72563 + dcon |= S3C2410_SDIDCON_WIDEBUS;
72564 +
72565 + req->DataRemaining = req->BlockCount * req->BlockLen;
72566 +
72567 + /* Set data size, and start the transfer */
72568 + dcon |= S3C2410_SDIDCON_IRQPERIOD;
72569 + if (!(req->DataRemaining % 4)) {
72570 + context->data_size = 4;
72571 + dcon |= S3C2440_SDIDCON_DS_WORD;
72572 + } else if (!(req->DataRemaining % 2)) {
72573 + context->data_size = 2;
72574 + dcon |= S3C2440_SDIDCON_DS_HALFWORD;
72575 + } else {
72576 + context->data_size = 1;
72577 + dcon |= S3C2440_SDIDCON_DS_BYTE;
72578 + }
72579 +
72580 +#ifdef CONFIG_SDIO_S3C24XX_DMA
72581 + if (req->DataRemaining > 16) {
72582 + context->dma_en = 1;
72583 + } else
72584 +#endif
72585 + {
72586 + context->dma_en = 0;
72587 + context->data_size = 1;
72588 + dcon |= S3C2440_SDIDCON_DS_BYTE;
72589 + }
72590 +
72591 + if (context->dma_en) {
72592 + dcon |= S3C2410_SDIDCON_DMAEN;
72593 + s3c24xx_hcd_prepare_dma(context);
72594 + }
72595 +
72596 + if (IS_SDREQ_WRITE_DATA(req->Flags)) {
72597 + /* Data write */
72598 + DBG_PRINT(SDDBG_TRACE, ("Start data write, block count=%d, block size=%d\n",
72599 + req->BlockCount, req->BlockLen));
72600 +
72601 + /* Data configuration: transmit after resp, block mode*/
72602 + dcon |= S3C2410_SDIDCON_TXAFTERRESP | S3C2410_SDIDCON_BLOCKMODE;
72603 +
72604 + /* This is a write */
72605 + dcon |= S3C2410_SDIDCON_XFER_TXSTART;
72606 +
72607 + imask |= S3C2410_SDIIMSK_TXFIFOHALF | S3C2410_SDIIMSK_TXFIFOEMPTY |
72608 + S3C2410_SDIIMSK_FIFOFAIL | S3C2410_SDIIMSK_DATACRC |
72609 + S3C2410_SDIIMSK_DATATIMEOUT | S3C2410_SDIIMSK_DATAFINISH;
72610 +
72611 + context->complete = S3C24XX_HCD_DATA_WRITE;
72612 + } else {
72613 + /* Data read */
72614 + DBG_PRINT(SDDBG_TRACE, ("Start data read, block count=%d, block size=%d\n",
72615 + req->BlockCount, req->BlockLen));
72616 +
72617 + /* Data configuration: receive after cmd, block mode*/
72618 + dcon |= S3C2410_SDIDCON_RXAFTERCMD | S3C2410_SDIDCON_BLOCKMODE;
72619 +
72620 + /* This is a read */
72621 + dcon |= S3C2410_SDIDCON_XFER_RXSTART;
72622 +
72623 + imask |= S3C2410_SDIIMSK_RXFIFOHALF | S3C2410_SDIIMSK_RXFIFOLAST |
72624 + S3C2410_SDIIMSK_FIFOFAIL | S3C2410_SDIIMSK_DATACRC |
72625 + S3C2410_SDIIMSK_DATATIMEOUT | S3C2410_SDIIMSK_DATAFINISH;
72626 +
72627 + context->complete = S3C24XX_HCD_DATA_READ;
72628 + }
72629 +
72630 + dcon |= S3C2440_SDIDCON_DATSTART;
72631 +
72632 + writel(dcon, context->base + S3C2410_SDIDCON);
72633 +
72634 + cmdcon |= S3C2410_SDICMDCON_WITHDATA;
72635 +
72636 + } else {
72637 + cmdcon &= ~S3C2410_SDICMDCON_WITHDATA;
72638 + }
72639 +
72640 + cmdcon |= req->Command & S3C2410_SDICMDCON_INDEX;
72641 + cmdcon |= S3C2410_SDICMDCON_SENDERHOST | S3C2410_SDICMDCON_CMDSTART;
72642 +
72643 + req->Status = SDIO_STATUS_PENDING;
72644 +
72645 + if (context->int_sdio)
72646 + imask |= S3C2410_SDIIMSK_SDIOIRQ;
72647 + context->int_mask = imask;
72648 + writel(imask, context->base + S3C2440_SDIIMSK);
72649 + writel(req->Argument, context->base + S3C2410_SDICMDARG);
72650 + writel(cmdcon, context->base + S3C2410_SDICMDCON);
72651 +
72652 + spin_unlock_irqrestore(&context->lock, flags);
72653 +
72654 + return status;
72655 +}
72656 +
72657 +static int s3c24xx_hcd_hw_init(struct s3c24xx_hcd_context * context)
72658 +{
72659 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
72660 + u32 con, datacon;
72661 +
72662 + /* Clock */
72663 + context->device.clock = clk_get(NULL, "sdi");
72664 + if (IS_ERR(context->device.clock)) {
72665 + DBG_PRINT(SDDBG_ERROR, ("Couldn't get clock\n"));
72666 + status = PTR_ERR(context->device.clock);
72667 + context->device.clock = NULL;
72668 + return status;
72669 + }
72670 +
72671 + status = clk_enable(context->device.clock);
72672 + if (SDIO_IS_ERROR(status)) {
72673 + DBG_PRINT(SDDBG_ERROR, ("Couldn't get clock\n"));
72674 + return SDIOErrorToOSError(status);
72675 + }
72676 +
72677 + context->device.max_clock_rate = clk_get_rate(context->device.clock);
72678 + context->device.actual_clock_rate = context->device.max_clock_rate;
72679 +
72680 + /* I/O */
72681 + context->mem = request_mem_region(context->mem->start,
72682 + RESSIZE(context->mem), context->description);
72683 +
72684 + if (!context->mem) {
72685 + DBG_PRINT(SDDBG_ERROR, ("Failed to request io memory region\n"));
72686 + status = -ENOENT;
72687 + goto out_disable_clock;
72688 + }
72689 +
72690 + context->base = ioremap(context->mem->start, RESSIZE(context->mem));
72691 + if (context->base == 0) {
72692 + DBG_PRINT(SDDBG_ERROR, ("failed to ioremap() io memory region.\n"));
72693 + status = -EINVAL;
72694 + goto out_free_mem_region;
72695 + }
72696 +
72697 + /* IRQ */
72698 +#if 0
72699 + context->cd_irq = s3c2410_gpio_getirq(GTA02v1_GPIO_nSD_DETECT);
72700 + s3c2410_gpio_cfgpin(GTA02v1_GPIO_nSD_DETECT, S3C2410_GPIO_IRQ);
72701 +
72702 + if (request_irq(context->cd_irq, s3c24xx_hcd_cd_irq, 0, context->description, context)) {
72703 + DBG_PRINT(SDDBG_ERROR, ("failed to request card detect interrupt.\n"));
72704 + status = -ENOENT;
72705 + goto out_unmap_mem_region;
72706 + }
72707 +#endif
72708 +
72709 + if (request_irq(context->io_irq, s3c24xx_hcd_irq, 0, context->description, context)) {
72710 + DBG_PRINT(SDDBG_ERROR, ("failed to request mci interrupt.\n"));
72711 + status = -ENOENT;
72712 + goto out_unmap_mem_region;
72713 + }
72714 +
72715 +
72716 + /* DMA */
72717 + context->io_buffer_size = 4 * 4096;
72718 + context->io_buffer = dma_alloc_writecombine(&context->pdev->dev,
72719 + context->io_buffer_size,
72720 + &context->io_buffer_dma,
72721 + GFP_KERNEL | GFP_DMA);
72722 +
72723 + if (context->io_buffer == NULL) {
72724 + DBG_PRINT(SDDBG_ERROR, ("failed to allocate DMA buffer\n"));
72725 + status = -ENOMEM;
72726 + goto out_free_irq;
72727 +
72728 + }
72729 +
72730 + if (s3c2410_dma_request(context->dma_channel, &s3c24xx_hcd_dma_client, NULL)) {
72731 + DBG_PRINT(SDDBG_ERROR, ("unable to get DMA channel.\n"));
72732 + status = -ENOENT;
72733 + goto out_free_dma;
72734 + }
72735 +
72736 +
72737 + /* Set multiplexing */
72738 + s3c2410_gpio_cfgpin(S3C2410_GPE5, S3C2410_GPE5_SDCLK);
72739 + s3c2410_gpio_cfgpin(S3C2410_GPE6, S3C2410_GPE6_SDCMD);
72740 + s3c2410_gpio_cfgpin(S3C2410_GPE7, S3C2410_GPE7_SDDAT0);
72741 + s3c2410_gpio_cfgpin(S3C2410_GPE8, S3C2410_GPE8_SDDAT1);
72742 + s3c2410_gpio_cfgpin(S3C2410_GPE9, S3C2410_GPE9_SDDAT2);
72743 + s3c2410_gpio_cfgpin(S3C2410_GPE10, S3C2410_GPE10_SDDAT3);
72744 +
72745 + con = readl(context->base + S3C2410_SDICON);
72746 + con |= S3C2410_SDICON_SDIOIRQ;
72747 + writel(con, context->base + S3C2410_SDICON);
72748 +
72749 + datacon = readl(context->base + S3C2410_SDIDCON);
72750 + datacon |= S3C2410_SDIDCON_WIDEBUS;
72751 + writel(datacon, context->base + S3C2410_SDIDCON);
72752 +
72753 + printk("S3c24xx SDIO: IRQ:%d Detect IRQ:%d DMA channel:%d base@0x%p PCLK@%ld kHz\n",
72754 + context->io_irq, context->cd_irq, context->dma_channel, context->base,
72755 + context->device.max_clock_rate/1000);
72756 +
72757 + return SDIOErrorToOSError(status);
72758 +
72759 + out_free_dma:
72760 + dma_free_writecombine(&context->pdev->dev,context->io_buffer_size,
72761 + context->io_buffer, context->io_buffer_dma);
72762 +
72763 + out_free_irq:
72764 + free_irq(context->io_irq, context);
72765 +
72766 + out_unmap_mem_region:
72767 + iounmap(context->base);
72768 +
72769 + out_free_mem_region:
72770 + release_mem_region(context->mem->start, RESSIZE(context->mem));
72771 +
72772 + out_disable_clock:
72773 + clk_disable(context->device.clock);
72774 +
72775 + return SDIOErrorToOSError(status);
72776 +}
72777 +
72778 +static void s3c24xx_hcd_hw_cleanup(struct s3c24xx_hcd_context * context)
72779 +{
72780 + clk_disable(context->device.clock);
72781 + free_irq(context->io_irq, context);
72782 + iounmap(context->base);
72783 + release_mem_region(context->mem->start, RESSIZE(context->mem));
72784 + dma_free_writecombine(&context->pdev->dev,context->io_buffer_size,
72785 + context->io_buffer, context->io_buffer_dma);
72786 +}
72787 +
72788 +static int s3c24xx_hcd_pnp_probe(struct pnp_dev *pBusDevice, const struct pnp_device_id *pId)
72789 +{
72790 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
72791 +
72792 + status = s3c24xx_hcd_hw_init(&hcd_context);
72793 + if (SDIO_IS_ERROR(status)) {
72794 + DBG_PRINT(SDDBG_ERROR, ("HW Init failed\n"));
72795 + return SDIOErrorToOSError(status);
72796 + }
72797 +
72798 + status = SDIO_RegisterHostController(&hcd_context.hcd);
72799 + if (SDIO_IS_ERROR(status)) {
72800 + DBG_PRINT(SDDBG_ERROR, ("Host registration failed\n"));
72801 + s3c24xx_hcd_hw_cleanup(&hcd_context);
72802 + return SDIOErrorToOSError(status);
72803 + }
72804 +
72805 + /* Our card is built-in, we force the attachement event */
72806 + SDIO_HandleHcdEvent(&hcd_context.hcd, EVENT_HCD_ATTACH);
72807 +
72808 + return 0;
72809 +}
72810 +
72811 +static void s3c24xx_hcd_pnp_remove(struct pnp_dev *pBusDevice)
72812 +{
72813 +}
72814 +
72815 +/* the driver context data */
72816 +struct s3c24xx_hcd_context hcd_context = {
72817 + .description = DESCRIPTION,
72818 + .hcd.pName = "sdio_s3c24xx",
72819 + .hcd.Version = CT_SDIO_STACK_VERSION_CODE,
72820 + .hcd.pModule = THIS_MODULE,
72821 + /* builtin card, 4 bits bus */
72822 + .hcd.Attributes = SDHCD_ATTRIB_BUS_4BIT | SDHCD_ATTRIB_BUS_1BIT | SDHCD_ATTRIB_MULTI_BLK_IRQ,
72823 + .hcd.SlotNumber = 0,
72824 + .hcd.MaxSlotCurrent = 500, /* 1/2 amp */
72825 + .hcd.SlotVoltageCaps = SLOT_POWER_3_3V, /* 3.3V */
72826 + .hcd.SlotVoltagePreferred = SLOT_POWER_3_3V, /* 3.3V */
72827 + .hcd.MaxClockRate = 25000000,
72828 + .hcd.MaxBytesPerBlock = 0xfff, /* 0 - 4095 */
72829 + .hcd.MaxBlocksPerTrans = 0xfff, /* 0 - 4095 */
72830 + .hcd.pContext = &hcd_context,
72831 + .hcd.pRequest = s3c24xx_hcd_request,
72832 + .hcd.pConfigure = s3c24xx_hcd_config,
72833 + .device.pnp_device.name = "sdio_s3c24xx_hcd",
72834 + .device.pnp_driver.name = "sdio_s3c24xx_hcd",
72835 + .device.pnp_driver.probe = s3c24xx_hcd_pnp_probe,
72836 + .device.pnp_driver.remove = s3c24xx_hcd_pnp_remove,
72837 +};
72838 +
72839 +static int s3c24xx_hcd_probe(struct platform_device * pdev)
72840 +{
72841 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
72842 + struct resource *r = NULL;
72843 +
72844 + printk("S3c2440 SDIO Host controller\n");
72845 +
72846 + hcd_context.pdev = pdev;
72847 +
72848 + hcd_context.mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
72849 + if (hcd_context.mem == NULL) {
72850 + DBG_PRINT(SDDBG_ERROR, ("No memory region\n"));
72851 + status = SDIO_STATUS_NO_RESOURCES;
72852 + goto out;
72853 + }
72854 +
72855 + hcd_context.io_irq = platform_get_irq(pdev, 0);
72856 + if (hcd_context.io_irq == 0) {
72857 + DBG_PRINT(SDDBG_ERROR, ("No IRQ\n"));
72858 + status = SDIO_STATUS_NO_RESOURCES;
72859 + goto out;
72860 + }
72861 +
72862 + r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
72863 + if (r == NULL) {
72864 + DBG_PRINT(SDDBG_ERROR, ("No DMA channel\n"));
72865 + status = SDIO_STATUS_NO_RESOURCES;
72866 + goto out;
72867 + }
72868 + hcd_context.dma_channel = r->start;
72869 + hcd_context.dma_en = 0;
72870 +
72871 + hcd_context.int_sdio = 0;
72872 +
72873 + spin_lock_init(&hcd_context.lock);
72874 +
72875 + init_completion(&hcd_context.dma_complete);
72876 + init_completion(&hcd_context.xfer_complete);
72877 +
72878 + INIT_WORK(&hcd_context.io_work, s3c24xx_hcd_io_work);
72879 + INIT_WORK(&hcd_context.irq_work, s3c24xx_hcd_irq_work);
72880 +
72881 + mdelay(100);
72882 +
72883 + status = SDIO_BusAddOSDevice(&hcd_context.device.dma,
72884 + &hcd_context.device.pnp_driver,
72885 + &hcd_context.device.pnp_device);
72886 +
72887 + out:
72888 +
72889 + return SDIOErrorToOSError(status);
72890 +}
72891 +
72892 +/*
72893 + * module cleanup
72894 + */
72895 +static int s3c24xx_hcd_remove(struct platform_device * pdev) {
72896 + printk("S3C2440 SDIO host controller unloaded\n");
72897 + SDIO_BusRemoveOSDevice(&hcd_context.device.pnp_driver, &hcd_context.device.pnp_device);
72898 +
72899 + return 0;
72900 +}
72901 +
72902 +#ifdef CONFIG_PM
72903 +
72904 +static int s3c24xx_hcd_suspend(struct platform_device * pdev, pm_message_t state)
72905 +{
72906 + struct s3c24xx_hcd_context * context = &hcd_context;
72907 + unsigned long flags;
72908 +
72909 + spin_lock_irqsave(&context->lock, flags);
72910 +
72911 + context->suspend_regs.con = readl(context->base + S3C2410_SDICON);
72912 + context->suspend_regs.pre = readl(context->base + S3C2410_SDIPRE);
72913 + context->suspend_regs.cmdarg = readl(context->base + S3C2410_SDICMDARG);
72914 + context->suspend_regs.cmdcon = readl(context->base + S3C2410_SDICMDCON);
72915 + context->suspend_regs.cmdsta = readl(context->base + S3C2410_SDICMDSTAT);
72916 + context->suspend_regs.r0 = readl(context->base + S3C2410_SDIRSP0);
72917 + context->suspend_regs.r1 = readl(context->base + S3C2410_SDIRSP1);
72918 + context->suspend_regs.r2 = readl(context->base + S3C2410_SDIRSP2);
72919 + context->suspend_regs.r3 = readl(context->base + S3C2410_SDIRSP3);
72920 + context->suspend_regs.timer = readl(context->base + S3C2410_SDITIMER);
72921 + context->suspend_regs.bsize = readl(context->base + S3C2410_SDIBSIZE);
72922 + context->suspend_regs.datcon = readl(context->base + S3C2410_SDIDCON);
72923 + context->suspend_regs.datcnt = readl(context->base + S3C2410_SDIDCNT);
72924 + context->suspend_regs.datsta = readl(context->base + S3C2410_SDIDSTA);
72925 + context->suspend_regs.fsta = readl(context->base + S3C2410_SDIFSTA);
72926 + context->suspend_regs.imask = readl(context->base + S3C2440_SDIIMSK);
72927 +
72928 + spin_unlock_irqrestore(&context->lock, flags);
72929 + return 0;
72930 +}
72931 +
72932 +static int s3c24xx_hcd_resume(struct platform_device * pdev)
72933 +{
72934 + struct s3c24xx_hcd_context * context = &hcd_context;
72935 + unsigned long flags;
72936 +
72937 + spin_lock_irqsave(&context->lock, flags);
72938 +
72939 + writel(context->suspend_regs.con, context->base + S3C2410_SDICON);
72940 + writel(context->suspend_regs.pre, context->base + S3C2410_SDIPRE);
72941 + writel(context->suspend_regs.cmdarg, context->base + S3C2410_SDICMDARG);
72942 + writel(context->suspend_regs.cmdcon, context->base + S3C2410_SDICMDCON);
72943 + writel(context->suspend_regs.cmdsta, context->base + S3C2410_SDICMDSTAT);
72944 + writel(context->suspend_regs.r0, context->base + S3C2410_SDIRSP0);
72945 + writel(context->suspend_regs.r1, context->base + S3C2410_SDIRSP1);
72946 + writel(context->suspend_regs.r2, context->base + S3C2410_SDIRSP2);
72947 + writel(context->suspend_regs.r3, context->base + S3C2410_SDIRSP3);
72948 + writel(context->suspend_regs.timer, context->base + S3C2410_SDITIMER);
72949 + writel(context->suspend_regs.bsize, context->base + S3C2410_SDIBSIZE);
72950 + writel(context->suspend_regs.datcon, context->base + S3C2410_SDIDCON);
72951 + writel(context->suspend_regs.datcnt, context->base + S3C2410_SDIDCNT);
72952 + writel(context->suspend_regs.datsta, context->base + S3C2410_SDIDSTA);
72953 + writel(context->suspend_regs.fsta, context->base + S3C2410_SDIFSTA);
72954 + writel(context->suspend_regs.imask, context->base + S3C2440_SDIIMSK);
72955 +
72956 + spin_unlock_irqrestore(&context->lock, flags);
72957 + return 0;
72958 +}
72959 +
72960 +#else
72961 +#define s3c24xx_hcd_suspend = NULL
72962 +#define s3c24xx_hcd_resume = NULL
72963 +#endif
72964 +
72965 +static struct platform_driver s3c24xx_hcd_sdio =
72966 +{
72967 + .driver.name = "s3c24xx-sdio",
72968 + .probe = s3c24xx_hcd_probe,
72969 + .remove = s3c24xx_hcd_remove,
72970 + .suspend = s3c24xx_hcd_suspend,
72971 + .resume = s3c24xx_hcd_resume,
72972 +};
72973 +
72974 +#ifdef CONFIG_DEBUG_FS
72975 +static struct dentry *debugfs_dir;
72976 +
72977 +static int s3c24xx_hcd_debugfs_show(struct seq_file *s, void *data)
72978 +{
72979 + PSDREQUEST req;
72980 + u32 con, pre, cmdarg, cmdcon, cmdsta, r0, r1, r2, r3, timer, bsize;
72981 + u32 datcon, datcnt, datsta, fsta, imask;
72982 + struct s3c24xx_hcd_context * context = &hcd_context;
72983 +
72984 +
72985 + con = readl(context->base + S3C2410_SDICON);
72986 + pre = readl(context->base + S3C2410_SDIPRE);
72987 + cmdarg = readl(context->base + S3C2410_SDICMDARG);
72988 + cmdcon = readl(context->base + S3C2410_SDICMDCON);
72989 + cmdsta = readl(context->base + S3C2410_SDICMDSTAT);
72990 + r0 = readl(context->base + S3C2410_SDIRSP0);
72991 + r1 = readl(context->base + S3C2410_SDIRSP1);
72992 + r2 = readl(context->base + S3C2410_SDIRSP2);
72993 + r3 = readl(context->base + S3C2410_SDIRSP3);
72994 + timer = readl(context->base + S3C2410_SDITIMER);
72995 + bsize = readl(context->base + S3C2410_SDIBSIZE);
72996 + datcon = readl(context->base + S3C2410_SDIDCON);
72997 + datcnt = readl(context->base + S3C2410_SDIDCNT);
72998 + datsta = readl(context->base + S3C2410_SDIDSTA);
72999 + fsta = readl(context->base + S3C2410_SDIFSTA);
73000 + imask = readl(context->base + S3C2440_SDIIMSK);
73001 +
73002 + seq_printf(s, "SDICON: 0x%08x\n", con);
73003 + seq_printf(s, "SDIPRE: 0x%08x\n", pre);
73004 + seq_printf(s, "SDICmdArg: 0x%08x\n", cmdarg);
73005 + seq_printf(s, "SDICmdCon: 0x%08x\n", cmdcon);
73006 + seq_printf(s, "SDICmdSta: 0x%08x\n", cmdsta);
73007 + seq_printf(s, "SDIRSP0: 0x%08x\n", r0);
73008 + seq_printf(s, "SDIRSP1: 0x%08x\n", r1);
73009 + seq_printf(s, "SDIRSP2: 0x%08x\n", r2);
73010 + seq_printf(s, "SDIRSP3: 0x%08x\n", r3);
73011 + seq_printf(s, "SDIDTimer: 0x%08x\n", timer);
73012 + seq_printf(s, "SDIBSize: 0x%08x\n", bsize);
73013 + seq_printf(s, "SDIDatCon: 0x%08x\n", datcon);
73014 + seq_printf(s, "SDIDatCnt: 0x%08x\n", datcnt);
73015 + seq_printf(s, "SDIDatSta: 0x%08x\n", datsta);
73016 + seq_printf(s, "SDIFSta: 0x%08x\n", fsta);
73017 + seq_printf(s, "SDIIntMsk: 0x%08x\n", imask);
73018 + seq_printf(s, "\n");
73019 +
73020 + seq_printf(s, "Current REQ: \n");
73021 + req = GET_CURRENT_REQUEST(&context->hcd);
73022 + if (req == NULL) {
73023 + seq_printf(s, " No current request\n");
73024 + } else {
73025 + seq_printf(s, " Command: %d\n", req->Command);
73026 + seq_printf(s, " Args: 0x%x\n", req->Argument);
73027 + seq_printf(s, " Flags: 0x%x\n", req->Flags);
73028 + seq_printf(s, " %d blocks x %d bytes\n", req->BlockCount, req->BlockLen);
73029 + seq_printf(s, " %d bytes remaining\n", req->DataRemaining);
73030 + }
73031 +
73032 + seq_printf(s, "Context: \n");
73033 + seq_printf(s, " INT mask: 0x%x\n", context->int_mask);
73034 + seq_printf(s, " sdio INT: %d\n", context->int_sdio);
73035 + seq_printf(s, " cmdsta: 0x%x\n", context->cmdsta);
73036 + seq_printf(s, " dsta: 0x%x\n", context->dsta);
73037 + seq_printf(s, " fsta: 0x%x\n", context->fsta);
73038 +
73039 + return 0;
73040 +}
73041 +
73042 +static int s3c24xx_hcd_debugfs_open(struct inode *inode,
73043 + struct file *file)
73044 +{
73045 + return single_open(file, s3c24xx_hcd_debugfs_show, NULL);
73046 +}
73047 +
73048 +static const struct file_operations s3c24xx_hcd_debugfs_fops = {
73049 + .open = s3c24xx_hcd_debugfs_open,
73050 + .read = seq_read,
73051 + .llseek = seq_lseek,
73052 + .release = single_release,
73053 + .owner = THIS_MODULE,
73054 +};
73055 +
73056 +
73057 +static int s3c24xx_debugfs_init(struct s3c24xx_hcd_context * context)
73058 +{
73059 + debugfs_dir = debugfs_create_dir("s3c24xx_sdio", NULL);
73060 +
73061 + debugfs_create_file("registers", 0444, debugfs_dir,
73062 + (void *)context,
73063 + &s3c24xx_hcd_debugfs_fops);
73064 +
73065 + return 0;
73066 +}
73067 +
73068 +#else
73069 +
73070 +static int s3c24xx_debugfs_init(struct s3c24xx_hcd_context * context)
73071 +{
73072 + return 0;
73073 +}
73074 +
73075 +#endif
73076 +
73077 +static int __init s3c24xx_hcd_init(void)
73078 +{
73079 + int ret;
73080 +
73081 + ret = s3c24xx_debugfs_init(&hcd_context);
73082 + if (ret) {
73083 + printk("%s(): debugfs init failed\n", __FUNCTION__);
73084 + }
73085 +
73086 + platform_driver_register(&s3c24xx_hcd_sdio);
73087 +
73088 + return 0;
73089 +}
73090 +
73091 +static void __exit s3c24xx_hcd_exit(void)
73092 +{
73093 + platform_driver_unregister(&s3c24xx_hcd_sdio);
73094 +}
73095 +
73096 +
73097 +MODULE_LICENSE("GPL");
73098 +MODULE_DESCRIPTION(DESCRIPTION);
73099 +MODULE_AUTHOR(AUTHOR);
73100 +
73101 +module_init(s3c24xx_hcd_init);
73102 +module_exit(s3c24xx_hcd_exit);
73103 Index: linux-2.6.24.7/drivers/sdio/hcd/s3c24xx/s3c24xx_hcd.h
73104 ===================================================================
73105 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
73106 +++ linux-2.6.24.7/drivers/sdio/hcd/s3c24xx/s3c24xx_hcd.h 2008-12-11 22:46:49.000000000 +0100
73107 @@ -0,0 +1,81 @@
73108 +#ifndef __SDIO_S3C24XX_HCD_H___
73109 +#define __SDIO_S3C24XX_HCD_H___
73110 +
73111 +#define S3C24XX_HCD_NO_RESPONSE 1
73112 +#define S3C24XX_HCD_RESPONSE_SHORT 2
73113 +#define S3C24XX_HCD_RESPONSE_LONG 3
73114 +#define S3C24XX_HCD_DATA_READ 4
73115 +#define S3C24XX_HCD_DATA_WRITE 5
73116 +
73117 +struct s3c24xx_hcd_device {
73118 + OS_PNPDEVICE pnp_device; /* the OS device for this HCD */
73119 + OS_PNPDRIVER pnp_driver; /* the OS driver for this HCD */
73120 + SDDMA_DESCRIPTION dma;
73121 + struct clk * clock;
73122 + unsigned long max_clock_rate;
73123 + unsigned long actual_clock_rate;
73124 +};
73125 +
73126 +
73127 +/* driver wide data, this driver only supports one device,
73128 + * so we include the per device data here also */
73129 +struct s3c24xx_hcd_context {
73130 + PTEXT description; /* human readable device decsription */
73131 + SDHCD hcd; /* HCD description for bus driver */
73132 + struct s3c24xx_hcd_device device; /* the single device's info */
73133 + struct platform_device *pdev;
73134 + struct resource *mem;
73135 + void __iomem *base;
73136 + UINT32 io_irq;
73137 + UINT32 cd_irq;
73138 + BOOL card_inserted; /* card inserted flag */
73139 + BOOL cmd_processed; /* command phase was processed */
73140 + UINT32 fifo_depth; /* FIFO depth for the bus mode */
73141 + BOOL irq_masked;
73142 + UINT32 bus_width;
73143 + UINT32 data_size; /* Word, half word, or byte */
73144 + UINT32 latest_xfer_size;
73145 +
73146 + void *io_buffer; /* Kernel address */
73147 + dma_addr_t io_buffer_dma; /* Bus address */
73148 + UINT32 io_buffer_size;
73149 + UINT32 dma_channel;
73150 + UINT32 dma_en;
73151 + struct completion dma_complete;
73152 + struct completion xfer_complete;
73153 +
73154 + UINT32 int_mask;
73155 + UINT32 int_sdio; /* Do we have SDIO interrupt on ? */
73156 +
73157 + UINT32 complete;
73158 +
73159 + UINT32 cmdsta;
73160 + UINT32 dsta;
73161 + UINT32 fsta;
73162 +
73163 + spinlock_t lock;
73164 +
73165 + struct work_struct io_work;
73166 + struct work_struct irq_work;
73167 +
73168 +#ifdef CONFIG_PM
73169 + struct {
73170 + UINT32 con;
73171 + UINT32 pre;
73172 + UINT32 cmdarg, cmdcon, cmdsta;
73173 + UINT32 r0, r1, r2, r3;
73174 + UINT32 timer;
73175 + UINT32 bsize;
73176 + UINT32 datcon, datcnt, datsta;
73177 + UINT32 fsta;
73178 + UINT32 imask;
73179 + } suspend_regs;
73180 +#endif
73181 +};
73182 +
73183 +SDIO_STATUS s3c24xx_hcd_config(PSDHCD hcd, PSDCONFIG config);
73184 +SDIO_STATUS s3c24xx_hcd_request(PSDHCD hcd);
73185 +
73186 +struct s3c24xx_hcd_context hcd_context;
73187 +
73188 +#endif
73189 Index: linux-2.6.24.7/drivers/sdio/Kconfig
73190 ===================================================================
73191 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
73192 +++ linux-2.6.24.7/drivers/sdio/Kconfig 2008-12-11 22:46:49.000000000 +0100
73193 @@ -0,0 +1,17 @@
73194 +#
73195 +# SDIO driver and host controller support
73196 +#
73197 +
73198 +menu "SDIO support"
73199 +
73200 +config SDIO
73201 + tristate "SDIO support"
73202 + default m
73203 + ---help---
73204 + good luck.
73205 +
73206 +source "drivers/sdio/hcd/Kconfig"
73207 +
73208 +source "drivers/sdio/function/Kconfig"
73209 +
73210 +endmenu
73211 Index: linux-2.6.24.7/drivers/sdio/Makefile
73212 ===================================================================
73213 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
73214 +++ linux-2.6.24.7/drivers/sdio/Makefile 2008-12-11 22:46:49.000000000 +0100
73215 @@ -0,0 +1,4 @@
73216 +#Makefile for SDIO stack
73217 +obj-$(CONFIG_SDIO) += stack/
73218 +obj-$(CONFIG_SDIO) += hcd/
73219 +obj-$(CONFIG_SDIO) += function/
73220 Index: linux-2.6.24.7/drivers/sdio/stack/busdriver/_busdriver.h
73221 ===================================================================
73222 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
73223 +++ linux-2.6.24.7/drivers/sdio/stack/busdriver/_busdriver.h 2008-12-11 22:46:49.000000000 +0100
73224 @@ -0,0 +1,466 @@
73225 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
73226 +@file: _busdriver.h
73227 +
73228 +@abstract: internal include file for busdriver
73229 +
73230 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
73231 +
73232 +
73233 + *
73234 + * This program is free software; you can redistribute it and/or modify
73235 + * it under the terms of the GNU General Public License version 2 as
73236 + * published by the Free Software Foundation;
73237 + *
73238 + * Software distributed under the License is distributed on an "AS
73239 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
73240 + * implied. See the License for the specific language governing
73241 + * rights and limitations under the License.
73242 + *
73243 + * Portions of this code were developed with information supplied from the
73244 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
73245 + *
73246 + * The following conditions apply to the release of the SD simplified specification (�Simplified
73247 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
73248 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
73249 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
73250 + * Specification may require a license from the SD Card Association or other third parties.
73251 + * Disclaimers:
73252 + * The information contained in the Simplified Specification is presented only as a standard
73253 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
73254 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
73255 + * any damages, any infringements of patents or other right of the SD Card Association or any third
73256 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
73257 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
73258 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
73259 + * information, know-how or other confidential information to any third party.
73260 + *
73261 + *
73262 + * The initial developers of the original code are Seung Yi and Paul Lever
73263 + *
73264 + * sdio@atheros.com
73265 + *
73266 + *
73267 +
73268 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
73269 +#ifndef ___BUSDRIVER_H___
73270 +#define ___BUSDRIVER_H___
73271 +#include <linux/sdio/sdio_lib.h>
73272 +
73273 +#define SDIODBG_FUNC_IRQ (SDDBG_TRACE + 1)
73274 +#define SDIODBG_REQUESTS (SDDBG_TRACE + 2)
73275 +#define SDIODBG_CD_TIMER (SDDBG_TRACE + 3)
73276 +#define SDIODBG_HCD_EVENTS (SDDBG_TRACE + 4)
73277 +
73278 +#define SDIOBUS_CD_TIMER_ID 0
73279 +
73280 +#define SDBUS_MAX_RETRY 3
73281 +
73282 +/* Notes on list linkages:
73283 + * list heads are held in BDCONTEXT
73284 + * HcdList - SDHCD
73285 + * one per registered host controller
73286 + * Next - links of all HCDs
73287 + * DeviceList SDDEVICE
73288 + * one per inserted device
73289 + * Next - links of all devices
73290 + * DeviceListNext - links of all devices on a function
73291 + * pFunction - ptr to Function supportting this device
73292 + * pHcd - ptr to HCD with supporting this device
73293 + * FunctionList SDFUNCTION
73294 + * one per register function driver
73295 + * Next - links of all functions
73296 + * DeviceList - list of devices being support by this function
73297 + * uses DeviceListNext in SDDEVICE to link
73298 + *
73299 + *
73300 +*/
73301 +
73302 +#define SDMMC_DEFAULT_CMD_RETRIES 1
73303 +#define SDMMC_DEFAULT_CARD_READY_RETRIES 200
73304 +#define OCR_READY_CHECK_DELAY_MS 10
73305 +#define SDMMC_POWER_SETTLE_DELAY 400 /* in milliseconds */
73306 +#define SDBUS_DEFAULT_REQ_LIST_SIZE 16
73307 +#define SDBUS_DEFAULT_REQ_SIG_SIZE 8
73308 +#define CARD_DETECT_PAUSE 100
73309 +#define SDBUS_DEFAULT_CD_POLLING_INTERVAL 1000 /* in milliseconds */
73310 +#define MAX_CARD_DETECT_MSGS 16
73311 +#define SDMMC_DEFAULT_BYTES_PER_BLOCK 2048
73312 +#define SDMMC_DEFAULT_BLOCKS_PER_TRANS 512
73313 +#define SDMMC_CMD13_POLLING_MULTIPLIER 1000 /* per block multiplier */
73314 +#define MAX_HCD_REQ_RECURSION 5
73315 +#define MAX_HCD_RECURSION_RUNAWAY 100
73316 +
73317 + /* internal signalling item */
73318 +typedef struct _SIGNAL_ITEM{
73319 + SDLIST SDList; /* list link*/
73320 + OS_SIGNAL Signal; /* signal */
73321 +}SIGNAL_ITEM, *PSIGNAL_ITEM;
73322 +
73323 +typedef struct _HCD_EVENT_MESSAGE {
73324 + HCD_EVENT Event; /* the event */
73325 + PSDHCD pHcd; /* hcd that generated the event */
73326 +}HCD_EVENT_MESSAGE, *PHCD_EVENT_MESSAGE;
73327 +
73328 +/* internal data for bus driver */
73329 +typedef struct _BDCONTEXT {
73330 +
73331 + /* list of SD requests and signalling semaphores and a semaphore to protect it */
73332 + SDLIST RequestList;
73333 + SDLIST SignalList;
73334 + OS_CRITICALSECTION RequestListCritSection;
73335 + /* list of host controller bus drivers, sempahore to protect it */
73336 + SDLIST HcdList;
73337 + OS_SEMAPHORE HcdListSem;
73338 + /* list of inserted devices, semaphore to protect it */
73339 + SDLIST DeviceList;
73340 + OS_SEMAPHORE DeviceListSem;
73341 + /* list of function drivers, semaphore to protect it */
73342 + SDLIST FunctionList;
73343 + OS_SEMAPHORE FunctionListSem;
73344 + INT RequestListSize; /* default request list */
73345 + INT SignalSemListSize; /* default signalling semaphore size */
73346 + INT CurrentRequestAllocations; /*current count of allocated requests */
73347 + INT CurrentSignalAllocations; /* current count of signal allocations */
73348 + INT MaxRequestAllocations; /* max number of allocated requests to keep around*/
73349 + INT MaxSignalAllocations; /* max number of signal allocations to keep around*/
73350 + INT RequestRetries; /* cmd retries */
73351 + INT CardReadyPollingRetry; /* card ready polling retry count */
73352 + INT PowerSettleDelay; /* power settle delay */
73353 + INT CMD13PollingMultiplier; /* CMD13 (GET STATUS) multiplier */
73354 + SD_BUSCLOCK_RATE DefaultOperClock; /* default operation clock */
73355 + SD_BUSMODE_FLAGS DefaultBusMode; /* default bus mode */
73356 + UINT16 DefaultOperBlockLen; /* default operational block length per block */
73357 + UINT16 DefaultOperBlockCount; /* default operational block count per transaction */
73358 + UINT32 CDPollingInterval; /* card insert/removal polling interval */
73359 + UINT8 InitMask; /* bus driver init mask */
73360 +#define BD_TIMER_INIT 0x01
73361 +#define HELPER_INIT 0x02
73362 +#define RESOURCE_INIT 0x04
73363 + BOOL CDTimerQueued; /* card detect timer queued */
73364 + OSKERNEL_HELPER CardDetectHelper; /* card detect helper */
73365 + PSDMESSAGE_QUEUE pCardDetectMsgQueue; /* card detect message queue */
73366 + ULONG HcdInUseField; /* bit field of in use HCD numbers*/
73367 + UINT32 ConfigFlags; /* bus driver configuration flags */
73368 +#define BD_CONFIG_SDREQ_FORCE_ALL_ASYNC 0x00000001
73369 + INT MaxHcdRecursion; /* max HCD recurion level */
73370 +}BDCONTEXT, *PBDCONTEXT;
73371 +
73372 +#define BD_DEFAULT_CONFIG_FLAGS 0x00000000
73373 +#define IsQueueBusy(pRequestQueue) (pRequestQueue)->Busy
73374 +#define MarkQueueBusy(pRequestQueue) (pRequestQueue)->Busy = TRUE
73375 +#define MarkQueueNotBusy(pRequestQueue) (pRequestQueue)->Busy = FALSE
73376 +
73377 +#define CLEAR_INTERNAL_REQ_FLAGS(pReq) (pReq)->Flags &= ~(UINT)((SDREQ_FLAGS_RESP_SPI_CONVERTED | \
73378 + SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE))
73379 +
73380 +/* macros to insert request into the queue */
73381 +#define QueueRequest(pReqQ,pReq) SDListInsertTail(&(pReqQ)->Queue,&(pReq)->SDList)
73382 +#define QueueRequestToFront(pReqQ,pReq) SDListInsertHead(&(pReqQ)->Queue,&(pReq)->SDList)
73383 +
73384 +/* macros to remove an item from the head of the queue */
73385 +static INLINE PSDREQUEST DequeueRequest(PSDREQUESTQUEUE pRequestQueue) {
73386 + PSDLIST pItem;
73387 + pItem = SDListRemoveItemFromHead(&pRequestQueue->Queue);
73388 + if (pItem != NULL) {
73389 + return CONTAINING_STRUCT(pItem, SDREQUEST, SDList);
73390 + }
73391 + return NULL;
73392 +};
73393 +
73394 +static INLINE SDIO_STATUS InitializeRequestQueue(PSDREQUESTQUEUE pRequestQueue) {
73395 + SDLIST_INIT(&pRequestQueue->Queue);
73396 + MarkQueueNotBusy(pRequestQueue);
73397 + return SDIO_STATUS_SUCCESS;
73398 +}
73399 +
73400 +static INLINE void CleanupRequestQueue(PSDREQUESTQUEUE pRequestQueue) {
73401 +
73402 +}
73403 +
73404 +/* for bus driver internal use only */
73405 +SDIO_STATUS _SDIO_BusDriverInitialize(void);
73406 +SDIO_STATUS _SDIO_BusGetDefaultSettings(PBDCONTEXT pBdc);
73407 +void _SDIO_BusDriverCleanup(void);
73408 +SDIO_STATUS RemoveAllFunctions(void);
73409 +SDIO_STATUS RemoveHcdFunctions(PSDHCD pHcd);
73410 +PSDDEVICE AllocateDevice(PSDHCD pHcd);
73411 +BOOL AddDeviceToList(PSDDEVICE pDevice);
73412 +SDIO_STATUS DeleteDevices(PSDHCD pHcd);
73413 +SDIO_STATUS NotifyDeviceRemove(PSDDEVICE pDevice);
73414 +extern PBDCONTEXT pBusContext;
73415 +extern const CT_VERSION_CODE g_Version;
73416 +SDIO_STATUS _SDIO_RegisterHostController(PSDHCD pHcd);
73417 +SDIO_STATUS _SDIO_UnregisterHostController(PSDHCD pHcd);
73418 +SDIO_STATUS _SDIO_HandleHcdEvent(PSDHCD pHcd, HCD_EVENT Event);
73419 +SDIO_STATUS _SDIO_RegisterFunction(PSDFUNCTION pFunction);
73420 +SDIO_STATUS _SDIO_UnregisterFunction(PSDFUNCTION pFunction);
73421 +SDIO_STATUS _SDIO_CheckResponse(PSDHCD pHcd, PSDREQUEST pReq, SDHCD_RESPONSE_CHECK_MODE CheckMode);
73422 +SDIO_STATUS ProbeForFunction(PSDDEVICE pDevice, PSDHCD pHcd);
73423 +SDIO_STATUS SDInitializeCard(PSDHCD pHcd);
73424 +SDIO_STATUS SDQuerySDMMCInfo(PSDDEVICE pDevice);
73425 +SDIO_STATUS SDQuerySDIOInfo(PSDDEVICE pDevice);
73426 +SDIO_STATUS SDEnableFunction(PSDDEVICE pDevice, PSDCONFIG_FUNC_ENABLE_DISABLE_DATA pEnData);
73427 +SDIO_STATUS SDAllocFreeSlotCurrent(PSDDEVICE pDevice, BOOL Allocate, PSDCONFIG_FUNC_SLOT_CURRENT_DATA pData);
73428 +SDIO_STATUS SDMaskUnmaskFunctionIRQ(PSDDEVICE pDevice, BOOL Mask);
73429 +SDIO_STATUS SDFunctionAckInterrupt(PSDDEVICE pDevice);
73430 +SDIO_STATUS SDSPIModeEnableDisableCRC(PSDDEVICE pDevice,BOOL Enable);
73431 +SDIO_STATUS IssueBusConfig(PSDDEVICE pDev, PSDCONFIG pConfig);
73432 +SDIO_STATUS IssueBusRequest(PSDDEVICE pDev, PSDREQUEST pReq);
73433 +PSDREQUEST IssueAllocRequest(PSDDEVICE pDev);
73434 +void IssueFreeRequest(PSDDEVICE pDev, PSDREQUEST pReq);
73435 +PSDREQUEST AllocateRequest(void);
73436 +void FreeRequest(PSDREQUEST pReq);
73437 +PSIGNAL_ITEM AllocateSignal(void);
73438 +void FreeSignal(PSIGNAL_ITEM pSignal);
73439 +SDIO_STATUS InitializeTimers(void);
73440 +SDIO_STATUS CleanupTimers(void);
73441 +SDIO_STATUS QueueTimer(INT TimerID, UINT32 TimeOut);
73442 +SDIO_STATUS DeviceAttach(PSDHCD pHcd);
73443 +SDIO_STATUS DeviceDetach(PSDHCD pHcd);
73444 +SDIO_STATUS DeviceInterrupt(PSDHCD pHcd);
73445 +SDIO_STATUS CardInitSetup(PSDHCD pHcd);
73446 +void RunCardDetect(void);
73447 +void SDIO_NotifyTimerTriggered(INT TimerID);
73448 +SDIO_STATUS TestPresence(PSDHCD pHcd,
73449 + CARD_INFO_FLAGS TestType,
73450 + PSDREQUEST pReq);
73451 +#define _IssueSimpleBusRequest(pHcd,Cmd,Arg,Flags,pReqToUse) \
73452 + _IssueBusRequestBd((pHcd),(Cmd),(Arg),(Flags),(pReqToUse),NULL,0)
73453 +
73454 +SDIO_STATUS Do_OS_IncHcdReference(PSDHCD pHcd);
73455 +SDIO_STATUS Do_OS_DecHcdReference(PSDHCD pHcd);
73456 +SDIO_STATUS TryNoIrqPendingCheck(PSDDEVICE pDev);
73457 +
73458 + /* check API version compatibility of an HCD or function driver to a stack major/minor version
73459 + if the driver version is greater than the major number, we are compatible
73460 + if the driver version is equal, then we check if the minor is greater than or equal
73461 + we don't have to check for the less than major, because the bus driver never loads
73462 + drivers with different major numbers ...
73463 + if the busdriver compiled version major is greater than the major version being checked this
73464 + macro will resolved to ALWAYS true thus optimizing the code to not check the HCD since
73465 + as a rule we never load an HCD with a lower major number */
73466 +#define CHECK_API_VERSION_COMPAT(p,major,minor) \
73467 + ((CT_SDIO_STACK_VERSION_MAJOR(CT_SDIO_STACK_VERSION_CODE) > (major)) || \
73468 + (GET_SDIO_STACK_VERSION_MINOR((p)) >= (minor)))
73469 +
73470 +static INLINE SDIO_STATUS OS_IncHcdReference(PSDHCD pHcd) {
73471 + /* this API was added in version 2.3 which requires access to a field in the HCD structure */
73472 + if (CHECK_API_VERSION_COMPAT(pHcd,2,3)) {
73473 + /* we can safely call the OS-dependent function */
73474 + return Do_OS_IncHcdReference(pHcd);
73475 + }
73476 + return SDIO_STATUS_SUCCESS;
73477 +}
73478 +
73479 +static INLINE SDIO_STATUS OS_DecHcdReference(PSDHCD pHcd) {
73480 + /* this API was added in version 2.3 which requires access to a field in the HCD structure */
73481 + if (CHECK_API_VERSION_COMPAT(pHcd,2,3)) {
73482 + /* we can safely call the OS-dependent function */
73483 + return Do_OS_DecHcdReference(pHcd);
73484 + }
73485 + return SDIO_STATUS_SUCCESS;
73486 +}
73487 +
73488 +SDIO_STATUS _IssueBusRequestBd(PSDHCD pHcd,
73489 + UINT8 Cmd,
73490 + UINT32 Argument,
73491 + SDREQUEST_FLAGS Flags,
73492 + PSDREQUEST pReqToUse,
73493 + PVOID pData,
73494 + INT Length);
73495 +
73496 +SDIO_STATUS IssueRequestToHCD(PSDHCD pHcd,PSDREQUEST pReq);
73497 +
73498 +#define CALL_HCD_CONFIG(pHcd,pCfg) (pHcd)->pConfigure((pHcd),(pCfg))
73499 + /* macro to force all requests to be asynchronous in the HCD */
73500 +static INLINE BOOL ForceAllRequestsAsync(void) {
73501 + return (pBusContext->ConfigFlags & BD_CONFIG_SDREQ_FORCE_ALL_ASYNC);
73502 +}
73503 +
73504 +static INLINE SDIO_STATUS CallHcdRequest(PSDHCD pHcd) {
73505 +
73506 + if (pHcd->pCurrentRequest->Flags & SDREQ_FLAGS_PSEUDO) {
73507 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: PSEUDO Request 0x%X \n",
73508 + (INT)pHcd->pCurrentRequest));
73509 + /* return successful completion so that processing can finish */
73510 + return SDIO_STATUS_SUCCESS;
73511 + }
73512 +
73513 + if (ForceAllRequestsAsync()) {
73514 + /* all requests must be completed(indicated) in a separate context */
73515 + pHcd->pCurrentRequest->Flags |= SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE;
73516 + } else {
73517 + /* otherwise perform a test on flags in the HCD */
73518 + if (!CHECK_API_VERSION_COMPAT(pHcd,2,6) &&
73519 + AtomicTest_Set(&pHcd->HcdFlags, HCD_REQUEST_CALL_BIT)) {
73520 +
73521 + /* bit was already set, this is a recursive call,
73522 + * we need to tell the HCD to complete the
73523 + * request in a separate context */
73524 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Recursive CallHcdRequest \n"));
73525 + pHcd->pCurrentRequest->Flags |= SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE;
73526 + }
73527 + }
73528 + #ifdef DEBUG
73529 + {
73530 + SDIO_STATUS status;
73531 + BOOL forceDeferred;
73532 + forceDeferred = pHcd->pCurrentRequest->Flags & SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE;
73533 + status = pHcd->pRequest(pHcd);
73534 + if (forceDeferred) {
73535 + /* status better be pending... */
73536 + DBG_ASSERT(status == SDIO_STATUS_PENDING);
73537 + }
73538 + return status;
73539 + }
73540 + #else
73541 + return pHcd->pRequest(pHcd);
73542 + #endif
73543 +
73544 +}
73545 +
73546 +/* note the caller of this macro must take the HCD lock to protect the count */
73547 +#define CHECK_HCD_RECURSE(pHcd,pReq) \
73548 +{ \
73549 + (pHcd)->Recursion++; \
73550 + DBG_ASSERT((pHcd)->Recursion < MAX_HCD_RECURSION_RUNAWAY); \
73551 + if ((pHcd)->Recursion > pBusContext->MaxHcdRecursion) { \
73552 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Recursive Request Count Exceeded (%d) \n",(pHcd)->Recursion)); \
73553 + (pReq)->Flags |= SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE; \
73554 + } \
73555 +}
73556 +
73557 +/* InternalFlags bit number settings */
73558 +#define SDBD_INIT 1
73559 +#define SDBD_PENDING 15
73560 +#define SDBD_ALLOC_IRQ_SAFE 2
73561 +
73562 +#define SDBD_ALLOC_IRQ_SAFE_MASK (1 << SDBD_ALLOC_IRQ_SAFE)
73563 +
73564 +static void INLINE DoRequestCompletion(PSDREQUEST pReq, PSDHCD pHcd) {
73565 + CLEAR_INTERNAL_REQ_FLAGS(pReq);
73566 + if (pReq->pCompletion != NULL) {
73567 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Calling completion on request:0x%X, CMD:%d \n",
73568 + (INT)pReq, pReq->Command));
73569 + /* call completion routine, mark request reusable */
73570 + AtomicTest_Clear(&pReq->InternalFlags, SDBD_PENDING);
73571 + pReq->pCompletion(pReq);
73572 + } else {
73573 + /* mark request reusable */
73574 + AtomicTest_Clear(&pReq->InternalFlags, SDBD_PENDING);
73575 + }
73576 +}
73577 +
73578 +THREAD_RETURN CardDetectHelperFunction(POSKERNEL_HELPER pHelper);
73579 +THREAD_RETURN SDIOIrqHelperFunction(POSKERNEL_HELPER pHelper);
73580 +
73581 +void ConvertSPI_Response(PSDREQUEST pReq, UINT8 *pRespBuffer);
73582 +
73583 +static INLINE SDIO_STATUS PostCardDetectEvent(PBDCONTEXT pSDB, HCD_EVENT Event, PSDHCD pHcd) {
73584 + HCD_EVENT_MESSAGE message;
73585 + SDIO_STATUS status;
73586 + message.Event = Event;
73587 + message.pHcd = pHcd;
73588 +
73589 + if (pHcd != NULL) {
73590 + /* increment HCD reference count to process this HCD message */
73591 + status = OS_IncHcdReference(pHcd);
73592 + if (!SDIO_SUCCESS(status)) {
73593 + return status;
73594 + }
73595 + }
73596 + /* post card detect message */
73597 + status = SDLIB_PostMessage(pSDB->pCardDetectMsgQueue, &message, sizeof(message));
73598 + if (!SDIO_SUCCESS(status)) {
73599 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: PostCardDetectEvent error status %d\n",status));
73600 + if (pHcd != NULL) {
73601 + /* decrement count */
73602 + OS_DecHcdReference(pHcd);
73603 + }
73604 + return status;
73605 + }
73606 + /* wake card detect helper */
73607 + DBG_PRINT(SDIODBG_HCD_EVENTS, ("SDIO Bus Driver: PostCardDetectEvent waking\n"));
73608 + return SD_WAKE_OS_HELPER(&pSDB->CardDetectHelper);
73609 +};
73610 +
73611 +/* initialize device fields */
73612 +static INLINE void InitDeviceData(PSDHCD pHcd, PSDDEVICE pDevice) {
73613 + ZERO_POBJECT(pDevice);
73614 + SDLIST_INIT(&pDevice->SDList);
73615 + SDLIST_INIT(&pDevice->FuncListLink);
73616 + pDevice->pRequest = IssueBusRequest;
73617 + pDevice->pConfigure = IssueBusConfig;
73618 + pDevice->AllocRequest = IssueAllocRequest;
73619 + pDevice->FreeRequest = IssueFreeRequest;
73620 + /* set card flags in the ID */
73621 + pDevice->pId[0].CardFlags = pHcd->CardProperties.Flags;
73622 + pDevice->pFunction = NULL;
73623 + pDevice->pHcd = pHcd;
73624 + SET_SDIO_STACK_VERSION(pDevice);
73625 +}
73626 +
73627 +/* de-initialize device fields */
73628 +static INLINE void DeinitDeviceData(PSDDEVICE pDevice) {
73629 +}
73630 +
73631 +/* reset hcd state */
73632 +static INLINE void ResetHcdState(PSDHCD pHcd) {
73633 + ZERO_POBJECT(&pHcd->CardProperties);
73634 + pHcd->PendingHelperIrqs = 0;
73635 + pHcd->PendingIrqAcks = 0;
73636 + pHcd->IrqsEnabled = 0;
73637 + pHcd->pCurrentRequest = NULL;
73638 + pHcd->IrqProcState = SDHCD_IDLE;
73639 + /* mark this device as special */
73640 + pHcd->pPseudoDev->pId[0].CardFlags = CARD_PSEUDO;
73641 + pHcd->SlotCurrentAllocated = 0;
73642 +}
73643 +
73644 +static INLINE SDIO_STATUS _IssueConfig(PSDHCD pHcd,
73645 + SDCONFIG_COMMAND Command,
73646 + PVOID pData,
73647 + INT Length){
73648 + SDCONFIG configHdr;
73649 + SET_SDCONFIG_CMD_INFO(&configHdr,Command,pData,Length);
73650 + return CALL_HCD_CONFIG(pHcd,&configHdr);
73651 +}
73652 +
73653 +/* prototypes */
73654 +#define _AcquireHcdLock(pHcd)CriticalSectionAcquireSyncIrq(&(pHcd)->HcdCritSection)
73655 +#define _ReleaseHcdLock(pHcd)CriticalSectionReleaseSyncIrq(&(pHcd)->HcdCritSection)
73656 +
73657 +#define AcquireHcdLock(pDev) CriticalSectionAcquireSyncIrq(&(pDev)->pHcd->HcdCritSection)
73658 +#define ReleaseHcdLock(pDev) CriticalSectionReleaseSyncIrq(&(pDev)->pHcd->HcdCritSection)
73659 +
73660 +SDIO_STATUS OS_AddDevice(PSDDEVICE pDevice, PSDFUNCTION pFunction);
73661 +void OS_RemoveDevice(PSDDEVICE pDevice);
73662 +SDIO_STATUS OS_InitializeDevice(PSDDEVICE pDevice, PSDFUNCTION pFunction);
73663 +SDIO_STATUS SetOperationalBusMode(PSDDEVICE pDevice,
73664 + PSDCONFIG_BUS_MODE_DATA pBusMode);
73665 +void FreeDevice(PSDDEVICE pDevice);
73666 +BOOL IsPotentialIdMatch(PSD_PNP_INFO pIdsDev, PSD_PNP_INFO pIdsFuncList);
73667 +
73668 +
73669 +#define CHECK_FUNCTION_DRIVER_VERSION(pF) \
73670 + (GET_SDIO_STACK_VERSION_MAJOR((pF)) == CT_SDIO_STACK_VERSION_MAJOR(g_Version))
73671 +#define CHECK_HCD_DRIVER_VERSION(pH) \
73672 + (GET_SDIO_STACK_VERSION_MAJOR((pH)) == CT_SDIO_STACK_VERSION_MAJOR(g_Version))
73673 +
73674 +/* CLARIFICATION on SDREQ_FLAGS_PSEUDO and SDREQ_FLAGS_BARRIER flags :
73675 + *
73676 + * A request marked as PSEUDO is synchronized with bus requests and is not a true request
73677 + * that is issued to an HCD.
73678 + *
73679 + * A request marked with a BARRIER flag requires that the completion routine be called
73680 + * before the next bus request starts. This is required for HCD requests that can change
73681 + * bus or clock modes. Changing the clock or bus mode while a bus request is pending
73682 + * can cause problems.
73683 + *
73684 + *
73685 + *
73686 + * */
73687 +#define SD_PSEUDO_REQ_FLAGS \
73688 + (SDREQ_FLAGS_PSEUDO | SDREQ_FLAGS_BARRIER | SDREQ_FLAGS_TRANS_ASYNC)
73689 +
73690 +#endif /*___BUSDRIVER_H___*/
73691 Index: linux-2.6.24.7/drivers/sdio/stack/busdriver/Makefile
73692 ===================================================================
73693 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
73694 +++ linux-2.6.24.7/drivers/sdio/stack/busdriver/Makefile 2008-12-11 22:46:49.000000000 +0100
73695 @@ -0,0 +1,2 @@
73696 +obj-$(CONFIG_SDIO) += sdio_busdriver.o
73697 +sdio_busdriver-objs := sdio_bus.o sdio_function.o sdio_bus_misc.o sdio_bus_events.o sdio_bus_os.o
73698 Index: linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_bus.c
73699 ===================================================================
73700 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
73701 +++ linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_bus.c 2008-12-11 22:46:49.000000000 +0100
73702 @@ -0,0 +1,2120 @@
73703 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
73704 +@file: sdio_bus.c
73705 +
73706 +@abstract: OS independent bus driver support
73707 +@category abstract: HD_Reference Host Controller Driver Interfaces.
73708 +@category abstract: PD_Reference
73709 + Peripheral Driver Interfaces.
73710 +
73711 +#notes: this file supports the HCD's and generic functions
73712 +
73713 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
73714 +
73715 +
73716 + *
73717 + * This program is free software; you can redistribute it and/or modify
73718 + * it under the terms of the GNU General Public License version 2 as
73719 + * published by the Free Software Foundation;
73720 + *
73721 + * Software distributed under the License is distributed on an "AS
73722 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
73723 + * implied. See the License for the specific language governing
73724 + * rights and limitations under the License.
73725 + *
73726 + * Portions of this code were developed with information supplied from the
73727 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
73728 + *
73729 + * The following conditions apply to the release of the SD simplified specification (�Simplified
73730 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
73731 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
73732 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
73733 + * Specification may require a license from the SD Card Association or other third parties.
73734 + * Disclaimers:
73735 + * The information contained in the Simplified Specification is presented only as a standard
73736 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
73737 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
73738 + * any damages, any infringements of patents or other right of the SD Card Association or any third
73739 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
73740 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
73741 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
73742 + * information, know-how or other confidential information to any third party.
73743 + *
73744 + *
73745 + * The initial developers of the original code are Seung Yi and Paul Lever
73746 + *
73747 + * sdio@atheros.com
73748 + *
73749 + *
73750 +
73751 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
73752 +#define MODULE_NAME SDBUSDRIVER
73753 +#include <linux/sdio/ctsystem.h>
73754 +#include <linux/sdio/sdio_busdriver.h>
73755 +#include <linux/sdio/_sdio_defs.h>
73756 +#include <linux/sdio/sdio_lib.h>
73757 +#include <linux/sdio/mmc_defs.h>
73758 +#include "_busdriver.h"
73759 +
73760 +/* list of host controller bus drivers */
73761 +PBDCONTEXT pBusContext = NULL;
73762 +static void CleanUpBusResources(void);
73763 +static SDIO_STATUS AllocateBusResources(void);
73764 +static PSIGNAL_ITEM BuildSignal(void);
73765 +static void DestroySignal(PSIGNAL_ITEM pSignal);
73766 +
73767 +const CT_VERSION_CODE g_Version = CT_SDIO_STACK_VERSION_CODE;
73768 +/*
73769 + * _SDIO_BusDriverInitialize - call once on driver loading
73770 + *
73771 +*/
73772 +SDIO_STATUS _SDIO_BusDriverInitialize(void)
73773 +{
73774 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
73775 +
73776 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Version: %d.%d\n",
73777 + CT_SDIO_STACK_VERSION_MAJOR(g_Version),CT_SDIO_STACK_VERSION_MINOR(g_Version)));
73778 +
73779 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: enter _SDIO_BusDriverInitialize\n"));
73780 +
73781 + do {
73782 + /* allocate our internal data initialize it */
73783 + pBusContext = KernelAlloc(sizeof(BDCONTEXT));
73784 + if (pBusContext == NULL) {
73785 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't allocate memory.\n"));
73786 + status = SDIO_STATUS_NO_RESOURCES;
73787 + break;
73788 + }
73789 + memset(pBusContext,0,sizeof(BDCONTEXT));
73790 + SDLIST_INIT(&pBusContext->RequestList);
73791 + SDLIST_INIT(&pBusContext->HcdList);
73792 + SDLIST_INIT(&pBusContext->DeviceList);
73793 + SDLIST_INIT(&pBusContext->FunctionList);
73794 + SDLIST_INIT(&pBusContext->SignalList);
73795 +
73796 + /* setup defaults */
73797 + pBusContext->RequestRetries = SDMMC_DEFAULT_CMD_RETRIES;
73798 + pBusContext->CardReadyPollingRetry = SDMMC_DEFAULT_CARD_READY_RETRIES;
73799 + pBusContext->PowerSettleDelay = SDMMC_POWER_SETTLE_DELAY;
73800 + pBusContext->DefaultOperClock = MMC_HS_MAX_BUS_CLOCK;
73801 + pBusContext->DefaultBusMode = SDCONFIG_BUS_WIDTH_4_BIT;
73802 + pBusContext->RequestListSize = SDBUS_DEFAULT_REQ_LIST_SIZE;
73803 + pBusContext->SignalSemListSize = SDBUS_DEFAULT_REQ_SIG_SIZE;
73804 + pBusContext->CDPollingInterval = SDBUS_DEFAULT_CD_POLLING_INTERVAL;
73805 + pBusContext->DefaultOperBlockLen = SDMMC_DEFAULT_BYTES_PER_BLOCK;
73806 + pBusContext->DefaultOperBlockCount = SDMMC_DEFAULT_BLOCKS_PER_TRANS;
73807 + pBusContext->ConfigFlags = BD_DEFAULT_CONFIG_FLAGS;
73808 + pBusContext->CMD13PollingMultiplier = SDMMC_CMD13_POLLING_MULTIPLIER;
73809 + pBusContext->MaxHcdRecursion = MAX_HCD_REQ_RECURSION;
73810 +
73811 + /* get overrides for the defaults */
73812 + status = _SDIO_BusGetDefaultSettings(pBusContext);
73813 + if (!SDIO_SUCCESS(status)) {
73814 + break;
73815 + }
73816 +
73817 + pBusContext->MaxRequestAllocations = pBusContext->RequestListSize << 1;
73818 + pBusContext->MaxSignalAllocations = pBusContext->SignalSemListSize << 1;
73819 +
73820 + status = CriticalSectionInit(&pBusContext->RequestListCritSection);
73821 + if (!SDIO_SUCCESS(status)) {
73822 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't CriticalSectionInit.\n"));
73823 + break;
73824 + }
73825 + status = SemaphoreInitialize(&pBusContext->HcdListSem, 1);
73826 + if (!SDIO_SUCCESS(status)) {
73827 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't SemaphoreInitialize HcdListSem.\n"));
73828 + break;
73829 + }
73830 + status = SemaphoreInitialize(&pBusContext->DeviceListSem, 1);
73831 + if (!SDIO_SUCCESS(status)) {
73832 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't SemaphoreInitialize DeviceListSem.\n"));
73833 + break;
73834 + }
73835 + status = SemaphoreInitialize(&pBusContext->FunctionListSem, 1);
73836 + if (!SDIO_SUCCESS(status)) {
73837 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't SemaphoreInitialize FunctionListSem.\n"));
73838 + break;
73839 + }
73840 + status = AllocateBusResources();
73841 + if (!SDIO_SUCCESS(status)) {
73842 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't AllocateBusResources.\n"));
73843 + break;
73844 + }
73845 +
73846 + pBusContext->InitMask |= RESOURCE_INIT;
73847 +
73848 + pBusContext->pCardDetectMsgQueue = SDLIB_CreateMessageQueue(MAX_CARD_DETECT_MSGS,
73849 + sizeof(HCD_EVENT_MESSAGE));
73850 +
73851 + if (NULL == pBusContext->pCardDetectMsgQueue) {
73852 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't CreateMessageQueue.\n"));
73853 + status = SDIO_STATUS_NO_RESOURCES;
73854 + break;
73855 + }
73856 +
73857 + status = SDLIB_OSCreateHelper(&pBusContext->CardDetectHelper,
73858 + CardDetectHelperFunction,
73859 + NULL);
73860 +
73861 + if (!SDIO_SUCCESS(status)) {
73862 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't OSCreateHelper.\n"));
73863 + break;
73864 + }
73865 +
73866 + pBusContext->InitMask |= HELPER_INIT;
73867 +
73868 + status = InitializeTimers();
73869 + if (!SDIO_SUCCESS(status)) {
73870 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_BusDriverInitialize can't InitializeTimers.\n"));
73871 + break;
73872 + }
73873 + pBusContext->InitMask |= BD_TIMER_INIT;
73874 + } while(FALSE);
73875 +
73876 + if (!SDIO_SUCCESS(status)) {
73877 + _SDIO_BusDriverCleanup();
73878 + }
73879 +
73880 + return status;
73881 +}
73882 +
73883 +
73884 +/*
73885 + * _SDIO_BusDriverBusDriverCleanup - call once on driver unloading
73886 + *
73887 +*/
73888 +void _SDIO_BusDriverCleanup(void) {
73889 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: _SDIO_BusDriverCleanup\n"));
73890 +
73891 + if (pBusContext->InitMask & BD_TIMER_INIT) {
73892 + CleanupTimers();
73893 + }
73894 +
73895 + if (pBusContext->InitMask & HELPER_INIT) {
73896 + SDLIB_OSDeleteHelper(&pBusContext->CardDetectHelper);
73897 + }
73898 +
73899 + if (pBusContext->pCardDetectMsgQueue != NULL) {
73900 + SDLIB_DeleteMessageQueue(pBusContext->pCardDetectMsgQueue);
73901 + pBusContext->pCardDetectMsgQueue = NULL;
73902 + }
73903 + /* remove functions */
73904 + RemoveAllFunctions();
73905 + /* cleanup all devices */
73906 + DeleteDevices(NULL);
73907 + CleanUpBusResources();
73908 + CriticalSectionDelete(&pBusContext->RequestListCritSection);
73909 + SemaphoreDelete(&pBusContext->HcdListSem);
73910 + SemaphoreDelete(&pBusContext->DeviceListSem);
73911 + SemaphoreDelete(&pBusContext->FunctionListSem);
73912 + KernelFree(pBusContext);
73913 + pBusContext = NULL;
73914 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: _SDIO_BusDriverCleanup\n"));
73915 +}
73916 +
73917 +
73918 +/* cleanup hcd */
73919 +static void CleanupHcd(PSDHCD pHcd)
73920 +{
73921 + SDLIB_OSDeleteHelper(&pHcd->SDIOIrqHelper);
73922 + CleanupRequestQueue(&pHcd->CompletedRequestQueue);
73923 + CleanupRequestQueue(&pHcd->RequestQueue);
73924 + CriticalSectionDelete(&pHcd->HcdCritSection);
73925 + SemaphoreDelete(&pHcd->ConfigureOpsSem);
73926 + pHcd->pCurrentRequest = NULL;
73927 + if (pHcd->pPseudoDev != NULL) {
73928 + FreeDevice(pHcd->pPseudoDev);
73929 + pHcd->pPseudoDev = NULL;
73930 + }
73931 +}
73932 +
73933 +/* set up the hcd */
73934 +static SDIO_STATUS SetupHcd(PSDHCD pHcd)
73935 +{
73936 + SDIO_STATUS status;
73937 +
73938 + ZERO_POBJECT(&pHcd->SDIOIrqHelper);
73939 + ZERO_POBJECT(&pHcd->ConfigureOpsSem);
73940 + ZERO_POBJECT(&pHcd->HcdCritSection);
73941 + ZERO_POBJECT(&pHcd->RequestQueue);
73942 + ZERO_POBJECT(&pHcd->CompletedRequestQueue);
73943 + pHcd->pPseudoDev = NULL;
73944 + pHcd->Recursion = 0;
73945 +
73946 + do {
73947 +
73948 + pHcd->pPseudoDev = AllocateDevice(pHcd);
73949 +
73950 + if (NULL == pHcd->pPseudoDev) {
73951 + status = SDIO_STATUS_NO_RESOURCES;
73952 + break;
73953 + }
73954 +
73955 + ResetHcdState(pHcd);
73956 +
73957 + status = SemaphoreInitialize(&pHcd->ConfigureOpsSem,1);
73958 + if (!SDIO_SUCCESS(status)) {
73959 + break;
73960 + }
73961 + status = CriticalSectionInit(&pHcd->HcdCritSection);
73962 + if (!SDIO_SUCCESS(status)) {
73963 + break;
73964 + }
73965 + status = InitializeRequestQueue(&pHcd->RequestQueue);
73966 + if (!SDIO_SUCCESS(status)) {
73967 + break;
73968 + }
73969 + status = InitializeRequestQueue(&pHcd->CompletedRequestQueue);
73970 + if (!SDIO_SUCCESS(status)) {
73971 + break;
73972 + }
73973 + /* create SDIO Irq helper */
73974 + status = SDLIB_OSCreateHelper(&pHcd->SDIOIrqHelper,
73975 + SDIOIrqHelperFunction,
73976 + (PVOID)pHcd);
73977 + } while(FALSE);
73978 +
73979 + if (!SDIO_SUCCESS(status)) {
73980 + /* undo what we did */
73981 + CleanupHcd(pHcd);
73982 + }
73983 + return status;
73984 +}
73985 +
73986 +
73987 +/*
73988 + * _SDIO_RegisterHostController - register a host controller bus driver
73989 + *
73990 +*/
73991 +
73992 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
73993 + @function: Register a host controller driver with the bus driver.
73994 +
73995 + @function name: SDIO_RegisterHostController
73996 + @prototype: SDIO_STATUS SDIO_RegisterHostController (PSDHCD pHcd)
73997 + @category: HD_Reference
73998 +
73999 + @input: pHcd - the host controller definition structure.
74000 +
74001 + @output: none
74002 +
74003 + @return: SDIO_STATUS - SDIO_STATUS_SUCCESS when successful.
74004 +
74005 + @notes: Each host controller driver must register with the bus driver when loaded.
74006 + The driver registers an SDHCD structure initialized with hardware properties
74007 + and callback functions for bus requests and configuration. On multi-slot
74008 + hardware ,each slot should be registered with a separate SDHCD structure.
74009 + The bus driver views each slot as a seperate host controller object.
74010 + The driver should be prepared to receive configuration requests before
74011 + this call returns. The host controller driver must unregister itself when
74012 + shutting down.
74013 +
74014 + @example: Registering a host controller driver:
74015 + static SDHCD Hcd = {
74016 + .pName = "sdio_custom_hcd",
74017 + .Version = CT_SDIO_STACK_VERSION_CODE, // set stack version code
74018 + .SlotNumber = 0, // bus driver internal use
74019 + .Attributes = SDHCD_ATTRIB_BUS_1BIT | SDHCD_ATTRIB_BUS_4BIT | SDHCD_ATTRIB_MULTI_BLK_IRQ
74020 + SDHCD_ATTRIB_AUTO_CMD12 ,
74021 + .MaxBytesPerBlock = 2048 // each data block can be up to 2048 bytes
74022 + .MaxBlocksPerTrans = 1024, // each data transaction can consist of 1024 blocks
74023 + .MaxSlotCurrent = 500, // max FET switch current rating
74024 + .SlotVoltageCaps = SLOT_POWER_3_3V, // only 3.3V operation
74025 + .SlotVoltagePreferred = SLOT_POWER_3_3V,
74026 + .MaxClockRate = 24000000, // 24 Mhz max operation
74027 + .pContext = &HcdContext, // set our driver context
74028 + .pRequest = HcdRequest, // set SDIO bus request callback
74029 + .pConfigure = HcdConfig, // set SDIO bus configuration callback
74030 + };
74031 + if (!SDIO_SUCCESS((status = SDIO_RegisterHostController(&Hcd)))) {
74032 + DBG_PRINT(SDDBG_ERROR, ("SDIO HCD - failed to register with host, status =%d\n",
74033 + status));
74034 + }
74035 +
74036 + @see also: SDIO_UnregisterHostController
74037 +
74038 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
74039 +SDIO_STATUS _SDIO_RegisterHostController(PSDHCD pHcd) {
74040 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
74041 +
74042 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: _SDIO_RegisterHostController - %s\n",pHcd->pName));
74043 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: Host Controller Stack Version: %d.%d \n",
74044 + GET_SDIO_STACK_VERSION_MAJOR(pHcd),GET_SDIO_STACK_VERSION_MINOR(pHcd)));
74045 +
74046 + if (!CHECK_HCD_DRIVER_VERSION(pHcd)) {
74047 + DBG_PRINT(SDDBG_ERROR,
74048 + ("SDIO Bus Driver: HCD Major Version Mismatch (hcd = %d, bus driver = %d)\n",
74049 + GET_SDIO_STACK_VERSION_MAJOR(pHcd), CT_SDIO_STACK_VERSION_MAJOR(g_Version)));
74050 + return SDIO_STATUS_INVALID_PARAMETER;
74051 + }
74052 + /* setup hcd */
74053 + status = SetupHcd(pHcd);
74054 + if (!SDIO_SUCCESS(status)) {
74055 + return status;
74056 + }
74057 +
74058 + do {
74059 + INT slotNumber;
74060 +
74061 + /* protect the HCD list */
74062 + if (!SDIO_SUCCESS((status = SemaphorePendInterruptable(&pBusContext->HcdListSem)))) {
74063 + break; /* wait interrupted */
74064 + }
74065 + /* find a unique number for this HCD, must be done under semaphore protection */
74066 + slotNumber = FirstClearBit(&pBusContext->HcdInUseField);
74067 + if (slotNumber < 0) {
74068 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_RegisterHostController, error, slotNumber exceeded\n"));
74069 + /* fake something */
74070 + slotNumber = 31;
74071 + }
74072 + SetBit(&pBusContext->HcdInUseField, slotNumber);
74073 + pHcd->SlotNumber = slotNumber;
74074 + /* add HCD to the end of the internal list */
74075 + SDListAdd(&pBusContext->HcdList , &pHcd->SDList);
74076 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->HcdListSem)))) {
74077 + break; /* wait interrupted */
74078 + }
74079 + if (pHcd->Attributes & SDHCD_ATTRIB_SLOT_POLLING) {
74080 + /* post message to card detect helper to do polling */
74081 + PostCardDetectEvent(pBusContext, EVENT_HCD_CD_POLLING, NULL);
74082 + }
74083 + } while (FALSE);
74084 +
74085 + if (!SDIO_SUCCESS(status)) {
74086 + CleanupHcd(pHcd);
74087 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_RegisterHostController, error 0x%X.\n", status));
74088 + }
74089 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: _SDIO_RegisterHostController\n"));
74090 + return status;
74091 +}
74092 +
74093 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
74094 + @function: Unregister a host controller driver with the bus driver.
74095 +
74096 + @function name: SDIO_UnregisterHostController
74097 + @prototype: SDIO_STATUS SDIO_UnregisterHostController (PSDHCD pHcd)
74098 + @category: HD_Reference
74099 +
74100 + @input: pHcd - the host controller definition structure that was registered.
74101 +
74102 + @output: none
74103 +
74104 + @return: SDIO_STATUS - SDIO_STATUS_SUCCESS when successful.
74105 +
74106 + @notes: Each host controller driver must unregister with the bus driver when
74107 + unloading. The driver is responsible for halting any outstanding I/O
74108 + operations. The bus driver will automatically unload function drivers
74109 + that may be attached assigned to cards inserted into slots.
74110 +
74111 + @example: Unregistering a host controller driver:
74112 + if (!SDIO_SUCCESS((status = SDIO_UnregisterHostController(&Hcd)))) {
74113 + DBG_PRINT(SDDBG_ERROR, ("SDIO HCD - failed to unregister with host, status =%d\n",
74114 + status));
74115 + }
74116 +
74117 + @see also: SDIO_RegisterHostController
74118 +
74119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
74120 +SDIO_STATUS _SDIO_UnregisterHostController(PSDHCD pHcd) {
74121 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
74122 +
74123 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: _SDIO_UnregisterHostController\n"));
74124 +
74125 + /* remove functions associated with the HCD */
74126 + RemoveHcdFunctions(pHcd);
74127 + /* remove any devices associated with the HCD */
74128 + DeleteDevices(pHcd);
74129 + /* wait for the message queue to be empty, so we don't have any delayed requests going
74130 + to this device */
74131 + while(!SDLIB_IsQueueEmpty(pBusContext->pCardDetectMsgQueue)) {
74132 + /* wait for the messages to be handled */
74133 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: _SDIO_UnregisterHostController, waiting on messages\n"));
74134 + OSSleep(250);
74135 + }
74136 +
74137 + /* protect the HCD list */
74138 + if (!SDIO_SUCCESS((status = SemaphorePendInterruptable(&pBusContext->HcdListSem)))) {
74139 + goto cleanup; /* wait interrupted */
74140 + }
74141 + ClearBit(&pBusContext->HcdInUseField, pHcd->SlotNumber);
74142 + /* delete HCD from list */
74143 + SDListRemove(&pHcd->SDList);
74144 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->HcdListSem)))) {
74145 + goto cleanup; /* wait interrupted */
74146 + }
74147 + /* cleanup anything we allocated */
74148 + CleanupHcd(pHcd);
74149 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: _SDIO_UnregisterHostController\n"));
74150 + return status;
74151 +cleanup:
74152 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_UnregisterHostController, error 0x%X.\n", status));
74153 + return status;
74154 +}
74155 +
74156 +/* documentation headers only for Request and Configure */
74157 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
74158 + @function: The bus driver calls the request callback to start an SDIO bus transaction.
74159 + @function name: Request
74160 + @prototype: SDIO_STATUS (*pRequest) (struct _SDHCD *pHcd)
74161 + @category: HD_Reference
74162 +
74163 + @input: pHcd - the host controller structure that was registered
74164 +
74165 + @output: none
74166 +
74167 + @return: SDIO_STATUS
74168 +
74169 + @notes:
74170 + The bus driver maintains an internal queue of SDREQUEST structures submited by function
74171 + drivers. The driver should use request macros to obtain a pointer to the current SDREQUEST
74172 + at the head of the queue. The driver can access the fields of the current request in order
74173 + to program hardware appropriately. Once the request completes, the driver should update
74174 + the current request information (final status, response bytes and/or data) and call
74175 + SDIO_HandleHcdEvent() with the event type of EVENT_HCD_TRANSFER_DONE.
74176 + The bus driver will remove the current request from the head of the queue and start the next
74177 + request.
74178 +
74179 + @example: Example of a typical Request callback:
74180 + SDIO_STATUS HcdRequest(PSDHCD pHcd)
74181 + {
74182 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
74183 + PSDHCD_DRIVER_CONTEXT pHct = (PSDHCD_DRIVER_CONTEXT)pHcd->pContext;
74184 + UINT32 temp = 0;
74185 + PSDREQUEST pReq;
74186 + // get the current request
74187 + pReq = GET_CURRENT_REQUEST(pHcd);
74188 + DBG_ASSERT(pReq != NULL);
74189 + // get controller settings based on response type
74190 + switch (GET_SDREQ_RESP_TYPE(pReq->Flags)) {
74191 + case SDREQ_FLAGS_NO_RESP:
74192 + break;
74193 + case SDREQ_FLAGS_RESP_R1:
74194 + case SDREQ_FLAGS_RESP_MMC_R4:
74195 + case SDREQ_FLAGS_RESP_MMC_R5:
74196 + case SDREQ_FLAGS_RESP_R6:
74197 + case SDREQ_FLAGS_RESP_SDIO_R5:
74198 + temp |= CMDDAT_RES_R1_R4_R5;
74199 + break;
74200 + case SDREQ_FLAGS_RESP_R1B:
74201 + temp |= (CMDDAT_RES_R1_R4_R5 | CMDAT_RES_BUSY);
74202 + break;
74203 + case SDREQ_FLAGS_RESP_R2:
74204 + temp |= CMDDAT_RES_R2;
74205 + break;
74206 + case SDREQ_FLAGS_RESP_R3:
74207 + case SDREQ_FLAGS_RESP_SDIO_R4:
74208 + temp |= CMDDAT_RES_R3;
74209 + break;
74210 + }
74211 + // check for data
74212 + if (pReq->Flags & SDREQ_FLAGS_DATA_TRANS){
74213 + temp |= CMDDAT_DATA_EN;
74214 + // set data remaining count
74215 + pReq->DataRemaining = pReq->BlockLen * pReq->BlockCount;
74216 + DBG_PRINT(TRACE_DATA, ("SDIO %s Data Transfer, Blocks:%d, BlockLen:%d, Total:%d \n",
74217 + IS_SDREQ_WRITE_DATA(pReq->Flags) ? "TX":"RX",
74218 + pReq->BlockCount, pReq->BlockLen, pReq->DataRemaining));
74219 + if (IS_SDREQ_WRITE_DATA(pReq->Flags)) {
74220 + // write operation
74221 + }
74222 + }
74223 + // .... program hardware, interrupt handler will complete request
74224 + return SDIO_STATUS_PENDING;
74225 + }
74226 +
74227 + @see also: SDIO_HandleHcdEvent
74228 +
74229 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
74230 +
74231 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
74232 + @function: The bus driver calls the configure callback to set various options
74233 + and modes in the host controller hardware.
74234 +
74235 + @function name: Configure
74236 + @prototype: SDIO_STATUS (*pConfigure) (struct _SDHCD *pHcd, PSDCONFIG pConfig)
74237 + @category: HD_Reference
74238 +
74239 + @input: pHcd - the host controller structure that was registered
74240 + @input: pConfig - configuration request structure
74241 +
74242 + @output: none
74243 +
74244 + @return: SDIO_STATUS
74245 +
74246 + @notes:
74247 + The host controller driver recieves configuration requests for options
74248 + such as slot voltage, bus width, clock rates and interrupt detection.
74249 + The bus driver guarantees that only one configuration option request
74250 + can be issued at a time.
74251 +
74252 + @example: Example of a typical configure callback:
74253 + SDIO_STATUS HcdConfig(PSDHCD pHcd, PSDCONFIG pConfig)
74254 + {
74255 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
74256 + PSDHCD_DRIVER_CONTEXT pHct = (PSDHCD_DRIVER_CONTEXT)pHcd->pContext;
74257 + UINT16 command;
74258 + // get command
74259 + command = GET_SDCONFIG_CMD(pConfig);
74260 + // decode command
74261 + switch (command){
74262 + case SDCONFIG_GET_WP:
74263 + if (GetGpioPinLevel(pHct,SDIO_CARD_WP_GPIO) == WP_POLARITY) {
74264 + *((SDCONFIG_WP_VALUE *)pConfig->pData) = 1;
74265 + } else {
74266 + *((SDCONFIG_WP_VALUE *)pConfig->pData) = 0;
74267 + }
74268 + break;
74269 + case SDCONFIG_SEND_INIT_CLOCKS:
74270 + ClockStartStop(pHct,CLOCK_ON);
74271 + // sleep a little, should be at least 80 clocks at our lowest clock setting
74272 + status = OSSleep(100);
74273 + ClockStartStop(pHct,CLOCK_OFF);
74274 + break;
74275 + case SDCONFIG_SDIO_INT_CTRL:
74276 + if (GET_SDCONFIG_CMD_DATA(PSDCONFIG_SDIO_INT_CTRL_DATA,pConfig)->SlotIRQEnable) {
74277 + // request to enable IRQ detection
74278 + } else {
74279 + // request to disable IRQ detectioon
74280 + }
74281 + break;
74282 + case SDCONFIG_SDIO_REARM_INT:
74283 + // request to re-arm the card IRQ detection logic
74284 + break;
74285 + case SDCONFIG_BUS_MODE_CTRL:
74286 + // request to set bus mode
74287 + {
74288 + // get bus mode data structure
74289 + PSDCONFIG_BUS_MODE_DATA pBusMode =
74290 + GET_SDCONFIG_CMD_DATA(PSDCONFIG_SDIO_INT_CTRL_DATA,pConfig);
74291 + // set bus mode based on settings in bus mode structure
74292 + // bus mode : pBusMode->BusModeFlags
74293 + // clock rate : pBusMode->ClockRate
74294 + }
74295 + break;
74296 + case SDCONFIG_POWER_CTRL:
74297 + // request to set power/voltage
74298 + {
74299 + PSDCONFIG_POWER_CTRL_DATA pPowerSetting =
74300 + GET_SDCONFIG_CMD_DATA(PSDCONFIG_POWER_CTRL_DATA,pConfig);
74301 + if (pPowerSetting->SlotPowerEnable) {
74302 + // turn on slot power
74303 + //
74304 + } else {
74305 + // turn off slot power
74306 + }
74307 + DBG_PRINT(PXA_TRACE_CONFIG, ("SDIO PXA255 PwrControl: En:%d, VCC:0x%X \n",
74308 + pPowerSetting->SlotPowerEnable,
74309 + pPowerSetting->SlotPowerVoltageMask));
74310 + }
74311 + break;
74312 + default:
74313 + // unsupported
74314 + status = SDIO_STATUS_INVALID_PARAMETER;
74315 + }
74316 + return status;
74317 + }
74318 +
74319 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
74320 +
74321 +
74322 +/*
74323 + * Allocate a Device instance
74324 + */
74325 +PSDDEVICE AllocateDevice(PSDHCD pHcd)
74326 +{
74327 + PSDDEVICE pDevice;
74328 +
74329 + pDevice = KernelAlloc(sizeof(SDDEVICE));
74330 + if (pDevice != NULL) {
74331 + InitDeviceData(pHcd,pDevice);
74332 + }
74333 + return pDevice;
74334 +}
74335 +
74336 +
74337 +/*
74338 + * Free a Device instance
74339 + */
74340 +void FreeDevice(PSDDEVICE pDevice)
74341 +{
74342 + DeinitDeviceData(pDevice);
74343 + KernelFree(pDevice);
74344 +}
74345 +/*
74346 + * add this device to the list
74347 + */
74348 +BOOL AddDeviceToList(PSDDEVICE pDevice)
74349 +{
74350 + BOOL success = FALSE;
74351 +
74352 + do {
74353 + /* protect the driver list */
74354 + if (!SDIO_SUCCESS(SemaphorePendInterruptable(&pBusContext->DeviceListSem))) {
74355 + break; /* wait interrupted */
74356 + }
74357 +
74358 + /* add new device to the internal list */
74359 + SDListAdd(&pBusContext->DeviceList , &pDevice->SDList);
74360 +
74361 + if (!SDIO_SUCCESS(SemaphorePost(&pBusContext->DeviceListSem))) {
74362 + break;
74363 + }
74364 +
74365 + success = TRUE;
74366 + } while (FALSE);
74367 +
74368 + return success;
74369 +}
74370 +
74371 +/*
74372 + * Delete device associated with the HCD
74373 + * if pHCD is NULL this function cleans up all devices, the caller
74374 + * better have cleaned up functions first!
74375 + */
74376 +SDIO_STATUS DeleteDevices(PSDHCD pHcd)
74377 +{
74378 + SDIO_STATUS status;
74379 + PSDDEVICE pDevice;
74380 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: DeleteDevices hcd:0x%X \n", (INT)pHcd));
74381 + /* protect the device list */
74382 + if (!SDIO_SUCCESS((status = SemaphorePendInterruptable(&pBusContext->DeviceListSem)))) {
74383 + goto cleanup; /* wait interrupted */
74384 + }
74385 + SDITERATE_OVER_LIST_ALLOW_REMOVE(&pBusContext->DeviceList,pDevice,SDDEVICE,SDList) {
74386 + /* only remove devices for the hcd or if we are cleaning up all */
74387 + if ((NULL == pHcd) || (pDevice->pHcd == pHcd)) {
74388 + SDListRemove(&pDevice->SDList);
74389 + DeinitDeviceData(pDevice);
74390 + FreeDevice(pDevice);
74391 + }
74392 + }SDITERATE_END;
74393 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->DeviceListSem)))) {
74394 + goto cleanup; /* wait interrupted */
74395 + }
74396 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: DeleteDevices \n"));
74397 + return status;
74398 +cleanup:
74399 + DBG_PRINT(SDDBG_ERROR, ("-SDIO Bus Driver: DeleteDevice, error exit 0x%X\n", status));
74400 + return status;
74401 +}
74402 +
74403 +
74404 +static SDIO_STATUS AllocateBusResources(void)
74405 +{
74406 + INT ii;
74407 + PSDREQUEST pReq;
74408 + PSIGNAL_ITEM pSignal;
74409 +
74410 + DBG_PRINT(SDDBG_TRACE,
74411 + ("+SDIO Bus Driver: AllocateBusResources (R:%d,S:%d) (CR:%d,MR:%d)(CS:%d,MS:%d) \n",
74412 + pBusContext->RequestListSize,
74413 + pBusContext->SignalSemListSize,
74414 + pBusContext->CurrentRequestAllocations,pBusContext->MaxRequestAllocations,
74415 + pBusContext->CurrentSignalAllocations,pBusContext->MaxSignalAllocations));
74416 +
74417 + /* allocate some initial requests */
74418 + for (ii = 0; ii < pBusContext->RequestListSize; ii++) {
74419 + pReq = AllocateRequest();
74420 + if (pReq == NULL) {
74421 + break;
74422 + }
74423 + /* free requests adds the request to the list */
74424 + FreeRequest(pReq);
74425 + }
74426 +
74427 + for (ii = 0; ii < pBusContext->SignalSemListSize; ii++) {
74428 + pSignal = AllocateSignal();
74429 + if (pSignal == NULL) {
74430 + break;
74431 + }
74432 + /* freeing it adds it to the list */
74433 + FreeSignal(pSignal);
74434 + }
74435 +
74436 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: AllocateBusResources\n"));
74437 + return SDIO_STATUS_SUCCESS;
74438 +}
74439 +
74440 +
74441 +/* cleanup bus resources */
74442 +static void CleanUpBusResources(void)
74443 +{
74444 + PSDLIST pItem;
74445 + PSDREQUEST pReq;
74446 + PSIGNAL_ITEM pSignal;
74447 +
74448 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: CleanUpBusResources (CR:%d,MR:%d)(CS:%d,MS:%d) \n",
74449 + pBusContext->CurrentRequestAllocations,pBusContext->MaxRequestAllocations,
74450 + pBusContext->CurrentSignalAllocations,pBusContext->MaxSignalAllocations));
74451 +
74452 + while(1) {
74453 + pItem = SDListRemoveItemFromHead(&pBusContext->RequestList);
74454 + if (NULL == pItem) {
74455 + break;
74456 + }
74457 + /* free the request */
74458 + pReq = CONTAINING_STRUCT(pItem, SDREQUEST, SDList);
74459 + if (pReq->InternalFlags & SDBD_ALLOC_IRQ_SAFE_MASK) {
74460 + KernelFreeIrqSafe(pReq);
74461 + } else {
74462 + KernelFree(pReq);
74463 + }
74464 + pBusContext->CurrentRequestAllocations--;
74465 + }
74466 +
74467 + if (pBusContext->CurrentRequestAllocations != 0) {
74468 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Request allocations are not ZERO! (CR:%d)\n",
74469 + pBusContext->CurrentRequestAllocations));
74470 + }
74471 +
74472 + while(1) {
74473 + pItem = SDListRemoveItemFromHead(&pBusContext->SignalList);
74474 + if (NULL == pItem) {
74475 + break;
74476 + }
74477 + pSignal = CONTAINING_STRUCT(pItem, SIGNAL_ITEM, SDList);
74478 + DestroySignal(pSignal);
74479 + pBusContext->CurrentSignalAllocations--;
74480 + }
74481 +
74482 + if (pBusContext->CurrentSignalAllocations != 0) {
74483 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Signal allocations are not ZERO! (CR:%d)\n",
74484 + pBusContext->CurrentRequestAllocations));
74485 + }
74486 +
74487 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: CleanUpBusResources\n"));
74488 +}
74489 +
74490 +
74491 +/* free a request to the lookaside list */
74492 +void FreeRequest(PSDREQUEST pReq)
74493 +{
74494 + SDIO_STATUS status;
74495 + CT_DECLARE_IRQ_SYNC_CONTEXT();
74496 +
74497 + status = CriticalSectionAcquireSyncIrq(&pBusContext->RequestListCritSection);
74498 + /* protect request list */
74499 + if (!SDIO_SUCCESS(status)) {
74500 + return;
74501 + }
74502 +
74503 + if ((pBusContext->CurrentRequestAllocations <= pBusContext->MaxRequestAllocations) ||
74504 + !(pReq->InternalFlags & SDBD_ALLOC_IRQ_SAFE_MASK)) {
74505 + /* add it to the list */
74506 + SDListAdd(&pBusContext->RequestList, &pReq->SDList);
74507 + /* we will hold onto this one */
74508 + pReq = NULL;
74509 + } else {
74510 + /* decrement count */
74511 + pBusContext->CurrentRequestAllocations--;
74512 + }
74513 +
74514 + status = CriticalSectionReleaseSyncIrq(&pBusContext->RequestListCritSection);
74515 +
74516 + if (pReq != NULL) {
74517 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Free Request allocation (CR:%d,MR:%d)\n",
74518 + pBusContext->CurrentRequestAllocations,pBusContext->MaxRequestAllocations));
74519 + if (pReq->InternalFlags & SDBD_ALLOC_IRQ_SAFE_MASK) {
74520 + KernelFreeIrqSafe(pReq);
74521 + } else {
74522 + /* we should never free the ones that were normally allocated */
74523 + DBG_ASSERT(FALSE);
74524 + }
74525 + }
74526 +}
74527 +
74528 +/* allocate a request from the lookaside list */
74529 +PSDREQUEST AllocateRequest(void)
74530 +{
74531 + PSDLIST pItem;
74532 + SDIO_STATUS status;
74533 + PSDREQUEST pReq = NULL;
74534 + ATOMIC_FLAGS internalflags;
74535 + CT_DECLARE_IRQ_SYNC_CONTEXT();
74536 +
74537 +
74538 + status = CriticalSectionAcquireSyncIrq(&pBusContext->RequestListCritSection);
74539 +
74540 + if (!SDIO_SUCCESS(status)) {
74541 + return NULL;
74542 + }
74543 +
74544 + if (pBusContext->InitMask & RESOURCE_INIT) {
74545 + /* check the list, we are now running... */
74546 + pItem = SDListRemoveItemFromHead(&pBusContext->RequestList);
74547 + } else {
74548 + /* we are loading the list with requests at initialization */
74549 + pItem = NULL;
74550 + }
74551 + status = CriticalSectionReleaseSyncIrq(&pBusContext->RequestListCritSection);
74552 +
74553 + if (pItem != NULL) {
74554 + pReq = CONTAINING_STRUCT(pItem, SDREQUEST, SDList);
74555 + } else {
74556 + if (pBusContext->InitMask & RESOURCE_INIT) {
74557 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Request List empty..allocating new one (irq-safe) (CR:%d,MR:%d)\n",
74558 + pBusContext->CurrentRequestAllocations,pBusContext->MaxRequestAllocations));
74559 + /* the resource list was already allocated, we must be running now.
74560 + * at run-time, we allocate using the safe IRQ */
74561 + pReq = (PSDREQUEST)KernelAllocIrqSafe(sizeof(SDREQUEST));
74562 + /* mark that this one was created using IRQ safe allocation */
74563 + internalflags = SDBD_ALLOC_IRQ_SAFE_MASK;
74564 + } else {
74565 + /* use the normal allocation since we are called at initialization */
74566 + pReq = (PSDREQUEST)KernelAlloc(sizeof(SDREQUEST));
74567 + internalflags = 0;
74568 + }
74569 +
74570 + if (pReq != NULL) {
74571 + pReq->InternalFlags = internalflags;
74572 + /* keep track of allocations */
74573 + status = CriticalSectionAcquireSyncIrq(&pBusContext->RequestListCritSection);
74574 + pBusContext->CurrentRequestAllocations++;
74575 + status = CriticalSectionReleaseSyncIrq(&pBusContext->RequestListCritSection);
74576 + }
74577 + }
74578 +
74579 +
74580 + if (pReq != NULL) {
74581 + /* preserve internal flags */
74582 + internalflags = pReq->InternalFlags;
74583 + ZERO_POBJECT(pReq);
74584 + pReq->InternalFlags = internalflags;
74585 + }
74586 +
74587 + return pReq;
74588 +}
74589 +
74590 +void DestroySignal(PSIGNAL_ITEM pSignal)
74591 +{
74592 + SignalDelete(&pSignal->Signal);
74593 + KernelFree(pSignal);
74594 +}
74595 +
74596 +PSIGNAL_ITEM BuildSignal(void)
74597 +{
74598 + PSIGNAL_ITEM pSignal;
74599 +
74600 + pSignal = (PSIGNAL_ITEM)KernelAlloc(sizeof(SIGNAL_ITEM));
74601 + if (pSignal != NULL) {
74602 + /* initialize signal */
74603 + if (!SDIO_SUCCESS(SignalInitialize(&pSignal->Signal))) {
74604 + KernelFree(pSignal);
74605 + pSignal = NULL;
74606 + }
74607 + }
74608 + return pSignal;
74609 +}
74610 +/* free a signal*/
74611 +void FreeSignal(PSIGNAL_ITEM pSignal)
74612 +{
74613 + SDIO_STATUS status;
74614 + CT_DECLARE_IRQ_SYNC_CONTEXT();
74615 +
74616 + status = CriticalSectionAcquireSyncIrq(&pBusContext->RequestListCritSection);
74617 +
74618 + if (!SDIO_SUCCESS(status)) {
74619 + return;
74620 + }
74621 +
74622 + if (pBusContext->CurrentSignalAllocations <= pBusContext->MaxSignalAllocations) {
74623 + /* add it to the list */
74624 + SDListAdd(&pBusContext->SignalList, &pSignal->SDList);
74625 + /* flag that we are holding onto it */
74626 + pSignal = NULL;
74627 + } else {
74628 + /* decrement count */
74629 + pBusContext->CurrentSignalAllocations--;
74630 + }
74631 +
74632 + status = CriticalSectionReleaseSyncIrq(&pBusContext->RequestListCritSection);
74633 +
74634 + if (pSignal != NULL) {
74635 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Free signal allocation (CS:%d,MS:%d)\n",
74636 + pBusContext->CurrentSignalAllocations,pBusContext->MaxSignalAllocations));
74637 + DestroySignal(pSignal);
74638 + }
74639 +}
74640 +
74641 +/* allocate a signal from the list */
74642 +PSIGNAL_ITEM AllocateSignal(void)
74643 +{
74644 + PSDLIST pItem;
74645 + PSIGNAL_ITEM pSignal;
74646 + SDIO_STATUS status;
74647 + CT_DECLARE_IRQ_SYNC_CONTEXT();
74648 +
74649 + status = CriticalSectionAcquireSyncIrq(&pBusContext->RequestListCritSection);
74650 +
74651 + if (!SDIO_SUCCESS(status)) {
74652 + return NULL;
74653 + }
74654 +
74655 + if (pBusContext->InitMask & RESOURCE_INIT) {
74656 + /* check the list */
74657 + pItem = SDListRemoveItemFromHead(&pBusContext->SignalList);
74658 + } else {
74659 + /* we are loading the list */
74660 + pItem = NULL;
74661 + }
74662 +
74663 + status = CriticalSectionReleaseSyncIrq(&pBusContext->RequestListCritSection);
74664 + if (pItem != NULL) {
74665 + /* return the one from the list */
74666 + pSignal = CONTAINING_STRUCT(pItem, SIGNAL_ITEM, SDList);
74667 + } else {
74668 + if (pBusContext->InitMask & RESOURCE_INIT) {
74669 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Signal List empty..allocating new one (CS:%d,MS:%d)\n",
74670 + pBusContext->CurrentSignalAllocations,pBusContext->MaxSignalAllocations));
74671 + }
74672 + /* just allocate one */
74673 + pSignal = BuildSignal();
74674 + status = CriticalSectionAcquireSyncIrq(&pBusContext->RequestListCritSection);
74675 + if (pSignal != NULL) {
74676 + pBusContext->CurrentSignalAllocations++;
74677 + }
74678 + status = CriticalSectionReleaseSyncIrq(&pBusContext->RequestListCritSection);
74679 + }
74680 +
74681 +
74682 + return pSignal;
74683 +}
74684 +
74685 +/*
74686 + * Issus Bus Request (exposed to function drivers)
74687 +*/
74688 +PSDREQUEST IssueAllocRequest(PSDDEVICE pDev)
74689 +{
74690 + return AllocateRequest();
74691 +}
74692 +
74693 +/*
74694 + * Free Request (exposed to function drivers)
74695 +*/
74696 +void IssueFreeRequest(PSDDEVICE pDev, PSDREQUEST pReq)
74697 +{
74698 + FreeRequest(pReq);
74699 +}
74700 +
74701 +/*
74702 + * Issus Bus Request (exposed to function drivers)
74703 +*/
74704 +SDIO_STATUS IssueBusRequest(PSDDEVICE pDev, PSDREQUEST pReq)
74705 +{
74706 + pReq->pFunction = pDev->pFunction;
74707 + return IssueRequestToHCD(pDev->pHcd,pReq);
74708 +}
74709 +
74710 +
74711 + /* completion routine for HCD configs, this is synchronized with normal bus requests */
74712 +static void HcdConfigComplete(PSDREQUEST pReq)
74713 +{
74714 +
74715 + pReq->Status = CALL_HCD_CONFIG((PSDHCD)pReq->pDataBuffer, (PSDCONFIG)pReq->pCompleteContext);
74716 +
74717 + SignalSet(&((PSIGNAL_ITEM)pReq->pHcdContext)->Signal);
74718 +}
74719 +
74720 +SDIO_STATUS SendSyncedHcdBusConfig(PSDDEVICE pDevice, PSDCONFIG pConfig)
74721 +{
74722 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
74723 + PSDREQUEST pReq = NULL;
74724 + PSIGNAL_ITEM pSignal = NULL;
74725 +
74726 + do {
74727 +
74728 + pSignal = AllocateSignal();
74729 + if (NULL == pSignal) {
74730 + status = SDIO_STATUS_NO_RESOURCES;
74731 + break;
74732 + }
74733 +
74734 + pReq = AllocateRequest();
74735 + if (NULL == pReq) {
74736 + status = SDIO_STATUS_NO_RESOURCES;
74737 + break;
74738 + }
74739 +
74740 + /* issue pseudo request to sync this with bus requests */
74741 + pReq->pCompletion = HcdConfigComplete;
74742 + pReq->pCompleteContext = pConfig;
74743 + /* re-use hcd context to store the signal since this request
74744 + * never actually goes to an HCD */
74745 + pReq->pHcdContext = pSignal;
74746 + pReq->pDataBuffer = pDevice->pHcd;
74747 + /* flag this as barrier in case it may change the bus mode of the HCD */
74748 + pReq->Flags = SDREQ_FLAGS_PSEUDO | SDREQ_FLAGS_BARRIER | SDREQ_FLAGS_TRANS_ASYNC;
74749 + pReq->Status = SDIO_STATUS_SUCCESS;
74750 +
74751 + /* issue request */
74752 + status = IssueRequestToHCD(pDevice->pHcd,pReq);
74753 +
74754 + } while (FALSE);
74755 +
74756 + if (SDIO_SUCCESS(status)) {
74757 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Config Request Sync-Op waiting....\n"));
74758 + status = SignalWait(&pSignal->Signal);
74759 +
74760 + if (SDIO_SUCCESS(status)) {
74761 + /* return the result of the configuration request */
74762 + status = pReq->Status;
74763 + }
74764 + }
74765 +
74766 + /* cleanup */
74767 + if (pReq != NULL) {
74768 + FreeRequest(pReq);
74769 + }
74770 +
74771 + if (pSignal != NULL) {
74772 + FreeSignal(pSignal);
74773 + }
74774 +
74775 + return status;
74776 +}
74777 +
74778 +/*
74779 + * Issus bus Configuration (exposed to function drivers)
74780 +*/
74781 +SDIO_STATUS IssueBusConfig(PSDDEVICE pDev, PSDCONFIG pConfig)
74782 +{
74783 + SDIO_STATUS status;
74784 + INT cmdLength;
74785 + UINT8 debugLevel = SDDBG_ERROR;
74786 +
74787 + cmdLength = GET_SDCONFIG_CMD_LEN(pConfig);
74788 + status = SDIO_STATUS_INVALID_PARAMETER;
74789 +
74790 + do {
74791 + /* check buffers and length */
74792 + if (IS_SDCONFIG_CMD_GET(pConfig) || IS_SDCONFIG_CMD_PUT(pConfig)) {
74793 + if ((GET_SDCONFIG_CMD_DATA(PVOID,pConfig) == NULL) || (0 == cmdLength)) {
74794 + break;
74795 + }
74796 + }
74797 +
74798 + switch (GET_SDCONFIG_CMD(pConfig)) {
74799 + case SDCONFIG_FUNC_ACK_IRQ:
74800 + status = SDFunctionAckInterrupt(pDev);
74801 + break;
74802 + case SDCONFIG_FUNC_ENABLE_DISABLE:
74803 + if (cmdLength < sizeof(SDCONFIG_FUNC_ENABLE_DISABLE_DATA)) {
74804 + break;
74805 + }
74806 + status = SDEnableFunction(pDev,
74807 + GET_SDCONFIG_CMD_DATA(PSDCONFIG_FUNC_ENABLE_DISABLE_DATA,pConfig));
74808 + break;
74809 + case SDCONFIG_FUNC_UNMASK_IRQ:
74810 + status = SDMaskUnmaskFunctionIRQ(pDev,FALSE);
74811 + break;
74812 + case SDCONFIG_FUNC_MASK_IRQ:
74813 + status = SDMaskUnmaskFunctionIRQ(pDev,TRUE);
74814 + break;
74815 + case SDCONFIG_FUNC_SPI_MODE_DISABLE_CRC:
74816 + status = SDSPIModeEnableDisableCRC(pDev,FALSE);
74817 + break;
74818 + case SDCONFIG_FUNC_SPI_MODE_ENABLE_CRC:
74819 + status = SDSPIModeEnableDisableCRC(pDev,TRUE);
74820 + break;
74821 + case SDCONFIG_FUNC_ALLOC_SLOT_CURRENT:
74822 + status = SDAllocFreeSlotCurrent(pDev,
74823 + TRUE,
74824 + GET_SDCONFIG_CMD_DATA(PSDCONFIG_FUNC_SLOT_CURRENT_DATA,pConfig));
74825 + break;
74826 + case SDCONFIG_FUNC_FREE_SLOT_CURRENT:
74827 + status = SDAllocFreeSlotCurrent(pDev, FALSE, NULL);
74828 + break;
74829 + case SDCONFIG_FUNC_CHANGE_BUS_MODE:
74830 +
74831 + status = SetOperationalBusMode(pDev,
74832 + GET_SDCONFIG_CMD_DATA(PSDCONFIG_BUS_MODE_DATA,
74833 + pConfig));
74834 + break;
74835 + case SDCONFIG_FUNC_NO_IRQ_PEND_CHECK:
74836 + status = TryNoIrqPendingCheck(pDev);
74837 + break;
74838 + default:
74839 +
74840 + if (GET_SDCONFIG_CMD(pConfig) & SDCONFIG_FLAGS_HC_CONFIG) {
74841 + /* synchronize config requests with busrequests */
74842 + status = SendSyncedHcdBusConfig(pDev,pConfig);
74843 + } else {
74844 + DBG_PRINT(SDDBG_ERROR,
74845 + ("SDIO Bus Driver: IssueBusConfig - unknown command:0x%X \n",
74846 + GET_SDCONFIG_CMD(pConfig)));
74847 + status = SDIO_STATUS_INVALID_PARAMETER;
74848 + }
74849 + break;
74850 + }
74851 + } while(FALSE);
74852 +
74853 + if (!SDIO_SUCCESS(status)) {
74854 +
74855 + if(status == SDIO_STATUS_FUNC_ENABLE_TIMEOUT ){ /* reduce debug level to avoid timeout error messages */
74856 + debugLevel = SDDBG_TRACE;
74857 + }
74858 +
74859 +
74860 + DBG_PRINT(debugLevel,
74861 + ("SDIO Bus Driver: IssueBusConfig - Error in command:0x%X, Buffer:0x%X, Length:%d Err:%d\n",
74862 + GET_SDCONFIG_CMD(pConfig),
74863 + GET_SDCONFIG_CMD_DATA(INT,pConfig),
74864 + cmdLength, status));
74865 + }
74866 + return status;
74867 +}
74868 +
74869 +/* start a request */
74870 +static INLINE SDIO_STATUS StartHcdRequest(PSDHCD pHcd, PSDREQUEST pReq)
74871 +{
74872 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
74873 + CT_DECLARE_IRQ_SYNC_CONTEXT();
74874 +
74875 + if ((pReq->pFunction != NULL) && (pReq->pFunction->Flags & SDFUNCTION_FLAG_REMOVING)) {
74876 + /* this device or function is going away, fail any new requests */
74877 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: StartHcdRequest, fail request 0x%X, device is removing\n", (UINT)pReq));
74878 + pReq->Status = SDIO_STATUS_CANCELED;
74879 + return SDIO_STATUS_SDREQ_QUEUE_FAILED;
74880 + }
74881 +
74882 + status = _AcquireHcdLock(pHcd);
74883 +
74884 + if (!SDIO_SUCCESS(status)) {
74885 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to acquire HCD request lock: Err:%d\n", status));
74886 + pReq->Status = SDIO_STATUS_SDREQ_QUEUE_FAILED;
74887 + return SDIO_STATUS_SDREQ_QUEUE_FAILED;
74888 + }
74889 +
74890 + if (pReq->Flags & SDREQ_FLAGS_QUEUE_HEAD) {
74891 + /* caller wants this request queued to the head */
74892 +
74893 + /* a completion routine for a barrier request is called
74894 + * while the queue is busy. A barrier request can
74895 + * insert a new request at the head of the queue */
74896 + DBG_ASSERT(IsQueueBusy(&pHcd->RequestQueue));
74897 + QueueRequestToFront(&pHcd->RequestQueue,pReq);
74898 + } else {
74899 + /* insert in queue at tail */
74900 + QueueRequest(&pHcd->RequestQueue,pReq);
74901 +
74902 + /* is queue busy ? */
74903 + if (IsQueueBusy(&pHcd->RequestQueue)) {
74904 + /* release lock */
74905 + status = _ReleaseHcdLock(pHcd);
74906 + /* controller is busy already, no need to call the hcd */
74907 + return SDIO_STATUS_PENDING;
74908 + }
74909 + /* mark it as busy */
74910 + MarkQueueBusy(&pHcd->RequestQueue);
74911 + }
74912 +
74913 + /* remove item from head and set current request */
74914 + SET_CURRENT_REQUEST(pHcd, DequeueRequest(&pHcd->RequestQueue));
74915 + if (CHECK_API_VERSION_COMPAT(pHcd,2,6)) {
74916 + CHECK_HCD_RECURSE(pHcd, pHcd->pCurrentRequest);
74917 + }
74918 + /* release lock */
74919 + status = _ReleaseHcdLock(pHcd);
74920 + /* controller was not busy, call into HCD to process current request */
74921 + status = CallHcdRequest(pHcd);
74922 + return status;
74923 +}
74924 +
74925 +
74926 +/* used by CMD12,CMD13 to save the original completion routine */
74927 +#define GET_BD_RSV_REQUEST_COMPLETION(pR) (PSDEQUEST_COMPLETION)(pR)->pBdRsv1
74928 +#define SET_BD_RSV_REQUEST_COMPLETION(pR,c) (pR)->pBdRsv1 = (PVOID)(c)
74929 +
74930 +/* used by CMD12 processing to save/restore the original data transfer status */
74931 +#define GET_BD_RSV_ORIG_STATUS(pR) (SDIO_STATUS)(pR)->pBdRsv2
74932 +#define SET_BD_RSV_ORIG_STATUS(pR,s) (pR)->pBdRsv2 = (PVOID)(s)
74933 +
74934 +/* used by CMD13 processing to get/set polling count */
74935 +#define GET_BD_RSV_STATUS_POLL_COUNT(pR) (INT)(pR)->pBdRsv2
74936 +#define SET_BD_RSV_STATUS_POLL_COUNT(pR,s) (pR)->pBdRsv2 = (PVOID)(s)
74937 +
74938 +/* used by CMD55 processing to save the second part of the request */
74939 +#define GET_BD_RSV_ORIG_REQ(pR) (PSDREQUEST)(pR)->pBdRsv1
74940 +#define SET_BD_RSV_ORIG_REQ(pR,r) (pR)->pBdRsv1 = (PVOID)(r)
74941 +
74942 +/* used by all to save HCD */
74943 +#define GET_BD_RSV_HCD(pR) (PSDHCD)(pR)->pBdRsv3
74944 +#define SET_BD_RSV_HCD(pR,h) (pR)->pBdRsv3 = (PVOID)(h)
74945 +
74946 +static void CMD13CompletionBarrier(PSDREQUEST pReq);
74947 +
74948 +static INLINE void SetupCMD13(PSDHCD pHcd, PSDREQUEST pReq)
74949 +{
74950 + pReq->Command = CMD13;
74951 + /* sequence must be atomic, queue it to the head and flag as a barrier */
74952 + pReq->Flags = SDREQ_FLAGS_QUEUE_HEAD | SDREQ_FLAGS_BARRIER | SDREQ_FLAGS_TRANS_ASYNC;
74953 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
74954 + pReq->Argument = 0;
74955 + pReq->Flags |= SDREQ_FLAGS_RESP_R2;
74956 + } else {
74957 + pReq->Flags |= SDREQ_FLAGS_RESP_R1;
74958 + pReq->Argument |= pHcd->CardProperties.RCA << 16;
74959 + }
74960 + /* insert completion */
74961 + pReq->pCompletion = CMD13CompletionBarrier;
74962 +}
74963 +
74964 +/* CMD13 (GET STATUS) completion */
74965 +static void CMD13CompletionBarrier(PSDREQUEST pReq)
74966 +{
74967 + PSDEQUEST_COMPLETION pOrigCompletion = GET_BD_RSV_REQUEST_COMPLETION(pReq);
74968 + PSDHCD pHcd = GET_BD_RSV_HCD(pReq);
74969 + INT pollingCount = GET_BD_RSV_STATUS_POLL_COUNT(pReq);
74970 + BOOL doCompletion = TRUE;
74971 + UINT32 cardStatus;
74972 +
74973 + DBG_ASSERT(pOrigCompletion != NULL);
74974 + DBG_ASSERT(pHcd != NULL);
74975 + DBG_PRINT(SDIODBG_REQUESTS, ("+SDIO Bus Driver: CMD13CompletionBarrier (cnt:%d) \n",pollingCount));
74976 +
74977 + do {
74978 + if (!SDIO_SUCCESS(pReq->Status)) {
74979 + break;
74980 + }
74981 +
74982 + cardStatus = SD_R1_GET_CARD_STATUS(pReq->Response);
74983 +
74984 + if (cardStatus & SD_CS_TRANSFER_ERRORS) {
74985 + DBG_PRINT(SDIODBG_REQUESTS,("SDIO Bus Driver: Card transfer errors : 0x%X \n",cardStatus));
74986 + pReq->Status = SDIO_STATUS_PROGRAM_STATUS_ERROR;
74987 + break;
74988 + }
74989 +
74990 + if (SD_CS_GET_STATE(cardStatus) != SD_CS_STATE_PRG) {
74991 + DBG_PRINT(SDIODBG_REQUESTS,("SDIO Bus Driver: Card programming done \n"));
74992 + break;
74993 + }
74994 +
74995 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Card still programming.. \n"));
74996 + pollingCount--;
74997 +
74998 + if (pollingCount < 0) {
74999 + pReq->Status = SDIO_STATUS_PROGRAM_TIMEOUT;
75000 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: card programming timeout!\n"));
75001 + break;
75002 + }
75003 +
75004 + doCompletion = FALSE;
75005 + /* keep trying */
75006 + SET_BD_RSV_STATUS_POLL_COUNT(pReq, pollingCount);
75007 + SetupCMD13(pHcd,pReq);
75008 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: re-issuing CMD13 \n"));
75009 + /* re-issue */
75010 + IssueRequestToHCD(pHcd, pReq);
75011 +
75012 + } while (FALSE);
75013 +
75014 +
75015 + if (doCompletion) {
75016 + /* restore original completion routine */
75017 + pReq->pCompletion = pOrigCompletion;
75018 + /* call original completion routine */
75019 + pOrigCompletion(pReq);
75020 + }
75021 +
75022 + DBG_PRINT(SDIODBG_REQUESTS, ("-SDIO Bus Driver: CMD13CompletionBarrier \n"));
75023 +}
75024 +
75025 +/* command 13 (GET STATUS) preparation */
75026 +static void PrepCMD13Barrier(PSDREQUEST pReq)
75027 +{
75028 + SDIO_STATUS status = pReq->Status;
75029 + PSDHCD pHcd = GET_BD_RSV_HCD(pReq);
75030 + INT pollingCount;
75031 + PSDEQUEST_COMPLETION pOrigCompletion = GET_BD_RSV_REQUEST_COMPLETION(pReq);
75032 +
75033 + DBG_ASSERT(pHcd != NULL);
75034 + DBG_ASSERT(pOrigCompletion != NULL);
75035 +
75036 + DBG_PRINT(SDIODBG_REQUESTS, ("+SDIO Bus Driver: PrepCMD13Barrier \n"));
75037 +
75038 + if (SDIO_SUCCESS(status)) {
75039 + /* re-use the request for CMD13 */
75040 + SetupCMD13(pHcd,pReq);
75041 + /* set polling count to a multiple of the Block count, if the BlockCount was
75042 + * zeroed by the HCD, then set it to 1X multiplier */
75043 + pollingCount = max(pBusContext->CMD13PollingMultiplier,
75044 + pBusContext->CMD13PollingMultiplier * (INT)pReq->BlockCount);
75045 + /* initialize count */
75046 + SET_BD_RSV_STATUS_POLL_COUNT(pReq, pollingCount);
75047 + /* re-issue it, we can call IssueRequest here since we are re-using the request */
75048 + IssueRequestToHCD(pHcd, pReq);
75049 + } else {
75050 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Request Failure (%d) , CMD13 bypassed.\n",status));
75051 + /* call the original completion routine */
75052 + pOrigCompletion(pReq);
75053 + }
75054 +
75055 + DBG_PRINT(SDIODBG_REQUESTS, ("-SDIO Bus Driver: PrepCMD13Barrier (%d) \n",status));
75056 +}
75057 +
75058 +/* CMD12 completion */
75059 +static void CMD12Completion(PSDREQUEST pReq)
75060 +{
75061 + PSDEQUEST_COMPLETION pOrigCompletion = GET_BD_RSV_REQUEST_COMPLETION(pReq);
75062 +
75063 + DBG_ASSERT(pOrigCompletion != NULL);
75064 +
75065 + DBG_PRINT(SDIODBG_REQUESTS, ("+SDIO Bus Driver: CMD12Completion \n"));
75066 +
75067 + /* restore original completion routine */
75068 + pReq->pCompletion = pOrigCompletion;
75069 +
75070 + if (SDIO_SUCCESS(pReq->Status)) {
75071 + /* if CMD12 succeeds, we want to return the result of the original
75072 + * request */
75073 + pReq->Status = GET_BD_RSV_ORIG_STATUS(pReq);
75074 + DBG_PRINT(SDIODBG_REQUESTS,
75075 + ("SDIO Bus Driver: PrepCMD12Completion original status %d \n",pReq->Status));
75076 + }
75077 + /* call original completion routine */
75078 + pOrigCompletion(pReq);
75079 +
75080 + DBG_PRINT(SDIODBG_REQUESTS, ("-SDIO Bus Driver: CMD12Completion \n"));
75081 +}
75082 +
75083 +/* CMD12 preparation */
75084 +static void PrepCMD12Barrier(PSDREQUEST pReq)
75085 +{
75086 +
75087 + SDIO_STATUS status = pReq->Status;
75088 + PSDHCD pHcd = GET_BD_RSV_HCD(pReq);
75089 + PSDEQUEST_COMPLETION pOrigCompletion = GET_BD_RSV_REQUEST_COMPLETION(pReq);
75090 +
75091 + DBG_ASSERT(pHcd != NULL);
75092 + DBG_ASSERT(pOrigCompletion != NULL);
75093 +
75094 + DBG_PRINT(SDIODBG_REQUESTS, ("+SDIO Bus Driver: PrepCMD12Barrier \n"));
75095 +
75096 + if (SDIO_SUCCESS(status) || /* only issue CMD12 on success or specific bus errors */
75097 + (SDIO_STATUS_BUS_READ_TIMEOUT == status) ||
75098 + (SDIO_STATUS_BUS_READ_CRC_ERR == status) ||
75099 + (SDIO_STATUS_BUS_WRITE_ERROR == status)) {
75100 + if (!CHECK_API_VERSION_COMPAT(pHcd,2,6)) {
75101 + if (!ForceAllRequestsAsync()) {
75102 + /* clear the call bit as an optimization, note clearing it wholesale here will
75103 + * allow request processing to recurse one more level */
75104 + AtomicTest_Clear(&pHcd->HcdFlags, HCD_REQUEST_CALL_BIT);
75105 + }
75106 + }
75107 + /* re-use the request for CMD12 */
75108 + pReq->Command = CMD12;
75109 + pReq->Argument = 0;
75110 +
75111 + /* if the data transfer was successful, check for transfer check */
75112 + if (SDIO_SUCCESS(status) &&
75113 + (pReq->Flags & SDREQ_FLAGS_AUTO_TRANSFER_STATUS)) {
75114 + /* original data request requires a transfer status check, which is another
75115 + * barrier request */
75116 + pReq->Flags = SDREQ_FLAGS_RESP_R1B | SDREQ_FLAGS_QUEUE_HEAD | SDREQ_FLAGS_BARRIER |
75117 + SDREQ_FLAGS_TRANS_ASYNC;
75118 + DBG_PRINT(SDIODBG_REQUESTS, ("-SDIO Bus Driver: PrepCMD12Barrier , chaining CMD13 \n"));
75119 + /* switch out completion to send the CMD13 next */
75120 + pReq->pCompletion = PrepCMD13Barrier;
75121 + } else {
75122 + pReq->Flags = SDREQ_FLAGS_RESP_R1B | SDREQ_FLAGS_QUEUE_HEAD | SDREQ_FLAGS_TRANS_ASYNC;
75123 + pReq->pCompletion = CMD12Completion;
75124 + }
75125 +
75126 + /* save the original data transfer request status */
75127 + SET_BD_RSV_ORIG_STATUS(pReq,status);
75128 + /* re-issue it, we can call IssueRequest here since we are re-using the request */
75129 + IssueRequestToHCD(pHcd, pReq);
75130 + } else {
75131 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Request Failure (%d) , CMD12 bypassed.\n",status));
75132 + /* call the original completion routine */
75133 + pOrigCompletion(pReq);
75134 + }
75135 +
75136 + DBG_PRINT(SDIODBG_REQUESTS, ("-SDIO Bus Driver: PrepCMD12Barrier (%d) \n",status));
75137 +}
75138 +
75139 +
75140 +/* CMD55 barrier - this is a special barrier completion routine, we have to submit the second
75141 + * part of the command command sequence atomically */
75142 +static void CMD55CompletionBarrier(PSDREQUEST pReq)
75143 +{
75144 + SDIO_STATUS status = pReq->Status;
75145 + PSDREQUEST pOrigReq = GET_BD_RSV_ORIG_REQ(pReq);
75146 + PSDHCD pHcd = GET_BD_RSV_HCD(pReq);
75147 + BOOL doCompletion = FALSE;
75148 +
75149 + DBG_ASSERT(pOrigReq != NULL);
75150 + DBG_ASSERT(pHcd != NULL);
75151 +
75152 + DBG_PRINT(SDIODBG_REQUESTS, ("+SDIO Bus Driver: CMD55Completion \n"));
75153 +
75154 + do {
75155 +
75156 + if (!SDIO_SUCCESS(status)) {
75157 + /* command 55 failed */
75158 + pOrigReq->Status = status;
75159 + doCompletion = TRUE;
75160 + break;
75161 + }
75162 +
75163 + if (!(SD_R1_GET_CARD_STATUS(pReq->Response) & SD_CS_APP_CMD)) {
75164 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Card is not accepting CMD55, status:0x%X \n",
75165 + SD_R1_GET_CARD_STATUS(pReq->Response)));
75166 + pOrigReq->Status = SDIO_STATUS_INVALID_COMMAND;
75167 + doCompletion = TRUE;
75168 + break;
75169 + }
75170 +
75171 + if (!CHECK_API_VERSION_COMPAT(pHcd,2,6)) {
75172 + if (!ForceAllRequestsAsync()) {
75173 + AtomicTest_Clear(&pHcd->HcdFlags, HCD_REQUEST_CALL_BIT);
75174 + }
75175 + }
75176 +
75177 + /* flag the original request to queue to the head */
75178 + pOrigReq->Flags |= SDREQ_FLAGS_QUEUE_HEAD;
75179 + /* submit original request, we cannot call IssueRequestHCD() here because the
75180 + * original request has already gone through IssueRequestHCD() already */
75181 + status = StartHcdRequest(pHcd, pOrigReq);
75182 +
75183 + if (SDIO_STATUS_PENDING == status) {
75184 + break;
75185 + }
75186 +
75187 + pOrigReq->Status = status;
75188 +
75189 + if (SDIO_STATUS_SDREQ_QUEUE_FAILED == status) {
75190 + /* never made it to the queue */
75191 + doCompletion = TRUE;
75192 + break;
75193 + }
75194 +
75195 + /* request completed in-line */
75196 + _SDIO_HandleHcdEvent(pHcd, EVENT_HCD_TRANSFER_DONE);
75197 +
75198 + } while (FALSE);
75199 +
75200 + if (doCompletion) {
75201 + DoRequestCompletion(pOrigReq, pHcd);
75202 + }
75203 +
75204 + /* free the CMD55 request */
75205 + FreeRequest(pReq);
75206 +
75207 + DBG_PRINT(SDIODBG_REQUESTS, ("-SDIO Bus Driver: CMD55Completion \n"));
75208 +}
75209 +
75210 +
75211 +/* synch completion routine */
75212 +static void SynchCompletion(PSDREQUEST pRequest)
75213 +{
75214 + PSIGNAL_ITEM pSignal;
75215 +
75216 + pSignal = (PSIGNAL_ITEM)pRequest->pCompleteContext;
75217 + DBG_ASSERT(pSignal != NULL);
75218 + if (!SDIO_SUCCESS(SignalSet(&pSignal->Signal))) {
75219 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: SynchCompletion - signal failed \n"));
75220 + }
75221 +
75222 +}
75223 +
75224 +/*
75225 + * Issue a request to the host controller
75226 + *
75227 + *
75228 + * The following flags are handled internally by the bus driver to guarantee atomicity.
75229 + *
75230 + * SDREQ_FLAGS_APP_CMD - SD Extended commands requiring CMD55 to precede the actual command
75231 + * SDREQ_FLAGS_AUTO_CMD12 - Memory Card Data transfer needs CMD12 to stop transfer
75232 + * (multi-block reads/writes)
75233 + * SDREQ_FLAGS_AUTO_TRANSFER_STATUS - Memory card data transfer needs transfer status polling
75234 + * using CMD13
75235 + *
75236 + * These request flags require additional commands prepended or appended to the original command
75237 + *
75238 + * The order of command execution :
75239 + *
75240 + * Order Condition Command Issued
75241 + * -------------------------------------------------------------
75242 + * 1. If APP_CMD CMD55 issued.
75243 + * 2. Always Caller command issued.
75244 + * 3. If AUTO_CMD12 CMD12 issued.
75245 + * 4. If AUTO_TRANSFER_STATUS CMD13 issued until card programming is complete
75246 +*/
75247 +SDIO_STATUS IssueRequestToHCD(PSDHCD pHcd, PSDREQUEST pReq)
75248 +{
75249 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
75250 + PSIGNAL_ITEM pSignal = NULL;
75251 + BOOL handleFailedReqSubmit = FALSE;
75252 +
75253 + CLEAR_INTERNAL_REQ_FLAGS(pReq);
75254 +
75255 + do {
75256 + /* mark request in-use */
75257 + ATOMIC_FLAGS internal = AtomicTest_Set(&pReq->InternalFlags, SDBD_PENDING);
75258 + if (internal & (1<<SDBD_PENDING)) {
75259 + DBG_ASSERT_WITH_MSG(FALSE,
75260 + "SDIO Bus Driver: IssueRequestToHCD - request already in use \n");
75261 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Request already in use: 0x%X",(INT)pReq));
75262 + }
75263 +
75264 + if (!(pReq->Flags & SDREQ_FLAGS_TRANS_ASYNC)) {
75265 + /* caller wants synchronous operation, insert our completion routine */
75266 + pReq->pCompletion = SynchCompletion;
75267 + pSignal = AllocateSignal();
75268 + if (NULL == pSignal) {
75269 + status = SDIO_STATUS_NO_RESOURCES;
75270 + pReq->Status = SDIO_STATUS_NO_RESOURCES;
75271 + handleFailedReqSubmit = TRUE;
75272 + /* no need to continue */
75273 + break;
75274 + }
75275 + pReq->pCompleteContext = (PVOID)pSignal;
75276 + }
75277 +
75278 + if ((pReq->Flags & SDREQ_FLAGS_AUTO_CMD12) &&
75279 + !(pHcd->Attributes & SDHCD_ATTRIB_AUTO_CMD12) &&
75280 + !(IS_HCD_BUS_MODE_SPI(pHcd) && IS_SDREQ_WRITE_DATA(pReq->Flags))) {
75281 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Auto CMD12 on Request:0x%08X \n",(INT)pReq));
75282 + /* caller wants CMD12 auto-issued and the HCD does not support it */
75283 + /* setup caller's request as a barrier and replace their completion routine */
75284 + pReq->Flags |= SDREQ_FLAGS_BARRIER;
75285 + /* take off the flag, since the BD will be issuing it */
75286 + pReq->Flags &= ~SDREQ_FLAGS_AUTO_CMD12;
75287 + /* save original completion */
75288 + SET_BD_RSV_REQUEST_COMPLETION(pReq,pReq->pCompletion);
75289 + /* save the HCD we are on */
75290 + SET_BD_RSV_HCD(pReq,pHcd);
75291 + /* use completion for preping CMD12 */
75292 + pReq->pCompletion = PrepCMD12Barrier;
75293 + }
75294 +
75295 + if (pReq->Flags & SDREQ_FLAGS_AUTO_TRANSFER_STATUS) {
75296 + /* caller wants transfer status checked. If a CMD12
75297 + * barrier request has been setup we let the CMD12 completion take care
75298 + * of setting up the transfer check */
75299 + if (pReq->pCompletion != PrepCMD12Barrier) {
75300 + /* make CMD13 prep a barrier */
75301 + pReq->Flags |= SDREQ_FLAGS_BARRIER;
75302 + /* save original completion */
75303 + SET_BD_RSV_REQUEST_COMPLETION(pReq,pReq->pCompletion);
75304 + /* save the HCD we are on */
75305 + SET_BD_RSV_HCD(pReq,pHcd);
75306 + /* use completion for preping CMD13 */
75307 + pReq->pCompletion = PrepCMD13Barrier;
75308 + }
75309 + }
75310 +
75311 + /* check app command, the two command sequence must be handled atomically */
75312 + if (pReq->Flags & SDREQ_FLAGS_APP_CMD) {
75313 + PSDREQUEST pCmd55;
75314 + /* allocate request to handle initial CMD55 command */
75315 + pCmd55 = AllocateRequest();
75316 + if (NULL == pCmd55) {
75317 + status = SDIO_STATUS_NO_RESOURCES;
75318 + pReq->Status = SDIO_STATUS_NO_RESOURCES;
75319 + /* complete the caller's request with error */
75320 + handleFailedReqSubmit = TRUE;
75321 + /* no need to continue */
75322 + break;
75323 + }
75324 + /* first submit CMD55 */
75325 + /* set RCA */
75326 + pCmd55->Argument = pHcd->CardProperties.RCA << 16;
75327 + /* mark as a barrier request */
75328 + pCmd55->Flags = SDREQ_FLAGS_RESP_R1 | SDREQ_FLAGS_BARRIER | SDREQ_FLAGS_TRANS_ASYNC;
75329 + pCmd55->Command = CMD55;
75330 + /* call our barrier completion routine when done */
75331 + pCmd55->pCompletion = CMD55CompletionBarrier;
75332 + /* save request and target HCD */
75333 + SET_BD_RSV_ORIG_REQ(pCmd55,pReq);
75334 + SET_BD_RSV_HCD(pCmd55,pHcd);
75335 + /* recursively start the CMD55 request, since the CMD55 is a barrier
75336 + * request, it's completion routine will submit the actual request
75337 + * atomically */
75338 + status = IssueRequestToHCD(pHcd, pCmd55);
75339 +
75340 + } else {
75341 + /* start the normal request */
75342 + status = StartHcdRequest(pHcd,pReq);
75343 + }
75344 +
75345 +
75346 + if (SDIO_STATUS_SDREQ_QUEUE_FAILED == status) {
75347 + handleFailedReqSubmit = TRUE;
75348 + /* no need to continue, clean up at the end */
75349 + break;
75350 + }
75351 +
75352 + /* at this point, the request was either queued or was processed by the
75353 + * HCD */
75354 +
75355 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: HCD returned status:%d on request: 0x%X, (CMD:%d) \n",
75356 + status, (INT)pReq, pReq->Command));
75357 +
75358 + if (status != SDIO_STATUS_PENDING) {
75359 + /* the HCD completed the request within the HCD request callback,
75360 + * check and see if this is a synchronous request */
75361 + if (pSignal != NULL) {
75362 + /* it was synchronous */
75363 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Sync-Op signal wait bypassed \n"));
75364 + /* NULL out completion info, there's no need to
75365 + * signal the semaphore */
75366 + pReq->pCompletion = NULL;
75367 +
75368 + } else {
75369 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Async operation completed in-line \n"));
75370 + /* this was an async call, always return pending */
75371 + status = SDIO_STATUS_PENDING;
75372 + }
75373 + /* process this completed transfer on behalf of the HCD */
75374 + _SDIO_HandleHcdEvent(pHcd, EVENT_HCD_TRANSFER_DONE);
75375 +
75376 + /* done processing */
75377 + break;
75378 + }
75379 + /* I/O is now pending, could be sync or async */
75380 + /* check for synch op */
75381 + if (pSignal != NULL) {
75382 + /* wait for completion */
75383 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Sync-Op signal waiting....\n"));
75384 + /* this is not interruptable, as the HCD must complete it. */
75385 + status = SignalWait(&pSignal->Signal);
75386 + /* don't need the signal anymore */
75387 + FreeSignal(pSignal);
75388 + pSignal = NULL;
75389 +
75390 + /* note: it is safe to touch pReq since we own
75391 + * the completion routine for synch transfers */
75392 +
75393 + /* check signal wait status */
75394 + if (!SDIO_SUCCESS(status)) {
75395 + DBG_PRINT(SDDBG_TRACE,
75396 + ("SDIO Bus Driver - IssueRequestToHCD: Synch transfer - signal wait failed, cancelling req 0X%X\n",
75397 + (UINT)pReq));
75398 + pReq->Status = SDIO_STATUS_CANCELED;
75399 + status = SDIO_STATUS_CANCELED;
75400 + break;
75401 + }
75402 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Sync-Op woke up\n"));
75403 + /* return the completion status of the request */
75404 + status = pReq->Status;
75405 + } else {
75406 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Async operation Pending \n"));
75407 + }
75408 +
75409 + } while (FALSE);
75410 +
75411 + /* see if we need to clean up failed submissions */
75412 + if (handleFailedReqSubmit) {
75413 + /* make sure this is cleared */
75414 + AtomicTest_Clear(&pReq->InternalFlags, SDBD_PENDING);
75415 + /* the request processing failed before it was submitted to the HCD */
75416 + /* note: since it never made it to the queue we can touch pReq */
75417 + if (pReq->Flags & SDREQ_FLAGS_TRANS_ASYNC) {
75418 + /* for ASYNC requests, we need to call the completion routine */
75419 + DoRequestCompletion(pReq, pHcd);
75420 + /* return pending for all ASYNC requests */
75421 + status = SDIO_STATUS_PENDING;
75422 + }
75423 + }
75424 +
75425 + /* check if we need to clean up the signal */
75426 + if (pSignal != NULL) {
75427 + /* make sure this is freed */
75428 + FreeSignal(pSignal);
75429 + }
75430 + /* return status */
75431 + return status;
75432 +}
75433 +
75434 +/* documentation for configuration requests */
75435 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75436 + @function: Enable or Disable the SDIO Function
75437 +
75438 + @function name: SDCONFIG_FUNC_ENABLE_DISABLE
75439 + @prototype: SDCONFIG_FUNC_ENABLE_DISABLE
75440 + @category: PD_Reference
75441 +
75442 + @input: SDCONFIG_FUNC_ENABLE_DISABLE_DATA - Enable Data structure
75443 +
75444 + @output: none
75445 +
75446 + @return: SDIO Status
75447 +
75448 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75449 + uses the SDCONFIG_FUNC_ENABLE_DISABLE_DATA structure. The caller must set the
75450 + EnableFlags and specify the TimeOut value in milliseconds. The TimeOut
75451 + value is used for polling the I/O ready bit. This command returns a status
75452 + of SDIO_STATUS_FUNC_ENABLE_TIMEOUT if the ready bit was not set/cleared
75453 + by the card within the timeout period.
75454 +
75455 + @example: Example of enabling an I/O function:
75456 + fData.EnableFlags = SDCONFIG_ENABLE_FUNC;
75457 + fData.TimeOut = 500;
75458 + status = SDLIB_IssueConfig(pInstance->pDevice,
75459 + SDCONFIG_FUNC_ENABLE_DISABLE,
75460 + &fData,
75461 + sizeof(fData));
75462 +
75463 + @see also: SDLIB_IssueConfig
75464 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75465 +
75466 +
75467 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75468 + @function: Unmask the function's IRQ
75469 +
75470 + @function name: SDCONFIG_FUNC_UNMASK_IRQ
75471 + @prototype: SDCONFIG_FUNC_UNMASK_IRQ
75472 + @category: PD_Reference
75473 +
75474 + @input: none
75475 +
75476 + @output: none
75477 +
75478 + @return: SDIO Status
75479 +
75480 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75481 + unmasks the IRQ for the I/O function. This request sets the function's
75482 + interrupt enable bit in the INTENABLE register in the
75483 + common register space.
75484 +
75485 + @example: Example of unmasking interrupt :
75486 + status = SDLIB_IssueConfig(pInstance->pDevice,
75487 + SDCONFIG_FUNC_UNMASK_IRQ,
75488 + NULL,
75489 + 0);
75490 +
75491 + @see also: SDCONFIG_FUNC_MASK_IRQ
75492 + @see also: SDLIB_IssueConfig
75493 +
75494 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75495 +
75496 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75497 + @function: Mask the function's IRQ
75498 +
75499 + @function name: SDCONFIG_FUNC_MASK_IRQ
75500 + @prototype: SDCONFIG_FUNC_MASK_IRQ
75501 + @category: PD_Reference
75502 +
75503 + @input: none
75504 +
75505 + @output: none
75506 +
75507 + @return: SDIO Status
75508 +
75509 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75510 + masks the IRQ for the I/O function.
75511 +
75512 + @example: Example of unmasking interrupt :
75513 + status = SDLIB_IssueConfig(pInstance->pDevice,
75514 + SDCONFIG_FUNC_MASK_IRQ,
75515 + NULL,
75516 + 0);
75517 +
75518 + @see also: SDCONFIG_FUNC_UNMASK_IRQ
75519 + @see also: SDLIB_IssueConfig
75520 +
75521 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75522 +
75523 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75524 + @function: Acknowledge that the function's IRQ has been handled
75525 +
75526 + @function name: SDCONFIG_FUNC_ACK_IRQ
75527 + @prototype: SDCONFIG_FUNC_ACK_IRQ
75528 + @category: PD_Reference
75529 +
75530 + @input: none
75531 +
75532 + @output: none
75533 +
75534 + @return: SDIO Status
75535 +
75536 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75537 + indicates to the bus driver that the function driver has handled the
75538 + interrupt. The bus driver will notify the host controller to unmask the
75539 + interrupt source. SDIO interrupts are level triggered and are masked at the
75540 + host controller level until all function drivers have indicated that they
75541 + have handled their respective interrupt. This command can be issued in either
75542 + the IRQ handler or asynchronous IRQ handler.
75543 +
75544 + @example: Example of acknowledging an interrupt :
75545 + status = SDLIB_IssueConfig(pInstance->pDevice,
75546 + SDCONFIG_FUNC_ACK_IRQ,
75547 + NULL,
75548 + 0);
75549 +
75550 + @see also: SDLIB_IssueConfig
75551 +
75552 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75553 +
75554 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75555 + @function: Disable SD/MMC/SDIO card CRC checking.
75556 +
75557 + @function name: SDCONFIG_FUNC_SPI_MODE_DISABLE_CRC
75558 + @prototype: SDCONFIG_FUNC_SPI_MODE_DISABLE_CRC
75559 + @category: PD_Reference
75560 +
75561 + @input: none
75562 +
75563 + @output: none
75564 +
75565 + @return: SDIO Status
75566 +
75567 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75568 + issues CMD59 to disable SPI-CRC checking and requests the host controller
75569 + driver to stop checking the CRC. This is typically used in systems where
75570 + CRC checking is not required and performance is improved if the CRC checking
75571 + is ommitted (i.e. SPI implementations without hardware CRC support).
75572 +
75573 + @example: Example of disabling SPI CRC checking:
75574 + status = SDLIB_IssueConfig(pInstance->pDevice,
75575 + SDCONFIG_FUNC_SPI_MODE_DISABLE_CRC,
75576 + NULL,
75577 + 0);
75578 +
75579 + @see also: SDCONFIG_FUNC_SPI_MODE_ENABLE_CRC
75580 + @see also: SDLIB_IssueConfig
75581 +
75582 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75583 +
75584 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75585 + @function: Enable SD/MMC/SDIO card CRC checking.
75586 +
75587 + @function name: SDCONFIG_FUNC_SPI_MODE_ENABLE_CRC
75588 + @prototype: SDCONFIG_FUNC_SPI_MODE_ENABLE_CRC
75589 + @category: PD_Reference
75590 +
75591 + @input: none
75592 +
75593 + @output: none
75594 +
75595 + @return: SDIO Status
75596 +
75597 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75598 + issues CMD59 to enable SPI-CRC checking and requests the host controller
75599 + driver to generate valid CRCs for commands and data as well as
75600 + check the CRC in responses and incomming data blocks.
75601 +
75602 + @example: Example of enabling SPI CRC checking:
75603 + status = SDLIB_IssueConfig(pInstance->pDevice,
75604 + SDCONFIG_FUNC_SPI_MODE_ENABLE_CRC,
75605 + NULL,
75606 + 0);
75607 +
75608 + @see also: SDCONFIG_FUNC_SPI_MODE_DISABLE_CRC
75609 + @see also: SDLIB_IssueConfig
75610 +
75611 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75612 +
75613 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75614 + @function: Allocate slot current for a card function.
75615 +
75616 + @function name: SDCONFIG_FUNC_ALLOC_SLOT_CURRENT
75617 + @prototype: SDCONFIG_FUNC_ALLOC_SLOT_CURRENT
75618 + @category: PD_Reference
75619 +
75620 + @input: SDCONFIG_FUNC_SLOT_CURRENT_DATA
75621 +
75622 + @output: SDCONFIG_FUNC_SLOT_CURRENT_DATA
75623 +
75624 + @return: SDIO Status
75625 +
75626 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75627 + requests an allocation of slot current to satisfy the power requirements
75628 + of the function. The command uses the SDCONFIG_FUNC_SLOT_CURRENT_DATA
75629 + data structure to pass the required current in mA. Slot current allocation
75630 + is not cummulative and this command should only be issued once by each function
75631 + driver with the worse case slot current usage.
75632 + The command returns SDIO_STATUS_NO_RESOURCES if the
75633 + requirement cannot be met by the host hardware. The SlotCurrent field will
75634 + contain the remaining current available to the slot. The slot current should
75635 + be allocated before the function is enabled using SDCONFIG_FUNC_ENABLE_DISABLE.
75636 + When a function driver is unloaded it should free the slot current allocation
75637 + by using the SDCONFIG_FUNC_FREE_SLOT_CURRENT command.
75638 +
75639 + @example: Example of allocating slot current:
75640 + slotCurrent.SlotCurrent = 150; // 150 mA
75641 + status = SDLIB_IssueConfig(pInstance->pDevice,
75642 + SDCONFIG_FUNC_ALLOC_SLOT_CURRENT,
75643 + &slotCurrent,
75644 + sizeof(slotCurrent));
75645 +
75646 +
75647 + @see also: SDCONFIG_FUNC_FREE_SLOT_CURRENT
75648 + @see also: SDLIB_IssueConfig
75649 +
75650 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75651 +
75652 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75653 + @function: Free slot current for a card function.
75654 +
75655 + @function name: SDCONFIG_FUNC_FREE_SLOT_CURRENT
75656 + @prototype: SDCONFIG_FUNC_FREE_SLOT_CURRENT
75657 + @category: PD_Reference
75658 +
75659 + @input: none
75660 +
75661 + @output: none
75662 +
75663 + @return: SDIO Status
75664 +
75665 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75666 + frees the allocated current for a card function. This command should be
75667 + issued only once (per function) and only after an allocation was successfully made.
75668 +
75669 + @example: Example of freeing slot current:
75670 + status = SDLIB_IssueConfig(pInstance->pDevice,
75671 + SDCONFIG_FUNC_FREE_SLOT_CURRENT,
75672 + NULL,
75673 + 0);
75674 +
75675 + @see also: SDCONFIG_FUNC_ALLOC_SLOT_CURRENT
75676 + @see also: SDLIB_IssueConfig
75677 +
75678 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75679 +
75680 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75681 + @function: Set the bus mode for the SD/SDIO card.
75682 +
75683 + @function name: SDCONFIG_FUNC_CHANGE_BUS_MODE
75684 + @prototype: SDCONFIG_FUNC_CHANGE_BUS_MODE
75685 + @category: PD_Reference
75686 +
75687 + @input: none
75688 +
75689 + @output: none
75690 +
75691 + @return: SDIO Status
75692 +
75693 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75694 + alters the card's bus mode (width and clock rate) to a driver specified
75695 + value. The driver must read the current bus mode flags, modify if necessary
75696 + and pass the value in the SDCONFIG_BUS_MODE_DATA structure.
75697 + If the bus width is changed (1 or 4 bit) the caller must adjust the mode flags
75698 + for the new width. Cards cannot be switched between 1/4 bit and SPI mode.
75699 + Switching to or from SPI mode requires a power cycle. Adjustments to the clock
75700 + rate is immediate on the next bus transaction. The actual clock rate value is
75701 + limited by the host controller and is reported in the ClockRate field when the
75702 + command completes successfully.
75703 + The bus mode change is card wide and may affect other SDIO functions on
75704 + multi-function cards. Use this feature with caution. This feature should NOT be
75705 + used to dynamically control clock rates during runtime and should only be used
75706 + at card initialization. Changing the bus mode must be done with SDIO function
75707 + interrupts masked.
75708 + This request can block and must only be called from a schedulable context.
75709 +
75710 + @example: Example of changing the clock rate:
75711 + SDCONFIG_BUS_MODE_DATA busSettings;
75712 + ZERO_OBJECT(busSettings);
75713 + // get current bus flags and keep the same bus width
75714 + busSettings.BusModeFlags = SDDEVICE_GET_BUSMODE_FLAGS(pInstance->pDevice);
75715 + busSettings.ClockRate = 8000000; // adjust clock to 8 Mhz
75716 + // issue config request to override clock rate
75717 + status = SDLIB_IssueConfig(pInstance->pDevice,
75718 + SDCONFIG_FUNC_CHANGE_BUS_MODE,
75719 + &busSettings,
75720 + sizeof(SDCONFIG_BUS_MODE_DATA));
75721 +
75722 + @see also: SDDEVICE_GET_BUSMODE_FLAGS
75723 + @see also: SDLIB_IssueConfig
75724 +
75725 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75726 +
75727 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75728 + @function: Get the debug level of the underlying host controller driver.
75729 +
75730 + @function name: SDCONFIG_GET_HCD_DEBUG
75731 + @prototype: SDCONFIG_GET_HCD_DEBUG
75732 + @category: PD_Reference
75733 +
75734 + @input: none
75735 +
75736 + @output: CT_DEBUG_LEVEL
75737 +
75738 + @return: SDIO Status
75739 +
75740 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75741 + requests the current debug level of the HCD driver. This API is useful for
75742 + saving the current debug level of the HCD prior to issuing SDCONFIG_SET_HCD_DEBUG
75743 + in order to increase the verbosity of the HCD. This API should be used only for
75744 + debugging purposes. If multiple functions attempt to save and set the HCD debug
75745 + level simultanously, the final debug level will be unknown. Not all HCDs support
75746 + this command.
75747 +
75748 + @example: Example of saving the debug level:
75749 + CT_DEBUG_LEVEL savedDebug;
75750 + status = SDLIB_IssueConfig(pInstance->pDevice,
75751 + SDCONFIG_GET_HCD_DEBUG,
75752 + &savedDebug,
75753 + sizeof(savedDebug));
75754 +
75755 + @see also: SDCONFIG_SET_HCD_DEBUG
75756 + @see also: SDLIB_IssueConfig
75757 +
75758 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75759 +
75760 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75761 + @function: Set the debug level of the underlying host controller driver.
75762 +
75763 + @function name: SDCONFIG_SET_HCD_DEBUG
75764 + @prototype: SDCONFIG_SET_HCD_DEBUG
75765 + @category: PD_Reference
75766 +
75767 + @input: CT_DEBUG_LEVEL
75768 +
75769 + @output: none
75770 +
75771 + @return: SDIO Status
75772 +
75773 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command
75774 + sets the current debug level of the HCD driver. This API is useful for
75775 + setting the debug level of the HCD programatically for debugging purposes.
75776 + If multiple functions attempt to save and set the HCD debug
75777 + level simultanously, the final debug level will be unknown. Not all HCDs support
75778 + this request.
75779 +
75780 + @example: Example of setting the debug level:
75781 + CT_DEBUG_LEVEL setDebug = 15;
75782 + status = SDLIB_IssueConfig(pInstance->pDevice,
75783 + SDCONFIG_GET_HCD_DEBUG,
75784 + &setDebug,
75785 + sizeof(setDebug));
75786 +
75787 + @see also: SDCONFIG_GET_HCD_DEBUG
75788 + @see also: SDLIB_IssueConfig
75789 +
75790 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75791 +
75792 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75793 + @function: Instruct the bus driver to not check the SDIO card interrupt pending
75794 + register on card interrupts, if possible.
75795 +
75796 + @function name: SDCONFIG_FUNC_NO_IRQ_PEND_CHECK
75797 + @prototype: SDCONFIG_FUNC_NO_IRQ_PEND_CHECK
75798 + @category: PD_Reference
75799 +
75800 + @input: none
75801 +
75802 + @output: none
75803 +
75804 + @return: SDIO Status
75805 +
75806 + @notes: This command code is used in the SDLIB_IssueConfig() API. The command instructs the
75807 + bus driver to skip checking the card interrupt pending register on each card
75808 + interrupt. The bus driver will assume the function is interrupting and immediately start
75809 + the interrupt processing stage. This option is only valid for single function cards.
75810 + The bus driver will reject the command for a card with more than 1 function.
75811 + For single function cards, this can improve interrupt response time.
75812 +
75813 + @example: Example of skipping IRQ pending checks:
75814 +
75815 + status = SDLIB_IssueConfig(pInstance->pDevice,
75816 + SDCONFIG_FUNC_NO_IRQ_PEND_CHECK,
75817 + NULL,
75818 + 0);
75819 +
75820 + @see also: SDLIB_IssueConfig
75821 +
75822 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75823 Index: linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_bus_events.c
75824 ===================================================================
75825 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
75826 +++ linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_bus_events.c 2008-12-11 22:46:49.000000000 +0100
75827 @@ -0,0 +1,1040 @@
75828 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
75829 +@file: sdio_bus_events.c
75830 +
75831 +@abstract: OS independent bus driver support
75832 +
75833 +#notes: this file contains various event handlers and helpers
75834 +
75835 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
75836 +
75837 +
75838 + *
75839 + * This program is free software; you can redistribute it and/or modify
75840 + * it under the terms of the GNU General Public License version 2 as
75841 + * published by the Free Software Foundation;
75842 + *
75843 + * Software distributed under the License is distributed on an "AS
75844 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
75845 + * implied. See the License for the specific language governing
75846 + * rights and limitations under the License.
75847 + *
75848 + * Portions of this code were developed with information supplied from the
75849 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
75850 + *
75851 + * The following conditions apply to the release of the SD simplified specification (�Simplified
75852 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
75853 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
75854 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
75855 + * Specification may require a license from the SD Card Association or other third parties.
75856 + * Disclaimers:
75857 + * The information contained in the Simplified Specification is presented only as a standard
75858 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
75859 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
75860 + * any damages, any infringements of patents or other right of the SD Card Association or any third
75861 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
75862 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
75863 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
75864 + * information, know-how or other confidential information to any third party.
75865 + *
75866 + *
75867 + * The initial developers of the original code are Seung Yi and Paul Lever
75868 + *
75869 + * sdio@atheros.com
75870 + *
75871 + *
75872 +
75873 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
75874 +#define MODULE_NAME SDBUSDRIVER
75875 +#include <linux/sdio/ctsystem.h>
75876 +#include <linux/sdio/sdio_busdriver.h>
75877 +#include <linux/sdio/sdio_lib.h>
75878 +#include "_busdriver.h"
75879 +#include <linux/sdio/_sdio_defs.h>
75880 +#include <linux/sdio/mmc_defs.h>
75881 +
75882 +static SDIO_STATUS ScanSlotForCard(PSDHCD pHcd,
75883 + PBOOL pCardPresent);
75884 +static void GetPendingIrqComplete(PSDREQUEST pReq);
75885 +static void ProcessPendingIrqs(PSDHCD pHcd, UINT8 IntPendingMsk);
75886 +
75887 +/*
75888 + * DeviceDetach - tell core a device was removed from a slot
75889 +*/
75890 +SDIO_STATUS DeviceDetach(PSDHCD pHcd)
75891 +{
75892 + SDCONFIG_SDIO_INT_CTRL_DATA irqData;
75893 +
75894 + ZERO_OBJECT(irqData);
75895 +
75896 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: DeviceDetach\n"));
75897 + /* tell any function drivers we are gone */
75898 + RemoveHcdFunctions(pHcd);
75899 + /* delete the devices associated with this HCD */
75900 + DeleteDevices(pHcd);
75901 + /* check and see if there are any IRQs that were left enabled */
75902 + if (pHcd->IrqsEnabled) {
75903 + irqData.SlotIRQEnable = FALSE;
75904 + /* turn off IRQ detection in HCD */
75905 + _IssueConfig(pHcd,SDCONFIG_SDIO_INT_CTRL,(PVOID)&irqData, sizeof(irqData));
75906 + }
75907 +
75908 + /* reset hcd state */
75909 + ResetHcdState(pHcd);
75910 +
75911 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: DeviceDetach\n"));
75912 + return SDIO_STATUS_SUCCESS;
75913 +}
75914 +
75915 +/*
75916 + * DeviceAttach - tell core a device was inserted into a slot
75917 +*/
75918 +SDIO_STATUS DeviceAttach(PSDHCD pHcd)
75919 +{
75920 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
75921 + PSDDEVICE pDevice = NULL;
75922 + UINT ii;
75923 +
75924 +
75925 + if (IS_CARD_PRESENT(pHcd)) {
75926 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: DeviceAttach called on occupied slot!\n"));
75927 + return SDIO_STATUS_ERROR;
75928 + }
75929 +
75930 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: DeviceAttach bdctxt:0x%X \n", (UINT32)pBusContext));
75931 +
75932 + if (IS_HCD_RAW(pHcd)) {
75933 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: RAW HCD (%s) device attach \n",pHcd->pName));
75934 + /* this is a raw HCD */
75935 + memset(&pHcd->CardProperties,0,sizeof(pHcd->CardProperties));
75936 + pHcd->CardProperties.Flags = CARD_RAW;
75937 + pHcd->CardProperties.IOFnCount = 0;
75938 + /* for raw HCD, set up minimum parameters
75939 + * since we cannot determine these values using any standard, use values
75940 + * reported by the HCD */
75941 + /* the operational rate is just the max clock rate reported */
75942 + pHcd->CardProperties.OperBusClock = pHcd->MaxClockRate;
75943 + /* the max bytes per data transfer is just the max bytes per block */
75944 + pHcd->CardProperties.OperBlockLenLimit = pHcd->MaxBytesPerBlock;
75945 + /* if the raw HCD uses blocks to transfer, report the operational size
75946 + * from the HCD max value */
75947 + pHcd->CardProperties.OperBlockCountLimit = pHcd->MaxBlocksPerTrans;
75948 + /* set the slot preferred voltage */
75949 + pHcd->CardProperties.CardVoltage = pHcd->SlotVoltagePreferred;
75950 + } else {
75951 + /* initialize this card and get card properties */
75952 + if (!SDIO_SUCCESS((status = SDInitializeCard(pHcd)))) {
75953 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: DeviceAttach, failed to initialize card, %d\n",
75954 + status));
75955 + return status;
75956 + }
75957 + }
75958 +
75959 + /* check for SD or MMC, this must be done first as the query may involve
75960 + * de-selecting the card */
75961 + do {
75962 + if (!(pHcd->CardProperties.Flags & (CARD_MMC | CARD_SD | CARD_RAW))) {
75963 + /* none of these were discovered */
75964 + break;
75965 + }
75966 + pDevice = AllocateDevice(pHcd);
75967 + if (NULL == pDevice) {
75968 + break;
75969 + }
75970 + if (pHcd->CardProperties.Flags & CARD_RAW) {
75971 + /* set function number to 1 for IRQ processing */
75972 + SDDEVICE_SET_SDIO_FUNCNO(pDevice,1);
75973 + } else {
75974 + /* get the ID info for the SD/MMC Card */
75975 + if (!SDIO_SUCCESS((status = SDQuerySDMMCInfo(pDevice)))) {
75976 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: DeviceAttach, query SDMMC Info failed \n"));
75977 + FreeDevice(pDevice);
75978 + break;
75979 + }
75980 + }
75981 + AddDeviceToList(pDevice);
75982 + /* look for a function driver to handle this card */
75983 + ProbeForFunction(pDevice, pHcd);
75984 + } while (FALSE);
75985 +
75986 + /* create a device for each I/O function */
75987 + for(ii= 1; ii <= pHcd->CardProperties.IOFnCount; ii++) {
75988 + pDevice = AllocateDevice(pHcd);
75989 + if (NULL == pDevice) {
75990 + break;
75991 + }
75992 + /* set the function number */
75993 + SDDEVICE_SET_SDIO_FUNCNO(pDevice,ii);
75994 + /* get the ID info for each I/O function */
75995 + if (!SDIO_SUCCESS((status = SDQuerySDIOInfo(pDevice)))) {
75996 + DBG_PRINT(SDDBG_ERROR,
75997 + ("SDIO Bus Driver: DeviceAttach, could not query SDIO Info, funcNo:%d status:%d \n",
75998 + ii, status));
75999 + FreeDevice(pDevice);
76000 + /* keep loading other functions */
76001 + continue;
76002 + }
76003 + AddDeviceToList(pDevice);
76004 + /* look for a function driver to handle this card */
76005 + ProbeForFunction(pDevice, pHcd);
76006 + }
76007 +
76008 +
76009 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: DeviceAttach \n"));
76010 + return status;
76011 +}
76012 +
76013 +static INLINE void CompleteRequestCheckCancel(PSDHCD pHcd, PSDREQUEST pReqToComplete)
76014 +{
76015 + BOOL cancel = FALSE;
76016 + PSDFUNCTION pFunc = NULL;
76017 +
76018 + /* handle cancel of current request */
76019 + if (pReqToComplete->Flags & SDREQ_FLAGS_CANCELED) {
76020 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver - _SDIO_HandleHcdEvent: cancelling req 0X%X\n", (UINT)pReqToComplete));
76021 + cancel = TRUE;
76022 + pReqToComplete->Status = SDIO_STATUS_CANCELED;
76023 + pFunc = pReqToComplete->pFunction;
76024 + DBG_ASSERT(pFunc != NULL);
76025 + }
76026 +
76027 + DoRequestCompletion(pReqToComplete, pHcd);
76028 +
76029 + if (cancel) {
76030 + SignalSet(&pFunc->CleanupReqSig);
76031 + }
76032 +}
76033 +
76034 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76035 + @function: Indicate to the SDIO bus driver (core) of an event in the host controller
76036 + driver.
76037 +
76038 + @function name: SDIO_HandleHcdEvent
76039 + @prototype: SDIO_STATUS SDIO_HandleHcdEvent(PSDHCD pHcd, HCD_EVENT Event)
76040 + @category: HD_Reference
76041 +
76042 + @input: pHcd - the host controller structure that was registered
76043 + HCD_EVENT - event code
76044 +
76045 + @output: none
76046 +
76047 + @return: SDIO_STATUS
76048 +
76049 + @notes:
76050 + The host controller driver can indicate asynchronous events by calling this
76051 + function with an appropriate event code. Refer to the HDK help manual for
76052 + more information on the event types
76053 +
76054 + @example: Example of indicating a card insertion event:
76055 + SDIO_HandleHcdEvent(&Hcd, EVENT_HCD_ATTACH);
76056 +
76057 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76058 +SDIO_STATUS _SDIO_HandleHcdEvent(PSDHCD pHcd, HCD_EVENT Event)
76059 +{
76060 + PSDREQUEST pReq;
76061 + PSDREQUEST pReqToComplete = NULL;
76062 + PSDREQUEST pNextReq = NULL;
76063 + SDIO_STATUS status;
76064 + CT_DECLARE_IRQ_SYNC_CONTEXT();
76065 +
76066 + DBG_PRINT(SDIODBG_HCD_EVENTS, ("SDIO Bus Driver: _SDIO_HandleHcdEvent, event type 0x%X, HCD:0x%X\n",
76067 + Event, (UINT)pHcd));
76068 +
76069 + if (Event == EVENT_HCD_TRANSFER_DONE) {
76070 + pReq = GET_CURRENT_REQUEST(pHcd);
76071 + if (NULL == pReq) {
76072 + DBG_ASSERT(FALSE);
76073 + return SDIO_STATUS_ERROR;
76074 + }
76075 +
76076 + status = _AcquireHcdLock(pHcd);
76077 + if (SDIO_SUCCESS(status)) {
76078 + /* null out the current request */
76079 + SET_CURRENT_REQUEST(pHcd, NULL);
76080 + status = _ReleaseHcdLock(pHcd);
76081 + } else {
76082 + DBG_PRINT(SDDBG_ERROR,
76083 + ("SDIO Bus Driver: SDIO_HandleHcdEvent Failed to acquire HCD lock \n"));
76084 + return SDIO_STATUS_ERROR;
76085 + }
76086 +
76087 + /* note: the queue is still marked busy to prevent other threads/tasks from starting
76088 + * new requests while we are handling completion , some completed requests are
76089 + * marked as barrier requests which must be handled atomically */
76090 +
76091 + status = pReq->Status;
76092 + DBG_PRINT(SDIODBG_REQUESTS,
76093 + ("+SDIO Bus Driver: Handling Transfer Done (CMD:%d, Status:%d) from HCD:0x%08X \n",
76094 + pReq->Command, status, (INT)pHcd));
76095 + /* check SPI mode conversion */
76096 + if (IS_HCD_BUS_MODE_SPI(pHcd) && SDIO_SUCCESS(status)) {
76097 + if (!(pReq->Flags & SDREQ_FLAGS_RESP_SKIP_SPI_FILT) && !(pReq->Flags & SDREQ_FLAGS_PSEUDO) &&
76098 + (GET_SDREQ_RESP_TYPE(pReq->Flags) != SDREQ_FLAGS_NO_RESP)) {
76099 + ConvertSPI_Response(pReq, NULL);
76100 + }
76101 + }
76102 +
76103 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Completing Request:0x%08X \n",(INT)pReq));
76104 +
76105 + if (!SDIO_SUCCESS(status) &&
76106 + (status != SDIO_STATUS_CANCELED) &&
76107 + !(pReq->Flags & SDREQ_FLAGS_CANCELED) &&
76108 + (pReq->RetryCount > 0)) {
76109 + /* retry the request if it failed, was NOT cancelled and the retry count
76110 + * is greater than zero */
76111 + pReq->RetryCount--;
76112 + pReqToComplete = NULL;
76113 + /* clear SPI converted flag */
76114 + pReq->Flags &= ~SDREQ_FLAGS_RESP_SPI_CONVERTED;
76115 + pNextReq = pReq;
76116 + } else {
76117 + /* complete the request */
76118 + if (pReq->Flags & SDREQ_FLAGS_BARRIER) {
76119 + /* a barrier request must be completed before the next bus request is
76120 + * started */
76121 + CompleteRequestCheckCancel(pHcd, pReq);
76122 + if (!ForceAllRequestsAsync()) {
76123 + if (CHECK_API_VERSION_COMPAT(pHcd,2,6)) {
76124 + /* the request was completed, decrement recursion count */
76125 + status = _AcquireHcdLock(pHcd);
76126 + if (!SDIO_SUCCESS(status)) {
76127 + return status;
76128 + }
76129 + pHcd->Recursion--;
76130 + DBG_ASSERT(pHcd->Recursion >= 0);
76131 + status = _ReleaseHcdLock(pHcd);
76132 + } else {
76133 + /* reset bit */
76134 + AtomicTest_Clear(&pHcd->HcdFlags, HCD_REQUEST_CALL_BIT);
76135 + }
76136 + }
76137 + pReqToComplete = NULL;
76138 + } else {
76139 + /* complete this after the next request has
76140 + * been started */
76141 + pReqToComplete = pReq;
76142 + }
76143 + }
76144 +
76145 + /* acquire the hcd lock to look at the queues */
76146 + status = _AcquireHcdLock(pHcd);
76147 + if (SDIO_SUCCESS(status)) {
76148 + if (pReqToComplete != NULL) {
76149 + /* queue the request that was completed */
76150 + QueueRequest(&pHcd->CompletedRequestQueue, pReqToComplete);
76151 + }
76152 + if (NULL == pNextReq) {
76153 + /* check the queue for the next request */
76154 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Checking queue.. \n"));
76155 + /* check to see if the HCD was already working on one. This occurs if
76156 + * the current request being completed was a barrier request and the
76157 + * barrier completion routine submitted a new request to the head of the
76158 + * queue */
76159 + if (GET_CURRENT_REQUEST(pHcd) == NULL) {
76160 + pNextReq = DequeueRequest(&pHcd->RequestQueue);
76161 + if (NULL == pNextReq) {
76162 + /* nothing in the queue, mark it not busy */
76163 + MarkQueueNotBusy(&pHcd->RequestQueue);
76164 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Queue idle \n"));
76165 + } else {
76166 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Next request in queue: 0x%X \n",
76167 + (INT)pNextReq));
76168 + }
76169 + } else {
76170 + DBG_PRINT(SDIODBG_REQUESTS,
76171 + ("SDIO Bus Driver: Busy Queue from barrier request \n"));
76172 + }
76173 + }
76174 +
76175 + if (pNextReq != NULL) {
76176 + /* a new request will be submitted to the HCD below,
76177 + * check recursion while we have the lock */
76178 + if (CHECK_API_VERSION_COMPAT(pHcd,2,6)) {
76179 + CHECK_HCD_RECURSE(pHcd,pNextReq);
76180 + }
76181 + }
76182 + status = _ReleaseHcdLock(pHcd);
76183 + } else {
76184 + DBG_PRINT(SDDBG_ERROR,
76185 + ("SDIO Bus Driver: SDIO_HandleHcdEvent Failed to acquire HCD lock \n"));
76186 + return SDIO_STATUS_ERROR;
76187 + }
76188 + /* check for the next request to issue */
76189 + if (pNextReq != NULL) {
76190 + DBG_PRINT(SDIODBG_REQUESTS, ("SDIO Bus Driver: Starting Next Request: 0x%X \n",
76191 + (INT)pNextReq));
76192 + SET_CURRENT_REQUEST(pHcd,pNextReq);
76193 + status = CallHcdRequest(pHcd);
76194 + /* check and see if the HCD completed the request in the callback */
76195 + if (status != SDIO_STATUS_PENDING) {
76196 + /* recurse and process the request */
76197 + _SDIO_HandleHcdEvent(pHcd, EVENT_HCD_TRANSFER_DONE);
76198 + }
76199 + }
76200 +
76201 + /* now empty the completed request queue
76202 + * - this guarantees in-order completion even during recursion */
76203 + status = _AcquireHcdLock(pHcd);
76204 + if (SDIO_SUCCESS(status)) {
76205 + while (1) {
76206 + pReqToComplete = DequeueRequest(&pHcd->CompletedRequestQueue);
76207 + status = _ReleaseHcdLock(pHcd);
76208 + if (pReqToComplete != NULL) {
76209 + CompleteRequestCheckCancel(pHcd, pReqToComplete);
76210 + if (!CHECK_API_VERSION_COMPAT(pHcd,2,6)) {
76211 + if (!ForceAllRequestsAsync()) {
76212 + /* reset bit */
76213 + AtomicTest_Clear(&pHcd->HcdFlags, HCD_REQUEST_CALL_BIT);
76214 + }
76215 + }
76216 + /* re-acquire lock */
76217 + status = _AcquireHcdLock(pHcd);
76218 + if (!SDIO_SUCCESS(status)) {
76219 + return SDIO_STATUS_ERROR;
76220 + }
76221 + if (CHECK_API_VERSION_COMPAT(pHcd,2,6)) {
76222 + if (!ForceAllRequestsAsync()) {
76223 + /* while we have the lock, decrement recursion count each time
76224 + * we complete a request */
76225 + pHcd->Recursion--;
76226 + DBG_ASSERT(pHcd->Recursion >= 0);
76227 + }
76228 + }
76229 + } else {
76230 + /* we're done */
76231 + break;
76232 + }
76233 + }
76234 + } else {
76235 + DBG_PRINT(SDDBG_ERROR,
76236 + ("SDIO Bus Driver: SDIO_HandleHcdEvent Failed to acquire HCD lock \n"));
76237 + return SDIO_STATUS_ERROR;
76238 + }
76239 + DBG_PRINT(SDIODBG_REQUESTS, ("-SDIO Bus Driver: Transfer Done Handled \n"));
76240 + return SDIO_STATUS_SUCCESS;
76241 + }
76242 +
76243 + switch(Event) {
76244 + case EVENT_HCD_ATTACH:
76245 + case EVENT_HCD_DETACH:
76246 + /* card detect helper does the actual attach detach */
76247 + return PostCardDetectEvent(pBusContext,Event,pHcd);
76248 + case EVENT_HCD_SDIO_IRQ_PENDING:
76249 + return DeviceInterrupt(pHcd);
76250 + default:
76251 + DBG_PRINT(SDDBG_ERROR, ("-SDIO Bus Driver: SDIO_HandleHcdEvent, invalid event type 0x%X, HCD:0x%X\n",
76252 + Event, (UINT)pHcd));
76253 + return SDIO_STATUS_INVALID_PARAMETER;
76254 + }
76255 +
76256 +}
76257 +
76258 +/* card detect helper function */
76259 +THREAD_RETURN CardDetectHelperFunction(POSKERNEL_HELPER pHelper)
76260 +{
76261 + SDIO_STATUS status;
76262 + HCD_EVENT_MESSAGE message;
76263 + INT length;
76264 +
76265 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver - CardDetectHelperFunction starting up: 0x%X \n", (INT)pHelper));
76266 +
76267 + while (1) {
76268 +
76269 + /* wait for wake up event */
76270 + status = SD_WAIT_FOR_WAKEUP(pHelper);
76271 + if (!SDIO_SUCCESS(status)) {
76272 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver - Card Detect Helper Semaphore Pend Error:%d \n",
76273 + status));
76274 + break;
76275 + }
76276 +
76277 + if (SD_IS_HELPER_SHUTTING_DOWN(pHelper)) {
76278 + /* cleanup message queue on shutdown */
76279 + while (1) {
76280 + length = sizeof(message);
76281 + /* get a message */
76282 + status = SDLIB_GetMessage(pBusContext->pCardDetectMsgQueue,
76283 + &message, &length);
76284 + if (!SDIO_SUCCESS(status)) {
76285 + break;
76286 + }
76287 + if (message.pHcd != NULL) {
76288 + /* decrement HCD reference count */
76289 + OS_DecHcdReference(message.pHcd);
76290 + }
76291 + }
76292 +
76293 + break;
76294 + }
76295 +
76296 + while (1) {
76297 + length = sizeof(message);
76298 + /* get a message */
76299 + status = SDLIB_GetMessage(pBusContext->pCardDetectMsgQueue,
76300 + &message, &length);
76301 + if (!SDIO_SUCCESS(status)) {
76302 + break;
76303 + }
76304 +
76305 + switch (message.Event) {
76306 + case EVENT_HCD_ATTACH:
76307 + DeviceAttach(message.pHcd);
76308 + break;
76309 + case EVENT_HCD_DETACH:
76310 + DeviceDetach(message.pHcd);
76311 + break;
76312 + case EVENT_HCD_CD_POLLING:
76313 + /* run detector */
76314 + RunCardDetect();
76315 + break;
76316 + default:
76317 + DBG_ASSERT(FALSE);
76318 + break;
76319 + }
76320 +
76321 + if (message.pHcd != NULL) {
76322 + /* message was processed, decrement reference count */
76323 + OS_DecHcdReference(message.pHcd);
76324 + }
76325 + }
76326 + }
76327 +
76328 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver - Card Detect Helper Exiting.. \n"));
76329 + return 0;
76330 +}
76331 +
76332 +
76333 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76334 + RunCardDetect - run card detect on host controller slots that require polling
76335 + Input:
76336 + Output:
76337 + Return:
76338 + Notes: This function is called from the card detect timer thread
76339 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76340 +void RunCardDetect(void)
76341 +{
76342 + BOOL CDPollingRequired = FALSE;
76343 + PSDLIST pListItem;
76344 + PSDHCD pHcd;
76345 + BOOL cardPresent;
76346 +
76347 + DBG_PRINT(SDIODBG_CD_TIMER, ("+SDIO Bus Driver: RunCardDetect\n"));
76348 +
76349 + /* protect the HCD list */
76350 + if (!SDIO_SUCCESS(SemaphorePendInterruptable(&pBusContext->HcdListSem))) {
76351 + DBG_ASSERT(FALSE);
76352 + return; /* wait interrupted */
76353 + }
76354 + /* while we are running the detector we are blocking HCD removal*/
76355 + SDITERATE_OVER_LIST(&pBusContext->HcdList, pListItem) {
76356 + pHcd = CONTAINING_STRUCT(pListItem, SDHCD, SDList);
76357 + /* does the HCD require polling ? */
76358 + if (pHcd->Attributes & SDHCD_ATTRIB_SLOT_POLLING) {
76359 + DBG_PRINT(SDIODBG_CD_TIMER, ("SDIO Bus Driver: Found HCD requiring polling \n"));
76360 + /* set flag to queue the timer */
76361 + CDPollingRequired = TRUE;
76362 + if (IS_CARD_PRESENT(pHcd)) {
76363 + /* there is a device in the slot */
76364 + cardPresent = TRUE;
76365 + if (SDIO_SUCCESS(ScanSlotForCard(pHcd,&cardPresent))) {
76366 + if (!cardPresent) {
76367 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver CD Polling.. Card Removal Detected\n"));
76368 + DeviceDetach(pHcd);
76369 + }
76370 + }
76371 + } else {
76372 + cardPresent = FALSE;
76373 + if (SDIO_SUCCESS(ScanSlotForCard(pHcd,&cardPresent))) {
76374 + if (cardPresent) {
76375 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver CD Polling.. Card Detected\n"));
76376 + DeviceAttach(pHcd);
76377 + }
76378 + }
76379 + }
76380 + }
76381 +
76382 + DBG_PRINT(SDIODBG_CD_TIMER, ("SDIO Bus Driver: moving to next hcd:0x%X \n",
76383 + (INT)pListItem->pNext));
76384 + }
76385 +
76386 + /* check if we need to queue the timer */
76387 + if (CDPollingRequired && !pBusContext->CDTimerQueued) {
76388 + pBusContext->CDTimerQueued = TRUE;
76389 + DBG_PRINT(SDIODBG_CD_TIMER, ("SDIO Bus Driver: Queuing Card detect timer \n"));
76390 + if (!SDIO_SUCCESS(
76391 + QueueTimer(SDIOBUS_CD_TIMER_ID, pBusContext->CDPollingInterval))) {
76392 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: failed to queue CD timer \n"));
76393 + pBusContext->CDTimerQueued = FALSE;
76394 + }
76395 + }
76396 + /* release HCD list lock */
76397 + SemaphorePost(&pBusContext->HcdListSem);
76398 + DBG_PRINT(SDIODBG_CD_TIMER, ("-SDIO Bus Driver: RunCardDetect\n"));
76399 +}
76400 +
76401 +
76402 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76403 + ScanSlotForCard - scan slot for a card
76404 + Input: pHcd - the hcd
76405 + Output: pCardPresent - card present flag (set/cleared on return)
76406 + Return:
76407 + Notes:
76408 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76409 +static SDIO_STATUS ScanSlotForCard(PSDHCD pHcd,PBOOL pCardPresent)
76410 +{
76411 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
76412 + UINT8 temp;
76413 +
76414 + DBG_PRINT(SDIODBG_CD_TIMER, ("+SDIO Bus Driver: ScanSlotForCard\n"));
76415 +
76416 + do {
76417 + if (!IS_CARD_PRESENT(pHcd)) {
76418 + INT dbgLvl;
76419 + dbgLvl = DBG_GET_DEBUG_LEVEL();
76420 + DBG_SET_DEBUG_LEVEL(SDDBG_WARN);
76421 + status = CardInitSetup(pHcd);
76422 + DBG_SET_DEBUG_LEVEL(dbgLvl);
76423 + if (!SDIO_SUCCESS(status)) {
76424 + break;
76425 + }
76426 + /* issue go-idle */
76427 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
76428 + _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_RESP_R1,NULL);
76429 + } else {
76430 + _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_NO_RESP,NULL);
76431 + }
76432 + /* try SDIO */
76433 + status = TestPresence(pHcd,CARD_SDIO,NULL);
76434 + if (SDIO_SUCCESS(status)) {
76435 + *pCardPresent = TRUE;
76436 + break;
76437 + }
76438 + /* issue go-idle */
76439 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
76440 + _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_RESP_R1,NULL);
76441 + } else {
76442 + _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_NO_RESP,NULL);
76443 + }
76444 + /* try SD */
76445 + status = TestPresence(pHcd,CARD_SD,NULL);
76446 + if (SDIO_SUCCESS(status)) {
76447 + *pCardPresent = TRUE;
76448 + break;
76449 + }
76450 + /* issue go-idle */
76451 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
76452 + _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_RESP_R1,NULL);
76453 + } else {
76454 + _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_NO_RESP,NULL);
76455 + }
76456 + /* try MMC */
76457 + status = TestPresence(pHcd,CARD_MMC,NULL);
76458 + if (SDIO_SUCCESS(status)) {
76459 + *pCardPresent = TRUE;
76460 + break;
76461 + }
76462 + } else {
76463 + if (pHcd->CardProperties.Flags & CARD_SDIO) {
76464 +#ifdef DUMP_INT_PENDING
76465 + temp = 0;
76466 + /* handy debug prints to check interrupt status and print pending register */
76467 + status = Cmd52ReadByteCommon(pHcd->pPseudoDev, SDIO_INT_ENABLE_REG, &temp);
76468 + if (SDIO_SUCCESS(status) && (temp != 0)) {
76469 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: INT Enable Reg: 0x%2.2X\n", temp));
76470 + status = Cmd52ReadByteCommon(pHcd->pPseudoDev, SDIO_INT_PENDING_REG, &temp);
76471 + if (SDIO_SUCCESS(status)) {
76472 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: INT Pend Reg: 0x%2.2X\n", temp));
76473 + }
76474 + }
76475 +#endif
76476 + /* for SDIO cards, read the revision register */
76477 + status = Cmd52ReadByteCommon(pHcd->pPseudoDev, CCCR_SDIO_REVISION_REG, &temp);
76478 + } else if (pHcd->CardProperties.Flags & (CARD_SD | CARD_MMC)) {
76479 + /* for SD/MMC cards, issue SEND_STATUS */
76480 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
76481 + /* SPI uses the SPI R2 response */
76482 + status = _IssueSimpleBusRequest(pHcd,
76483 + CMD13,
76484 + 0,
76485 + SDREQ_FLAGS_RESP_R2,
76486 + NULL);
76487 + } else {
76488 + status = _IssueSimpleBusRequest(pHcd,
76489 + CMD13,
76490 + (pHcd->CardProperties.RCA << 16),
76491 + SDREQ_FLAGS_RESP_R1,NULL);
76492 + }
76493 + } else {
76494 + DBG_ASSERT(FALSE);
76495 + }
76496 + if (!SDIO_SUCCESS(status)) {
76497 + /* card is gone */
76498 + *pCardPresent = FALSE;
76499 + }
76500 + }
76501 + } while (FALSE);
76502 +
76503 + if (status == SDIO_STATUS_BUS_RESP_TIMEOUT) {
76504 + status = SDIO_STATUS_SUCCESS;
76505 + }
76506 +
76507 + DBG_PRINT(SDIODBG_CD_TIMER, ("-SDIO Bus Driver: ScanSlotForCard status:%d\n",
76508 + status));
76509 +
76510 + return status;
76511 +}
76512 +
76513 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76514 + DeviceInterrupt - handle device interrupt
76515 + Input: pHcd - host controller
76516 + Output:
76517 + Return:
76518 + Notes:
76519 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76520 +SDIO_STATUS DeviceInterrupt(PSDHCD pHcd)
76521 +{
76522 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
76523 + SDIO_STATUS status2;
76524 + PSDREQUEST pReq = NULL;
76525 + CT_DECLARE_IRQ_SYNC_CONTEXT();
76526 +
76527 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("+SDIO Bus Driver: DeviceInterrupt\n"));
76528 +
76529 + if (!IS_CARD_PRESENT(pHcd)) {
76530 + DBG_PRINT(SDDBG_ERROR, ("-SDIO Bus Driver: Device interrupt asserted on empty slot!\n"));
76531 + return SDIO_STATUS_ERROR;
76532 + }
76533 +
76534 + do {
76535 + /* for RAW HCDs or HCDs flagged for single-function IRQ optimization */
76536 + if (IS_HCD_RAW(pHcd) || (pHcd->HcdFlags & (1 << HCD_IRQ_NO_PEND_CHECK))) {
76537 + status = _AcquireHcdLock(pHcd);
76538 + if (!SDIO_SUCCESS(status)) {
76539 + return status;
76540 + }
76541 + if (pHcd->IrqProcState != SDHCD_IDLE) {
76542 + status = SDIO_STATUS_ERROR;
76543 + status2 = _ReleaseHcdLock(pHcd);
76544 + } else {
76545 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver : Device Interrupt \n"));
76546 + /* mark that we are processing */
76547 + pHcd->IrqProcState = SDHCD_IRQ_PENDING;
76548 + status2 = _ReleaseHcdLock(pHcd);
76549 + /* process Irqs for raw hcds or HCDs with the single function optimization */
76550 + /* force processing of function 1 interrupt */
76551 + ProcessPendingIrqs(pHcd, (1 << 1));
76552 + }
76553 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("-SDIO Bus Driver: DeviceInterrupt: %d\n", status));
76554 + /* done with RAW irqs */
76555 + return status;
76556 + }
76557 +
76558 + /* pre-allocate a request to get the pending bits, we have to do this outside the
76559 + * hcd lock acquisition */
76560 + pReq = AllocateRequest();
76561 +
76562 + if (NULL == pReq) {
76563 + status = SDIO_STATUS_NO_RESOURCES;
76564 + break;
76565 + }
76566 +
76567 + status = _AcquireHcdLock(pHcd);
76568 +
76569 + if (!SDIO_SUCCESS(status)) {
76570 + break;
76571 + }
76572 +
76573 + if (pHcd->IrqProcState != SDHCD_IDLE) {
76574 + status = SDIO_STATUS_ERROR;
76575 + } else {
76576 + /* mark that we are processing */
76577 + pHcd->IrqProcState = SDHCD_IRQ_PENDING;
76578 + /* build argument to read IRQ pending register */
76579 + SDIO_SET_CMD52_READ_ARG(pReq->Argument,0,SDIO_INT_PENDING_REG);
76580 + pReq->Command = CMD52;
76581 + pReq->Flags = SDREQ_FLAGS_TRANS_ASYNC | SDREQ_FLAGS_RESP_SDIO_R5;
76582 + pReq->pCompleteContext = (PVOID)pHcd;
76583 + pReq->pCompletion = GetPendingIrqComplete;
76584 + pReq->RetryCount = SDBUS_MAX_RETRY;
76585 + }
76586 +
76587 + status2 = _ReleaseHcdLock(pHcd);
76588 +
76589 + if (!SDIO_SUCCESS(status2)) {
76590 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: lock release error: %d\n", status2));
76591 + }
76592 +
76593 + } while (FALSE);
76594 +
76595 + if (SDIO_SUCCESS(status)) {
76596 + DBG_ASSERT(pReq != NULL);
76597 + IssueRequestToHCD(pHcd,pReq);
76598 + status = SDIO_STATUS_PENDING;
76599 + } else {
76600 + if (pReq != NULL) {
76601 + FreeRequest(pReq);
76602 + }
76603 + }
76604 +
76605 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("-SDIO Bus Driver: DeviceInterrupt: %d\n", status));
76606 + return status;
76607 +}
76608 +
76609 +
76610 +/* SDIO IRQ helper */
76611 +THREAD_RETURN SDIOIrqHelperFunction(POSKERNEL_HELPER pHelper)
76612 +{
76613 + PSDHCD pHcd;
76614 + SDIO_STATUS status;
76615 + PSDLIST pListItem;
76616 + PSDDEVICE pDevice;
76617 + UINT8 funcMask;
76618 + PSDDEVICE pDeviceIRQ[7];
76619 + UINT deviceIrqCount = 0;
76620 + UINT ii;
76621 +
76622 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver - SDIOIrqHelperFunction starting up \n"));
76623 +
76624 + pHcd = (PSDHCD)pHelper->pContext;
76625 + DBG_ASSERT(pHcd != NULL);
76626 +
76627 + while (1) {
76628 +
76629 + /* wait for wake up event */
76630 + status = SD_WAIT_FOR_WAKEUP(pHelper);
76631 +
76632 + if (!SDIO_SUCCESS(status)) {
76633 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver - SDIOIrqHelperFunction Pend Error:%d \n",
76634 + status));
76635 + break;
76636 + }
76637 +
76638 + if (SD_IS_HELPER_SHUTTING_DOWN(pHelper)) {
76639 + break;
76640 + }
76641 +
76642 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver - Pending IRQs:0x%X \n",
76643 + pHcd->PendingHelperIrqs));
76644 +
76645 + /* take the device list lock as we iterate through the list, this blocks
76646 + * device removals */
76647 + status = SemaphorePendInterruptable(&pBusContext->DeviceListSem);
76648 + if (!SDIO_SUCCESS(status)) {
76649 + break;
76650 + }
76651 + /* walk through the device list matching HCD and interrupting function */
76652 + SDITERATE_OVER_LIST(&pBusContext->DeviceList, pListItem) {
76653 + pDevice = CONTAINING_STRUCT(pListItem, SDDEVICE, SDList);
76654 + /* check if device belongs to the HCD */
76655 + if (pDevice->pHcd != pHcd){
76656 + /* not on this hcd */
76657 + continue;
76658 + }
76659 + funcMask = 1 << SDDEVICE_GET_SDIO_FUNCNO(pDevice);
76660 + /* check device function against the pending mask */
76661 + if (!(funcMask & pHcd->PendingHelperIrqs)) {
76662 + /* this one is not scheduled for the helper */
76663 + continue;
76664 + }
76665 + /* clear bit */
76666 + pHcd->PendingHelperIrqs &= ~funcMask;
76667 + /* check for sync IRQ and call handler */
76668 + if (pDevice->pIrqFunction != NULL) {
76669 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver: Calling IRQ Handler. Fn:%d\n",
76670 + SDDEVICE_GET_SDIO_FUNCNO(pDevice)));
76671 + /* save the device so we can process it without holding any locks */
76672 + pDeviceIRQ[deviceIrqCount++] = pDevice;
76673 + } else {
76674 + /* this is actually okay if the device is removing, the callback
76675 + * is NULLed out */
76676 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver: No IRQ handler Fn:%d\n",
76677 + SDDEVICE_GET_SDIO_FUNCNO(pDevice)));
76678 + }
76679 + }
76680 + /* should have handled all these */
76681 + DBG_ASSERT(pHcd->PendingHelperIrqs == 0);
76682 + pHcd->PendingHelperIrqs = 0;
76683 + SemaphorePost(&pBusContext->DeviceListSem);
76684 + for (ii = 0; ii < deviceIrqCount; ii++) {
76685 + /* now call the function */
76686 + SDDEVICE_CALL_IRQ_HANDLER(pDeviceIRQ[ii]);
76687 + }
76688 + deviceIrqCount = 0;
76689 + }
76690 +
76691 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver - SDIOIrqHelperFunction Exiting.. \n"));
76692 + return 0;
76693 +}
76694 +
76695 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76696 + GetPendingIrqComplete - completion routine for getting pending IRQs
76697 + Input: pRequest - completed request
76698 + Output:
76699 + Return:
76700 + Notes:
76701 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76702 +static void GetPendingIrqComplete(PSDREQUEST pReq)
76703 +{
76704 + UINT8 intPendingMsk;
76705 + PSDHCD pHcd;
76706 +
76707 + do {
76708 + pHcd = (PSDHCD)pReq->pCompleteContext;
76709 + DBG_ASSERT(pHcd != NULL);
76710 +
76711 + if (!SDIO_SUCCESS(pReq->Status)) {
76712 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get Interrupt pending register Err:%d\n",
76713 + pReq->Status));
76714 + break;
76715 + }
76716 +
76717 + if (SD_R5_GET_RESP_FLAGS(pReq->Response) & SD_R5_ERRORS) {
76718 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: CMD52 resp error: 0x%X \n",
76719 + SD_R5_GET_RESP_FLAGS(pReq->Response)));
76720 + break;
76721 + }
76722 + /* extract the pending mask */
76723 + intPendingMsk = SD_R5_GET_READ_DATA(pReq->Response) & SDIO_INT_PEND_MASK;
76724 + /* process them */
76725 + ProcessPendingIrqs(pHcd, intPendingMsk);
76726 +
76727 + } while (FALSE);
76728 +
76729 + FreeRequest(pReq);
76730 +
76731 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("-SDIO Bus Driver: GetPendingIrqComplete \n"));
76732 +}
76733 +
76734 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76735 + ProcessPendingIrqs - processing pending Irqs
76736 + Input: pHcd - host controller
76737 + Input: IntPendingMsk - pending irq bit mask
76738 + Output:
76739 + Return:
76740 + Notes:
76741 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76742 +static void ProcessPendingIrqs(PSDHCD pHcd, UINT8 IntPendingMsk)
76743 +{
76744 + PSDLIST pListItem;
76745 + PSDDEVICE pDevice;
76746 + UINT8 funcMask;
76747 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
76748 + CT_DECLARE_IRQ_SYNC_CONTEXT();
76749 +
76750 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("+SDIO Bus Driver: ProcessPendingIrqs \n"));
76751 + do {
76752 + /* acquire lock to protect configuration and irq enables */
76753 + status = _AcquireHcdLock(pHcd);
76754 + if (!SDIO_SUCCESS(status)) {
76755 + break;
76756 + }
76757 +
76758 + /* sanity check */
76759 + if ((IntPendingMsk & pHcd->IrqsEnabled) != IntPendingMsk) {
76760 + DBG_PRINT(SDDBG_ERROR,
76761 + ("SDIO Bus Driver: IRQs asserting when not enabled : curr:0x%X , card reports: 0x%X\n",
76762 + pHcd->IrqsEnabled, IntPendingMsk));
76763 + /* remove the pending IRQs that are not enabled */
76764 + IntPendingMsk &= pHcd->IrqsEnabled;
76765 + /* fall through */
76766 + }
76767 +
76768 + if (!IntPendingMsk) {
76769 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: No interrupts on HCD:0x%X \n", (INT)pHcd));
76770 + pHcd->IrqProcState = SDHCD_IDLE;
76771 + if (pHcd->IrqsEnabled) {
76772 + /* only re-arm if there are IRQs enabled */
76773 + _IssueConfig(pHcd,SDCONFIG_SDIO_REARM_INT,NULL,0);
76774 + }
76775 + status = _ReleaseHcdLock(pHcd);
76776 + break;
76777 + }
76778 + /* reset helper IRQ bits */
76779 + pHcd->PendingHelperIrqs = 0;
76780 + /* save pending IRQ acks */
76781 + pHcd->PendingIrqAcks = IntPendingMsk;
76782 + status = _ReleaseHcdLock(pHcd);
76783 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver: INTs Pending - 0x%2.2X \n", IntPendingMsk));
76784 + /* take the device list lock as we iterate through the list, this blocks
76785 + * device removals */
76786 + status = SemaphorePendInterruptable(&pBusContext->DeviceListSem);
76787 + if (!SDIO_SUCCESS(status)) {
76788 + break;
76789 + }
76790 + /* walk through the device list matching HCD and interrupting function */
76791 + SDITERATE_OVER_LIST(&pBusContext->DeviceList, pListItem) {
76792 + pDevice = CONTAINING_STRUCT(pListItem, SDDEVICE, SDList);
76793 + /* check if device belongs to the HCD */
76794 + if (pDevice->pHcd != pHcd){
76795 + /* not on this hcd */
76796 + continue;
76797 + }
76798 + funcMask = 1 << SDDEVICE_GET_SDIO_FUNCNO(pDevice);
76799 + /* check device function against the pending mask */
76800 + if (!(funcMask & IntPendingMsk)) {
76801 + /* this one is not interrupting */
76802 + continue;
76803 + }
76804 + /* check for async IRQ and call handler */
76805 + if (pDevice->pIrqAsyncFunction != NULL) {
76806 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver: Calling Async IRQ Handler. Fn:%d\n",
76807 + SDDEVICE_GET_SDIO_FUNCNO(pDevice)));
76808 + SDDEVICE_CALL_IRQ_ASYNC_HANDLER(pDevice);
76809 + } else {
76810 + /* this one needs the helper */
76811 + pHcd->PendingHelperIrqs |= funcMask;
76812 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver: No Async IRQ, Pending Helper Fn:%d\n",
76813 + SDDEVICE_GET_SDIO_FUNCNO(pDevice)));
76814 + }
76815 + }
76816 + /* release HCD list lock */
76817 + SemaphorePost(&pBusContext->DeviceListSem);
76818 + /* check for helper IRQs */
76819 + if (pHcd->PendingHelperIrqs) {
76820 + pHcd->IrqProcState = SDHCD_IRQ_HELPER;
76821 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver: Waking IRQ Helper \n"));
76822 + if (!SDIO_SUCCESS(SD_WAKE_OS_HELPER(&pHcd->SDIOIrqHelper))) {
76823 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: failed to wake helper! \n"));
76824 + }
76825 + }
76826 + } while (FALSE);
76827 +
76828 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("-SDIO Bus Driver: ProcessPendingIrqs \n"));
76829 +}
76830 +
76831 +SDIO_STATUS TryNoIrqPendingCheck(PSDDEVICE pDevice)
76832 +{
76833 + if (pDevice->pHcd->CardProperties.IOFnCount > 1) {
76834 + /* not supported on multi-function cards */
76835 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: IRQ Pending Check cannot be bypassed, (Funcs:%d)\n",
76836 + pDevice->pHcd->CardProperties.IOFnCount));
76837 + return SDIO_STATUS_UNSUPPORTED;
76838 + }
76839 +
76840 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: pending IRQ check bypassed \n"));
76841 + /* set flag to optimize this */
76842 + AtomicTest_Set(&pDevice->pHcd->HcdFlags, HCD_IRQ_NO_PEND_CHECK);
76843 + return SDIO_STATUS_SUCCESS;
76844 +}
76845 +
76846 +
76847 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76848 + SDIO_NotifyTimerTriggered - notification handler that a timer expired
76849 + Input: TimerID - ID of timer that expired
76850 + Output:
76851 + Return:
76852 + Notes:
76853 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76854 +void SDIO_NotifyTimerTriggered(INT TimerID)
76855 +{
76856 +
76857 + switch (TimerID) {
76858 + case SDIOBUS_CD_TIMER_ID:
76859 + pBusContext->CDTimerQueued = FALSE;
76860 + /* post an HCD polling event to the helper thread */
76861 + PostCardDetectEvent(pBusContext, EVENT_HCD_CD_POLLING, NULL);
76862 + break;
76863 + default:
76864 + DBG_ASSERT(FALSE);
76865 + }
76866 +
76867 +}
76868 Index: linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_bus_misc.c
76869 ===================================================================
76870 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
76871 +++ linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_bus_misc.c 2008-12-11 22:46:49.000000000 +0100
76872 @@ -0,0 +1,3122 @@
76873 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76874 +@file: sdio_bus_misc.c
76875 +
76876 +@abstract: OS independent bus driver support
76877 +
76878 +#notes: this file contains miscellaneous control functions
76879 +
76880 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
76881 +
76882 +
76883 + *
76884 + * This program is free software; you can redistribute it and/or modify
76885 + * it under the terms of the GNU General Public License version 2 as
76886 + * published by the Free Software Foundation;
76887 + *
76888 + * Software distributed under the License is distributed on an "AS
76889 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
76890 + * implied. See the License for the specific language governing
76891 + * rights and limitations under the License.
76892 + *
76893 + * Portions of this code were developed with information supplied from the
76894 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
76895 + *
76896 + * The following conditions apply to the release of the SD simplified specification (�Simplified
76897 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
76898 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
76899 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
76900 + * Specification may require a license from the SD Card Association or other third parties.
76901 + * Disclaimers:
76902 + * The information contained in the Simplified Specification is presented only as a standard
76903 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
76904 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
76905 + * any damages, any infringements of patents or other right of the SD Card Association or any third
76906 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
76907 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
76908 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
76909 + * information, know-how or other confidential information to any third party.
76910 + *
76911 + *
76912 + * The initial developers of the original code are Seung Yi and Paul Lever
76913 + *
76914 + * sdio@atheros.com
76915 + *
76916 + *
76917 +
76918 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76919 +#define MODULE_NAME SDBUSDRIVER
76920 +#include <linux/sdio/ctsystem.h>
76921 +#include <linux/sdio/sdio_busdriver.h>
76922 +#include <linux/sdio/sdio_lib.h>
76923 +#include "_busdriver.h"
76924 +#include <linux/sdio/_sdio_defs.h>
76925 +#include <linux/sdio/mmc_defs.h>
76926 +
76927 +
76928 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76929 + IssueBusRequestBd - issue a bus request
76930 + Input: pHcd - HCD object
76931 + Cmd - command to issue
76932 + Argument - command argument
76933 + Flags - request flags
76934 +
76935 + Output: pReqToUse - request to use (if caller wants response data)
76936 + Return: SDIO Status
76937 + Notes: This function only issues 1 block data transfers
76938 + This function issues the request synchronously
76939 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76940 +SDIO_STATUS _IssueBusRequestBd(PSDHCD pHcd,
76941 + UINT8 Cmd,
76942 + UINT32 Argument,
76943 + SDREQUEST_FLAGS Flags,
76944 + PSDREQUEST pReqToUse,
76945 + PVOID pData,
76946 + INT Length)
76947 +{
76948 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
76949 + PSDREQUEST pReq;
76950 +
76951 + if (NULL == pReqToUse) {
76952 + /* caller doesn't care about the response data, allocate locally */
76953 + pReq = AllocateRequest();
76954 + if (NULL == pReq) {
76955 + return SDIO_STATUS_NO_RESOURCES;
76956 + }
76957 + } else {
76958 + /* use the caller's request buffer */
76959 + pReq = pReqToUse;
76960 + }
76961 +
76962 + pReq->Argument = Argument;
76963 + pReq->Flags = Flags;
76964 + pReq->Command = Cmd;
76965 + if (pReq->Flags & SDREQ_FLAGS_DATA_TRANS) {
76966 + pReq->pDataBuffer = pData;
76967 + pReq->BlockCount = 1;
76968 + pReq->BlockLen = Length;
76969 + }
76970 +
76971 + status = IssueRequestToHCD(pHcd,pReq);
76972 +
76973 + if (NULL == pReqToUse) {
76974 + DBG_ASSERT(pReq != NULL);
76975 + FreeRequest(pReq);
76976 + }
76977 + return status;
76978 +}
76979 +
76980 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
76981 + ConvertVoltageCapsToOCRMask - initialize card
76982 + Input: VoltageCaps - voltage cap to look up
76983 + Return: 32 bit OCR mask
76984 + Notes: this function sets voltage for +- 10%
76985 +
76986 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
76987 +static UINT32 ConvertVoltageCapsToOCRMask(SLOT_VOLTAGE_MASK VoltageCaps)
76988 +{
76989 + UINT32 ocrMask;
76990 +
76991 + ocrMask = 0;
76992 +
76993 + if (VoltageCaps & SLOT_POWER_3_3V) {
76994 + ocrMask |= SD_OCR_3_2_TO_3_3_VDD | SD_OCR_3_3_TO_3_4_VDD;
76995 + }
76996 + if (VoltageCaps & SLOT_POWER_3_0V) {
76997 + ocrMask |= SD_OCR_2_9_TO_3_0_VDD | SD_OCR_3_0_TO_3_1_VDD;
76998 + }
76999 + if (VoltageCaps & SLOT_POWER_2_8V) {
77000 + ocrMask |= SD_OCR_2_7_TO_2_8_VDD | SD_OCR_2_8_TO_2_9_VDD;
77001 + }
77002 + if (VoltageCaps & SLOT_POWER_2_0V) {
77003 + ocrMask |= SD_OCR_1_9_TO_2_0_VDD | SD_OCR_2_0_TO_2_1_VDD;
77004 + }
77005 + if (VoltageCaps & SLOT_POWER_1_8V) {
77006 + ocrMask |= SD_OCR_1_7_TO_1_8_VDD | SD_OCR_1_8_TO_1_9_VDD;
77007 + }
77008 + if (VoltageCaps & SLOT_POWER_1_6V) {
77009 + ocrMask |= SD_OCR_1_6_TO_1_7_VDD;
77010 + }
77011 +
77012 + return ocrMask;
77013 +}
77014 +
77015 +static UINT32 GetUsableOCRValue(UINT32 CardOCR, UINT32 SlotOCRMask)
77016 +{
77017 + INT i;
77018 + UINT32 mask = 0;
77019 +
77020 + for (i = 0; i < 32; i++) {
77021 + mask = 1 << i;
77022 + if ((SlotOCRMask & mask) && (CardOCR & mask)) {
77023 + return mask;
77024 + }
77025 + }
77026 +
77027 + return mask;
77028 +}
77029 +
77030 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77031 + GetPowerSetting - power up the SDIO card
77032 + Input: pHcd - HCD object
77033 + pOCRvalue - OCR value of the card
77034 + Output: pOCRvalue - OCR to actually use
77035 + Return: power setting for HCD based on card's OCR, zero indicates unsupported
77036 + Notes:
77037 +
77038 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77039 +static SLOT_VOLTAGE_MASK GetPowerSetting(PSDHCD pHcd, UINT32 *pOCRvalue)
77040 +{
77041 + UINT32 ocrMask;
77042 + SLOT_VOLTAGE_MASK hcdVoltage = 0;
77043 + SLOT_VOLTAGE_MASK hcdVMask;
77044 + INT i;
77045 +
77046 + /* check preferred value */
77047 + ocrMask = ConvertVoltageCapsToOCRMask(pHcd->SlotVoltagePreferred);
77048 + if (ocrMask & *pOCRvalue) {
77049 + /* using preferred voltage */
77050 + *pOCRvalue = GetUsableOCRValue(*pOCRvalue, ocrMask);
77051 + hcdVoltage = pHcd->SlotVoltagePreferred;
77052 + } else {
77053 + /* walk through the slot voltage caps and find a match */
77054 + for (i = 0; i < 8; i++) {
77055 + hcdVMask = (1 << i);
77056 + if (hcdVMask & pHcd->SlotVoltageCaps) {
77057 + ocrMask = ConvertVoltageCapsToOCRMask((SLOT_VOLTAGE_MASK)(pHcd->SlotVoltageCaps & hcdVMask));
77058 + if (ocrMask & *pOCRvalue) {
77059 + /* found a match */
77060 + *pOCRvalue = GetUsableOCRValue(*pOCRvalue, ocrMask);
77061 + hcdVoltage = pHcd->SlotVoltageCaps & hcdVMask;
77062 + break;
77063 + }
77064 + }
77065 + }
77066 + }
77067 +
77068 + return hcdVoltage;
77069 +}
77070 +
77071 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77072 + TestPresence - test the presence of a card/function
77073 + Input: pHcd - HCD object
77074 + TestType - type of test to perform
77075 + Output: pReq - Request to use (optional)
77076 + Return:
77077 + Notes:
77078 +
77079 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77080 +SDIO_STATUS TestPresence(PSDHCD pHcd,
77081 + CARD_INFO_FLAGS TestType,
77082 + PSDREQUEST pReq)
77083 +{
77084 + SDIO_STATUS status = SDIO_STATUS_ERROR;
77085 +
77086 + switch (TestType) {
77087 + case CARD_SDIO:
77088 + /* issue CMD5 */
77089 + status = _IssueSimpleBusRequest(pHcd,CMD5,0,
77090 + SDREQ_FLAGS_RESP_SDIO_R4 | SDREQ_FLAGS_RESP_SKIP_SPI_FILT,pReq);
77091 + break;
77092 + case CARD_SD:
77093 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77094 + /* ACMD41 just starts initialization when in SPI mode, argument is ignored
77095 + * Note: In SPI mode ACMD41 uses an R1 response */
77096 + status = _IssueSimpleBusRequest(pHcd,ACMD41,0,
77097 + SDREQ_FLAGS_APP_CMD | SDREQ_FLAGS_RESP_R1,pReq);
77098 +
77099 + } else {
77100 + /* issue ACMD41 with OCR value of zero */
77101 + /* ACMD41 on SD uses an R3 response */
77102 + status = _IssueSimpleBusRequest(pHcd,ACMD41,0,
77103 + SDREQ_FLAGS_APP_CMD | SDREQ_FLAGS_RESP_R3,pReq);
77104 + }
77105 + break;
77106 + case CARD_MMC:
77107 + /* issue CMD1 */
77108 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77109 + /* note: in SPI mode an R1 response is used */
77110 + status = _IssueSimpleBusRequest(pHcd,CMD1,0,SDREQ_FLAGS_RESP_R1,pReq);
77111 + } else {
77112 + status = _IssueSimpleBusRequest(pHcd,CMD1,0,SDREQ_FLAGS_RESP_R3,pReq);
77113 + }
77114 + break;
77115 + default:
77116 + DBG_ASSERT(FALSE);
77117 + break;
77118 + }
77119 +
77120 + return status;
77121 +}
77122 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77123 + ReadOCR - read the OCR
77124 + Input: pHcd - HCD object
77125 + ReadType - type of read to perform
77126 + OCRValue - OCR value to use as an argument
77127 + Output: pReq - Request to use
77128 + pOCRValueRd - OCR value read back (can be NULL)
77129 + Return:
77130 + Notes:
77131 +
77132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77133 +static SDIO_STATUS ReadOCR(PSDHCD pHcd,
77134 + CARD_INFO_FLAGS ReadType,
77135 + PSDREQUEST pReq,
77136 + UINT32 OCRValue,
77137 + UINT32 *pOCRValueRd)
77138 +{
77139 + SDIO_STATUS status = SDIO_STATUS_ERROR;
77140 +
77141 + switch (ReadType) {
77142 + case CARD_SDIO:
77143 + /* CMD5 for SDIO cards */
77144 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77145 + /* skip the SPI filter, we will decode the response here */
77146 + status = _IssueSimpleBusRequest(pHcd,CMD5,
77147 + OCRValue,
77148 + SDREQ_FLAGS_RESP_SDIO_R4 |
77149 + SDREQ_FLAGS_RESP_SKIP_SPI_FILT,
77150 + pReq);
77151 + } else {
77152 + /* native SD */
77153 + status = _IssueSimpleBusRequest(pHcd,CMD5,
77154 + OCRValue,
77155 + SDREQ_FLAGS_RESP_SDIO_R4,
77156 + pReq);
77157 + }
77158 + break;
77159 + case CARD_SD:
77160 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77161 + /* CMD58 is used to read the OCR */
77162 + status = _IssueSimpleBusRequest(pHcd,CMD58,
77163 + 0, /* argument ignored */
77164 + (SDREQ_FLAGS_RESP_R3 | SDREQ_FLAGS_RESP_SKIP_SPI_FILT),
77165 + pReq);
77166 + } else {
77167 + /* SD Native uses ACMD41 */
77168 + status = _IssueSimpleBusRequest(pHcd,ACMD41,
77169 + OCRValue,
77170 + SDREQ_FLAGS_APP_CMD | SDREQ_FLAGS_RESP_R3,
77171 + pReq);
77172 + }
77173 + break;
77174 + case CARD_MMC:
77175 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77176 + /* CMD58 is used to read the OCR */
77177 + status = _IssueSimpleBusRequest(pHcd,CMD58,
77178 + 0, /* argument ignored */
77179 + (SDREQ_FLAGS_RESP_R3 | SDREQ_FLAGS_RESP_SKIP_SPI_FILT),
77180 + pReq);
77181 + } else {
77182 + /* MMC Native uses CMD1 */
77183 + status = _IssueSimpleBusRequest(pHcd,CMD1,
77184 + OCRValue, SDREQ_FLAGS_RESP_R3,
77185 + pReq);
77186 + }
77187 + break;
77188 + default:
77189 + DBG_ASSERT(FALSE);
77190 + break;
77191 + }
77192 +
77193 + if (SDIO_SUCCESS(status) && (pOCRValueRd != NULL)) {
77194 + *pOCRValueRd = 0;
77195 + /* someone wants the OCR read back */
77196 + switch (ReadType) {
77197 + case CARD_SDIO:
77198 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77199 + *pOCRValueRd = SPI_SDIO_R4_GET_OCR(pReq->Response);
77200 + } else {
77201 + *pOCRValueRd = SD_SDIO_R4_GET_OCR(pReq->Response);
77202 + }
77203 + break;
77204 + case CARD_SD:
77205 + case CARD_MMC:
77206 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77207 + *pOCRValueRd = SPI_R3_GET_OCR(pReq->Response);
77208 + } else {
77209 + *pOCRValueRd = SD_R3_GET_OCR(pReq->Response);
77210 + }
77211 + break;
77212 + default:
77213 + DBG_ASSERT(FALSE);
77214 + break;
77215 + }
77216 + }
77217 + return status;
77218 +}
77219 +
77220 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77221 + PollCardReady - poll card till it's ready
77222 + Input: pHcd - HCD object
77223 + OCRValue - OCR value to poll with
77224 + PollType - polling type (based on card type)
77225 + Output:
77226 + Return:
77227 + Notes:
77228 +
77229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77230 +SDIO_STATUS PollCardReady(PSDHCD pHcd, UINT32 OCRValue, CARD_INFO_FLAGS PollType)
77231 +{
77232 + INT cardReadyRetry;
77233 + SDIO_STATUS status;
77234 + PSDREQUEST pReq;
77235 +
77236 + if (!((PollType == CARD_SDIO) || (PollType == CARD_SD) || (PollType == CARD_MMC))) {
77237 + DBG_ASSERT(FALSE);
77238 + return SDIO_STATUS_INVALID_PARAMETER;
77239 + }
77240 +
77241 + pReq = AllocateRequest();
77242 + if (NULL == pReq) {
77243 + return SDIO_STATUS_NO_RESOURCES;
77244 + }
77245 +
77246 + status = SDIO_STATUS_SUCCESS;
77247 + cardReadyRetry = pBusContext->CardReadyPollingRetry;
77248 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Polling card ready, Using OCR:0x%8.8X, Poll Type:0x%X\n",
77249 + OCRValue,PollType));
77250 +
77251 + /* now issue CMD with the actual OCR as an argument until the card is ready */
77252 + while (cardReadyRetry) {
77253 + if (IS_HCD_BUS_MODE_SPI(pHcd) && !(PollType == CARD_SDIO)) {
77254 + if (PollType == CARD_MMC) {
77255 + /* under SPI mode for MMC cards, we need to issue CMD1 and
77256 + * check the response for the "in-idle" bit */
77257 + status = _IssueSimpleBusRequest(pHcd,
77258 + CMD1,
77259 + 0,
77260 + SDREQ_FLAGS_RESP_R1 | SDREQ_FLAGS_RESP_SKIP_SPI_FILT,
77261 + pReq);
77262 + } else if (PollType == CARD_SD) {
77263 + /* under SPI mode for SD cards, we need to issue ACMD41 and
77264 + * check the response for the "in-idle" bit */
77265 + status = _IssueSimpleBusRequest(pHcd,
77266 + ACMD41,
77267 + 0,
77268 + SDREQ_FLAGS_RESP_R1 |
77269 + SDREQ_FLAGS_APP_CMD |
77270 + SDREQ_FLAGS_RESP_SKIP_SPI_FILT,
77271 + pReq);
77272 + } else {
77273 + DBG_ASSERT(FALSE);
77274 + }
77275 + } else {
77276 + /* for SD/MMC in native mode and SDIO (all modes) we need to read the OCR register */
77277 + /* read the OCR using the supplied OCR value as an argument, we don't care about the
77278 + * actual OCR read-back, but we are interested in the response */
77279 + status = ReadOCR(pHcd,PollType,pReq,OCRValue,NULL);
77280 + }
77281 +
77282 + if (!SDIO_SUCCESS(status)) {
77283 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to issue CMD to poll ready \n"));
77284 + break;
77285 + }
77286 + if (PollType == CARD_SDIO) {
77287 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77288 + if (SPI_SDIO_R4_IS_CARD_READY(pReq->Response)) {
77289 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SDIO Card Ready! (SPI) \n"));
77290 + break;
77291 + }
77292 + } else {
77293 + if (SD_SDIO_R4_IS_CARD_READY(pReq->Response)) {
77294 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SDIO Card Ready! \n"));
77295 + break;
77296 + }
77297 + }
77298 + } else if ((PollType == CARD_SD) || (PollType == CARD_MMC)) {
77299 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77300 + /* check response when MMC or SD cards operate in SPI mode */
77301 + if (!(GET_SPI_R1_RESP_TOKEN(pReq->Response) & SPI_CS_STATE_IDLE)) {
77302 + /* card is no longer in idle */
77303 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SD/MMC Card (SPI mode) is ready! \n"));
77304 + break;
77305 + }
77306 + } else {
77307 + /* check the OCR busy bit */
77308 + if (SD_R3_IS_CARD_READY(pReq->Response)) {
77309 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SD/MMC (Native Mode) Card Ready! \n"));
77310 + break;
77311 + }
77312 + }
77313 + } else {
77314 + DBG_ASSERT(FALSE);
77315 + }
77316 + cardReadyRetry--;
77317 + /* delay */
77318 + status = OSSleep(OCR_READY_CHECK_DELAY_MS);
77319 + if (!SDIO_SUCCESS(status)){
77320 + break;
77321 + }
77322 + }
77323 +
77324 + if (0 == cardReadyRetry) {
77325 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Card Ready timeout! \n"));
77326 + status = SDIO_STATUS_DEVICE_ERROR;
77327 + }
77328 +
77329 + FreeRequest(pReq);
77330 +
77331 + return status;
77332 +}
77333 +
77334 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77335 + AdjustSlotPower - adjust slot power
77336 + Input: pHcd - HCD object
77337 + Output: pOCRvalue - ocr value to use
77338 + Return:
77339 + Notes:
77340 +
77341 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77342 +static SDIO_STATUS AdjustSlotPower(PSDHCD pHcd, UINT32 *pOCRvalue)
77343 +{
77344 + SDCONFIG_POWER_CTRL_DATA pwrSetting;
77345 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
77346 +
77347 + ZERO_OBJECT(pwrSetting);
77348 + DBG_PRINT(SDDBG_TRACE,
77349 + ("SDIO Bus Driver: Adjusting Slot Power, Requesting adjustment for OCR:0x%8.8X \n",
77350 + *pOCRvalue));
77351 +
77352 + do {
77353 + pwrSetting.SlotPowerEnable = TRUE;
77354 + /* get optimal power setting */
77355 + pwrSetting.SlotPowerVoltageMask = GetPowerSetting(pHcd, pOCRvalue);
77356 + if (0 == pwrSetting.SlotPowerVoltageMask) {
77357 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: No matching voltage for OCR \n"));
77358 + status = SDIO_STATUS_DEVICE_ERROR;
77359 + break;
77360 + }
77361 +
77362 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Slot Pwr Mask 0x%X for OCR:0x%8.8X \n",
77363 + pwrSetting.SlotPowerVoltageMask,*pOCRvalue));
77364 + status = _IssueConfig(pHcd,SDCONFIG_POWER_CTRL,&pwrSetting,sizeof(pwrSetting));
77365 + if (!SDIO_SUCCESS(status)) {
77366 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set power in hcd \n"));
77367 + break;
77368 + }
77369 + /* delay for power to settle */
77370 + OSSleep(pBusContext->PowerSettleDelay);
77371 + /* save off for drivers */
77372 + pHcd->CardProperties.CardVoltage = pwrSetting.SlotPowerVoltageMask;
77373 +
77374 + } while (FALSE);
77375 +
77376 + return status;
77377 +}
77378 +
77379 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77380 + ConvertEncodedTransSpeed - convert encoded TRANS_SPEED value to a clock rate
77381 + Input: TransSpeedValue - encoded transfer speed value
77382 + Output:
77383 + Return: appropriate SD clock rate
77384 + Notes: This function returns a rate of 0, if it could not be determined.
77385 + This function can check tran speed values for SD,SDIO and MMC cards
77386 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77387 +static SD_BUSCLOCK_RATE ConvertEncodedTransSpeed(UINT8 TransSpeedValue)
77388 +{
77389 + SD_BUSCLOCK_RATE transfMul = 0;
77390 + UINT8 timeVal = 0;
77391 +
77392 + switch (TransSpeedValue & TRANSFER_UNIT_MULTIPIER_MASK) {
77393 + case 0:
77394 + transfMul = 10000;
77395 + break;
77396 + case 1:
77397 + transfMul = 100000;
77398 + break;
77399 + case 2:
77400 + transfMul = 1000000;
77401 + break;
77402 + case 3:
77403 + transfMul = 10000000;
77404 + break;
77405 + default:
77406 + transfMul = 0;
77407 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: Card transfer multipler is wrong (val=0x%X)! \n",
77408 + TransSpeedValue));
77409 + break;
77410 + }
77411 +
77412 + switch ((TransSpeedValue & TIME_VALUE_MASK) >> TIME_VALUE_SHIFT) {
77413 + case 1: timeVal = 10; break;
77414 + case 2: timeVal = 12; break;
77415 + case 3: timeVal = 13; break;
77416 + case 4: timeVal = 15; break;
77417 + case 5: timeVal = 20; break;
77418 + case 6: timeVal = 25; break;
77419 + case 7: timeVal = 30; break;
77420 + case 8: timeVal = 35; break;
77421 + case 9: timeVal = 40; break;
77422 + case 10: timeVal = 45; break;
77423 + case 11: timeVal = 50; break;
77424 + case 12: timeVal = 55; break;
77425 + case 13: timeVal = 60; break;
77426 + case 14: timeVal = 70; break;
77427 + case 15: timeVal = 80; break;
77428 + default: timeVal = 0;
77429 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: Card time value is wrong (val=0x%X)! \n",
77430 + TransSpeedValue));
77431 + break;
77432 + }
77433 +
77434 + if ((transfMul != 0) && (timeVal != 0)) {
77435 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Card Reported Max: %d Hz (0x%X) \n",
77436 + (timeVal*transfMul), TransSpeedValue));
77437 + return timeVal*transfMul;
77438 + }
77439 +
77440 + return 0;
77441 +}
77442 +
77443 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77444 + SelectDeselectCard - Select or deselect a card
77445 + Input: pHcd - HCD object
77446 + Select - select the card
77447 + Output:
77448 + Return: status
77449 + Notes:
77450 +
77451 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77452 +static SDIO_STATUS SelectDeselectCard(PSDHCD pHcd, BOOL Select)
77453 +{
77454 + SDIO_STATUS status;
77455 +
77456 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
77457 + /* SPI mode cards do not support selection */
77458 + status = SDIO_STATUS_SUCCESS;
77459 + } else {
77460 + if (!Select) {
77461 + /* deselect, note that deselecting a card does not return a response */
77462 + status = _IssueSimpleBusRequest(pHcd,
77463 + CMD7,0,
77464 + SDREQ_FLAGS_NO_RESP,NULL);
77465 + } else {
77466 + /* select */
77467 + status = _IssueSimpleBusRequest(pHcd,
77468 + CMD7,(pHcd->CardProperties.RCA << 16),
77469 + SDREQ_FLAGS_RESP_R1B,NULL);
77470 + }
77471 + }
77472 +
77473 + if (!SDIO_SUCCESS(status)) {
77474 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Failed to %s card, RCA:0x%X Err:%d \n",
77475 + (Select ? "Select":"Deselect"), pHcd->CardProperties.RCA, status));
77476 + }
77477 + return status;
77478 +}
77479 +
77480 +/* reorder a buffer by swapping MSB with LSB */
77481 +static void ReorderBuffer(UINT8 *pBuffer, INT Bytes)
77482 +{
77483 + UINT8 *pEnd;
77484 + UINT8 temp;
77485 +
77486 + DBG_ASSERT(!(Bytes & 1));
77487 + /* point to the end */
77488 + pEnd = &pBuffer[Bytes - 1];
77489 + /* divide in half */
77490 + Bytes = Bytes >> 1;
77491 +
77492 + while (Bytes) {
77493 + temp = *pBuffer;
77494 + /* swap bytes */
77495 + *pBuffer = *pEnd;
77496 + *pEnd = temp;
77497 + pBuffer++;
77498 + pEnd--;
77499 + Bytes--;
77500 + }
77501 +}
77502 +
77503 +#define ADJUST_OPER_CLOCK(pBusMode,Clock) \
77504 + (pBusMode)->ClockRate = min((SD_BUSCLOCK_RATE)(Clock),(pBusMode)->ClockRate)
77505 +#define ADJUST_OPER_BLOCK_LEN(pCaps,Length) \
77506 + (pCaps)->OperBlockLenLimit = min((UINT16)(Length),(pCaps)->OperBlockLenLimit)
77507 +#define ADJUST_OPER_BLOCK_COUNT(pCaps,Count) \
77508 + (pCaps)->OperBlockCountLimit = min((UINT16)(Count),(pCaps)->OperBlockCountLimit)
77509 +
77510 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77511 + GetBusParameters - Get bus parameters for a card
77512 + Input: pHcd - HCD object
77513 + pBusMode - current bus mode on entry
77514 + Output: pBusMode - new adjusted bus mode
77515 + Return: status
77516 + Notes:
77517 +
77518 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77519 +static SDIO_STATUS GetBusParameters(PSDHCD pHcd, PSDCONFIG_BUS_MODE_DATA pBusMode)
77520 +{
77521 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
77522 + UINT8 temp;
77523 + UINT32 tplAddr;
77524 + struct SDIO_FUNC_EXT_COMMON_TPL func0ext;
77525 + UINT8 scrRegister[SD_SCR_BYTES];
77526 + SD_BUSCLOCK_RATE cardReportedRate = 0;
77527 + PSDREQUEST pReq = NULL;
77528 + BOOL spiMode = FALSE;
77529 +
77530 +
77531 + if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_SPI) {
77532 + spiMode = TRUE;
77533 + }
77534 +
77535 + if (!spiMode) {
77536 + /* set highest bus mode bus driver is allowing (non-SPI), the code below will
77537 + * adjust to lower or equal settings */
77538 + pBusMode->BusModeFlags = pBusContext->DefaultBusMode;
77539 + }
77540 + /* set operational parameters */
77541 + pBusMode->ClockRate = pBusContext->DefaultOperClock;
77542 + pHcd->CardProperties.OperBlockLenLimit = pBusContext->DefaultOperBlockLen;
77543 + pHcd->CardProperties.OperBlockCountLimit = pBusContext->DefaultOperBlockCount;
77544 +
77545 + /* adjust operational block counts and length to match HCD */
77546 + ADJUST_OPER_BLOCK_LEN(&pHcd->CardProperties,pHcd->MaxBytesPerBlock);
77547 + ADJUST_OPER_BLOCK_COUNT(&pHcd->CardProperties,pHcd->MaxBlocksPerTrans);
77548 + /* limit operational clock to the max clock rate */
77549 + ADJUST_OPER_CLOCK(pBusMode,pHcd->MaxClockRate);
77550 +
77551 + if (!spiMode) {
77552 + /* check HCD bus mode */
77553 + if (!(pHcd->Attributes & SDHCD_ATTRIB_BUS_4BIT) ||
77554 + ((pHcd->CardProperties.Flags & CARD_SDIO) &&
77555 + (pHcd->Attributes & SDHCD_ATTRIB_NO_4BIT_IRQ)) ) {
77556 +
77557 + if (pHcd->Attributes & SDHCD_ATTRIB_BUS_4BIT) {
77558 + DBG_PRINT(SDDBG_WARN,
77559 + ("SDIO Card Detected, but host does not support IRQs in 4 bit mode - dropping to 1 bit. \n"));
77560 + }
77561 + /* force to 1 bit mode */
77562 + SDCONFIG_SET_BUS_WIDTH(pBusMode->BusModeFlags, SDCONFIG_BUS_WIDTH_1_BIT);
77563 + }
77564 + }
77565 +
77566 + /* now do various card inquiries to drop the bus mode or clock
77567 + * none of these checks can raise the bus mode or clock higher that what
77568 + * was initialized above */
77569 + do {
77570 + if (pHcd->CardProperties.Flags & (CARD_SD | CARD_MMC)) {
77571 + /* allocate a request for response data we'll need */
77572 + pReq = AllocateRequest();
77573 + if (NULL == pReq) {
77574 + status = SDIO_STATUS_NO_RESOURCES;
77575 + break;
77576 + }
77577 + }
77578 +
77579 + if (!spiMode && (pHcd->CardProperties.Flags & CARD_MMC)) {
77580 + /* MMC cards all run in 1 bit mode */
77581 + SDCONFIG_SET_BUS_WIDTH(pBusMode->BusModeFlags, SDCONFIG_BUS_WIDTH_1_BIT);
77582 + }
77583 +
77584 + if (pHcd->CardProperties.Flags & CARD_SD) {
77585 + DBG_ASSERT(pReq != NULL);
77586 + DBG_PRINT(SDDBG_TRACE, ("Getting SCR from SD Card..\n"));
77587 + /* read SCR (requires data transfer) to get supported modes */
77588 + status = _IssueBusRequestBd(pHcd,ACMD51,0,
77589 + SDREQ_FLAGS_RESP_R1 | SDREQ_FLAGS_APP_CMD |
77590 + SDREQ_FLAGS_DATA_TRANS,
77591 + pReq,&scrRegister,SD_SCR_BYTES);
77592 + if (!SDIO_SUCCESS(status)) {
77593 + DBG_PRINT(SDDBG_WARN, ("SD card does not have SCR. \n"));
77594 + if (!spiMode) {
77595 + /* switch it to 1 bit mode */
77596 + SDCONFIG_SET_BUS_WIDTH(pBusMode->BusModeFlags, SDCONFIG_BUS_WIDTH_1_BIT);
77597 + }
77598 + status = SDIO_STATUS_SUCCESS;
77599 + } else {
77600 + /* we have to reorder this buffer since the SCR is sent MSB first on the data
77601 + * data bus */
77602 + ReorderBuffer(scrRegister,SD_SCR_BYTES);
77603 + /* got the SCR */
77604 + DBG_PRINT(SDDBG_TRACE, ("SD SCR StructRev:0x%X, Flags:0x%X \n",
77605 + GET_SD_SCR_STRUCT_VER(scrRegister),
77606 + GET_SD_SCR_BUSWIDTHS_FLAGS(scrRegister)));
77607 + /* set the revision */
77608 + switch (GET_SD_SCR_SDSPEC_VER(scrRegister)) {
77609 + case SCR_SD_SPEC_1_00:
77610 + DBG_PRINT(SDDBG_TRACE, ("SD Spec Revision 1.01 \n"));
77611 + pHcd->CardProperties.SD_MMC_Revision = SD_REVISION_1_01;
77612 + break;
77613 + case SCR_SD_SPEC_1_10:
77614 + DBG_PRINT(SDDBG_TRACE, ("SD Spec Revision 1.10 \n"));
77615 + pHcd->CardProperties.SD_MMC_Revision = SD_REVISION_1_10;
77616 + break;
77617 + default:
77618 + DBG_PRINT(SDDBG_WARN, ("SD Spec Revision is greater than 1.10 \n"));
77619 + pHcd->CardProperties.SD_MMC_Revision = SD_REVISION_1_10;
77620 + break;
77621 + }
77622 +
77623 + if (!(GET_SD_SCR_BUSWIDTHS(scrRegister) & SCR_BUS_SUPPORTS_4_BIT)) {
77624 + if (!spiMode) {
77625 + DBG_PRINT(SDDBG_WARN, ("SD SCR reports 1bit only Mode \n"));
77626 + /* switch it to 1 bit mode */
77627 + SDCONFIG_SET_BUS_WIDTH(pBusMode->BusModeFlags, SDCONFIG_BUS_WIDTH_1_BIT);
77628 + }
77629 + }
77630 + }
77631 + }
77632 +
77633 + if (pHcd->CardProperties.Flags & (CARD_SD | CARD_MMC)) {
77634 + DBG_ASSERT(pReq != NULL);
77635 + /* de-select the card in order to get the CSD */
77636 + status = SelectDeselectCard(pHcd,FALSE);
77637 + if (!SDIO_SUCCESS(status)) {
77638 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to deselect card before getting CSD \n"));
77639 + break;
77640 + }
77641 + /* Get CSD for SD or MMC cards */
77642 + if (spiMode) {
77643 + /* in SPI mode, getting the CSD requires a read data transfer */
77644 + status = _IssueBusRequestBd(pHcd,CMD9,0,
77645 + SDREQ_FLAGS_RESP_R1 | SDREQ_FLAGS_DATA_TRANS,
77646 + pReq,
77647 + pHcd->CardProperties.CardCSD,
77648 + MAX_CSD_CID_BYTES);
77649 + if (SDIO_SUCCESS(status)) {
77650 + /* when the CSD is sent over in SPI data mode, it comes to us in MSB first
77651 + * and thus is not ordered correctly as defined in the SD spec */
77652 + ReorderBuffer(pHcd->CardProperties.CardCSD,MAX_CSD_CID_BYTES);
77653 + }
77654 + } else {
77655 + status = _IssueSimpleBusRequest(pHcd,
77656 + CMD9,
77657 + (pHcd->CardProperties.RCA << 16),
77658 + SDREQ_FLAGS_RESP_R2,
77659 + pReq);
77660 + if (SDIO_SUCCESS(status)) {
77661 + /* save the CSD */
77662 + memcpy(pHcd->CardProperties.CardCSD,pReq->Response,MAX_CARD_RESPONSE_BYTES);
77663 + }
77664 + }
77665 +
77666 + if (!SDIO_SUCCESS(status)) {
77667 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get CSD, Err:%d \n",
77668 + status));
77669 + break;
77670 + }
77671 + /* for MMC cards, the spec version is in the CSD */
77672 + if (pHcd->CardProperties.Flags & CARD_MMC) {
77673 + DBG_PRINT(SDDBG_TRACE, ("MMC Spec version : (0x%2.2X) \n",
77674 + GET_MMC_SPEC_VERSION(pHcd->CardProperties.CardCSD)));
77675 + switch (GET_MMC_SPEC_VERSION(pHcd->CardProperties.CardCSD)) {
77676 + case MMC_SPEC_1_0_TO_1_2:
77677 + case MMC_SPEC_1_4:
77678 + case MMC_SPEC_2_0_TO_2_2:
77679 + DBG_PRINT(SDDBG_WARN, ("MMC Spec version less than 3.1 \n"));
77680 + pHcd->CardProperties.SD_MMC_Revision = MMC_REVISION_1_0_2_2;
77681 + break;
77682 + case MMC_SPEC_3_1:
77683 + DBG_PRINT(SDDBG_TRACE, ("MMC Spec version 3.1 \n"));
77684 + pHcd->CardProperties.SD_MMC_Revision = MMC_REVISION_3_1;
77685 + break;
77686 + case MMC_SPEC_4_0_TO_4_1:
77687 + DBG_PRINT(SDDBG_TRACE, ("MMC Spec version 4.0-4.1 \n"));
77688 + pHcd->CardProperties.SD_MMC_Revision = MMC_REVISION_4_0;
77689 + break;
77690 + default:
77691 + pHcd->CardProperties.SD_MMC_Revision = MMC_REVISION_3_1;
77692 + DBG_PRINT(SDDBG_WARN, ("MMC Spec version greater than 4.1\n"));
77693 + break;
77694 + }
77695 + }
77696 + /* re-select the card */
77697 + status = SelectDeselectCard(pHcd,TRUE);
77698 + if (!SDIO_SUCCESS(status)) {
77699 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to re-select card after getting CSD \n"));
77700 + break;
77701 + }
77702 + }
77703 +
77704 + if ((pHcd->CardProperties.Flags & CARD_SD) &&
77705 + !(pHcd->CardProperties.Flags & CARD_SDIO) &&
77706 + SDDEVICE_IS_SD_REV_GTEQ_1_10(pHcd->pPseudoDev) &&
77707 + (pHcd->Attributes & SDHCD_ATTRIB_SD_HIGH_SPEED) &&
77708 + !spiMode) {
77709 + UINT32 arg;
77710 + PUINT8 pSwitchStatusBlock = KernelAlloc(SD_SWITCH_FUNC_STATUS_BLOCK_BYTES);
77711 +
77712 + if (NULL == pSwitchStatusBlock) {
77713 + status = SDIO_STATUS_NO_RESOURCES;
77714 + break;
77715 + }
77716 +
77717 + arg = SD_SWITCH_FUNC_ARG_GROUP_CHECK(SD_SWITCH_HIGH_SPEED_GROUP,
77718 + SD_SWITCH_HIGH_SPEED_FUNC_NO);
77719 +
77720 + /* for 1.10 SD cards, check if high speed mode is supported */
77721 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Checking SD Card for switchable functions (CMD6 arg:0x%X)\n",arg));
77722 +
77723 + /* issue simple data transfer request to read the switch status */
77724 + status = _IssueBusRequestBd(pHcd,
77725 + CMD6,
77726 + arg,
77727 + SDREQ_FLAGS_RESP_R1 | SDREQ_FLAGS_DATA_TRANS,
77728 + pReq,
77729 + pSwitchStatusBlock,
77730 + SD_SWITCH_FUNC_STATUS_BLOCK_BYTES);
77731 +
77732 + if (SDIO_SUCCESS(status)) {
77733 + UINT16 switchGroupMask;
77734 + /* need to reorder this since cards send this MSB first */
77735 + ReorderBuffer(pSwitchStatusBlock,SD_SWITCH_FUNC_STATUS_BLOCK_BYTES);
77736 + switchGroupMask = SD_SWITCH_FUNC_STATUS_GET_GRP_BIT_MASK(pSwitchStatusBlock,SD_SWITCH_HIGH_SPEED_GROUP);
77737 + DBG_PRINT(SDDBG_TRACE, ("SD Card Switch Status Group1 Mask:0x%X Max Current:%d\n",
77738 + switchGroupMask, SD_SWITCH_FUNC_STATUS_GET_MAX_CURRENT(pSwitchStatusBlock) ));
77739 + if (SD_SWITCH_FUNC_STATUS_GET_MAX_CURRENT(pSwitchStatusBlock) == 0) {
77740 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: SD Switch Status block has zero max current \n"));
77741 + SDLIB_PrintBuffer(pSwitchStatusBlock,
77742 + SD_SWITCH_FUNC_STATUS_BLOCK_BYTES,
77743 + "SDIO Bus Driver: SD Switch Status Block Error");
77744 + } else {
77745 + /* check HS support */
77746 + if (switchGroupMask & (1 << SD_SWITCH_HIGH_SPEED_FUNC_NO)) {
77747 + DBG_PRINT(SDDBG_TRACE, ("SD Card Supports High Speed Mode\n"));
77748 + /* set the rate, this will override the CSD value */
77749 + cardReportedRate = SD_HS_MAX_BUS_CLOCK;
77750 + pBusMode->BusModeFlags |= SDCONFIG_BUS_MODE_SD_HS;
77751 + }
77752 + }
77753 + } else {
77754 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get SD Switch Status block (%d)\n", status));
77755 + /* just fall through, we'll handle this like a normal SD card */
77756 + status = SDIO_STATUS_SUCCESS;
77757 + }
77758 +
77759 + KernelFree(pSwitchStatusBlock);
77760 + }
77761 +
77762 + if ((pHcd->CardProperties.Flags & CARD_MMC) &&
77763 + SDDEVICE_IS_MMC_REV_GTEQ_4_0(pHcd->pPseudoDev) &&
77764 + (pHcd->Attributes & SDHCD_ATTRIB_MMC_HIGH_SPEED) &&
77765 + !spiMode) {
77766 + /* for MMC cards, get the Extended CSD to get the High speed and
77767 + * wide bus paramaters */
77768 +
77769 + PUINT8 pExtData = KernelAlloc(MMC_EXT_CSD_SIZE);
77770 +
77771 + if (NULL == pExtData) {
77772 + status = SDIO_STATUS_NO_RESOURCES;
77773 + break;
77774 + }
77775 + /* issue simple data transfer request to read the extended CSD */
77776 + status = _IssueBusRequestBd(pHcd,MMC_CMD8,0,
77777 + SDREQ_FLAGS_RESP_R1 | SDREQ_FLAGS_DATA_TRANS,
77778 + pReq,
77779 + pExtData,
77780 + MMC_EXT_CSD_SIZE);
77781 + if (SDIO_SUCCESS(status)) {
77782 + DBG_PRINT(SDDBG_TRACE, ("MMC Ext CSD Version: 0x%X Card Type: 0x%X\n",
77783 + pExtData[MMC_EXT_VER_OFFSET],pExtData[MMC_EXT_CARD_TYPE_OFFSET]));
77784 + /* check HS support */
77785 + if (pExtData[MMC_EXT_CARD_TYPE_OFFSET] & MMC_EXT_CARD_TYPE_HS_52) {
77786 + /* try 52 Mhz */
77787 + cardReportedRate = 52000000;
77788 + pBusMode->BusModeFlags |= SDCONFIG_BUS_MODE_MMC_HS;
77789 + } else if (pExtData[MMC_EXT_CARD_TYPE_OFFSET] & MMC_EXT_CARD_TYPE_HS_26) {
77790 + /* try 26MHZ */
77791 + cardReportedRate = 26000000;
77792 + pBusMode->BusModeFlags |= SDCONFIG_BUS_MODE_MMC_HS;
77793 + } else {
77794 + /* doesn't report high speed capable */
77795 + cardReportedRate = 0;
77796 + }
77797 +
77798 + if (cardReportedRate && !spiMode) {
77799 + /* figure out the bus mode */
77800 + if (pHcd->Attributes & SDHCD_ATTRIB_BUS_MMC8BIT) {
77801 + SDCONFIG_SET_BUS_WIDTH(pBusMode->BusModeFlags, SDCONFIG_BUS_WIDTH_MMC8_BIT);
77802 + } else if (pHcd->Attributes & SDHCD_ATTRIB_BUS_4BIT) {
77803 + SDCONFIG_SET_BUS_WIDTH(pBusMode->BusModeFlags, SDCONFIG_BUS_WIDTH_4_BIT);
77804 + } else {
77805 + /* we leave it to default to 1 bit mode */
77806 + }
77807 + }
77808 + } else {
77809 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get MMC Extended CSD \n"));
77810 + /* just fall through, we'll do without the extended information
77811 + * and run it like a legacy MMC card */
77812 + status = SDIO_STATUS_SUCCESS;
77813 + }
77814 +
77815 + KernelFree(pExtData);
77816 + }
77817 +
77818 + if (pHcd->CardProperties.Flags & (CARD_SD | CARD_MMC)) {
77819 +
77820 + if (0 == cardReportedRate) {
77821 + /* extract rate from CSD only if it was not set by earlier tests */
77822 + cardReportedRate = ConvertEncodedTransSpeed(
77823 + GET_SD_CSD_TRANS_SPEED(pHcd->CardProperties.CardCSD));
77824 + /* fall through and test for zero again */
77825 + }
77826 +
77827 + if (cardReportedRate != 0) {
77828 + /* adjust clock based on what the card can handle */
77829 + ADJUST_OPER_CLOCK(pBusMode,cardReportedRate);
77830 + } else {
77831 + /* something is wrong with the CSD */
77832 + if (DBG_GET_DEBUG_LEVEL() >= SDDBG_TRACE) {
77833 + SDLIB_PrintBuffer(pHcd->CardProperties.CardCSD,
77834 + MAX_CARD_RESPONSE_BYTES,
77835 + "SDIO Bus Driver: CSD Dump");
77836 + }
77837 + /* can't figure out the card rate, so set reasonable defaults */
77838 + if (pHcd->CardProperties.Flags & CARD_SD) {
77839 + ADJUST_OPER_CLOCK(pBusMode,SD_MAX_BUS_CLOCK);
77840 + } else {
77841 + ADJUST_OPER_CLOCK(pBusMode,MMC_MAX_BUS_CLOCK);
77842 + }
77843 + }
77844 + }
77845 +
77846 + /* note, we do SDIO card "after" SD in case this is a combo card */
77847 + if (pHcd->CardProperties.Flags & CARD_SDIO) {
77848 + /* read card capabilities */
77849 + status = Cmd52ReadByteCommon(pHcd->pPseudoDev,
77850 + SDIO_CARD_CAPS_REG,
77851 + &pHcd->CardProperties.SDIOCaps);
77852 + if (!SDIO_SUCCESS(status)) {
77853 + break;
77854 + }
77855 + DBG_PRINT(SDDBG_TRACE, ("SDIO Card Caps: 0x%X \n",pHcd->CardProperties.SDIOCaps));
77856 + if (pHcd->CardProperties.SDIOCaps & SDIO_CAPS_LOW_SPEED) {
77857 + /* adjust max clock for LS device */
77858 + ADJUST_OPER_CLOCK(pBusMode,SDIO_LOW_SPEED_MAX_BUS_CLOCK);
77859 + /* adjust bus if LS device does not support 4 bit mode */
77860 + if (!(pHcd->CardProperties.SDIOCaps & SDIO_CAPS_4BIT_LS)) {
77861 + if (!spiMode) {
77862 + /* low speed device does not support 4 bit mode, force us to 1 bit */
77863 + SDCONFIG_SET_BUS_WIDTH(pBusMode->BusModeFlags,
77864 + SDCONFIG_BUS_WIDTH_1_BIT);
77865 + }
77866 + }
77867 + }
77868 +
77869 + /* check if 1.2 card supports high speed mode, checking HCD as well*/
77870 + if (SDDEVICE_IS_SDIO_REV_GTEQ_1_20(pHcd->pPseudoDev) &&
77871 + (pHcd->Attributes & SDHCD_ATTRIB_SD_HIGH_SPEED) &&
77872 + !spiMode) {
77873 + UCHAR hsControl = 0;
77874 +
77875 + status = Cmd52ReadByteCommon(pHcd->pPseudoDev,
77876 + SDIO_HS_CONTROL_REG,
77877 + &hsControl);
77878 +
77879 + if (!SDIO_SUCCESS(status)) {
77880 + DBG_PRINT(SDDBG_TRACE,
77881 + ("SDIO Failed to read high speed control (%d) \n",status));
77882 + /* reset status and continue */
77883 + status = SDIO_STATUS_SUCCESS;
77884 + } else {
77885 + if (hsControl & SDIO_HS_CONTROL_SHS) {
77886 + DBG_PRINT(SDDBG_TRACE, ("SDIO Card Supports High Speed Mode\n"));
77887 + pBusMode->BusModeFlags |= SDCONFIG_BUS_MODE_SD_HS;
77888 + }
77889 + }
77890 +
77891 + }
77892 +
77893 + cardReportedRate = 0;
77894 + temp = sizeof(func0ext);
77895 + tplAddr = pHcd->CardProperties.CommonCISPtr;
77896 + /* get the FUNCE tuple */
77897 + status = SDLIB_FindTuple(pHcd->pPseudoDev,
77898 + CISTPL_FUNCE,
77899 + &tplAddr,
77900 + (PUINT8)&func0ext,
77901 + &temp);
77902 + if (!SDIO_SUCCESS(status) || (temp < sizeof(func0ext))) {
77903 + DBG_PRINT(SDDBG_WARN, ("SDIO Function 0 Ext. Tuple Missing (Got size:%d) \n", temp));
77904 + /* reset status */
77905 + status = SDIO_STATUS_SUCCESS;
77906 + } else {
77907 + /* convert encoded value to rate */
77908 + cardReportedRate = ConvertEncodedTransSpeed(func0ext.MaxTransSpeed);
77909 + }
77910 +
77911 + if (cardReportedRate != 0) {
77912 + if (pBusMode->BusModeFlags & SDCONFIG_BUS_MODE_SD_HS) {
77913 + if (cardReportedRate <= SD_MAX_BUS_CLOCK) {
77914 + DBG_PRINT(SDDBG_WARN,
77915 + ("SDIO Function tuple reports clock:%d Hz, with advertised High Speed support \n", cardReportedRate));
77916 + /* back off high speed support */
77917 + pBusMode->BusModeFlags &= ~SDCONFIG_BUS_MODE_SD_HS;
77918 + }
77919 + } else {
77920 + if (cardReportedRate > SD_MAX_BUS_CLOCK) {
77921 + DBG_PRINT(SDDBG_WARN,
77922 + ("SDIO Function tuple reports clock:%d Hz, without advertising High Speed support..using 25Mhz \n", cardReportedRate));
77923 + cardReportedRate = SD_MAX_BUS_CLOCK;
77924 + }
77925 + }
77926 + /* adjust clock based on what the card can handle */
77927 + ADJUST_OPER_CLOCK(pBusMode,cardReportedRate);
77928 +
77929 + } else {
77930 + /* set a reasonable default */
77931 + ADJUST_OPER_CLOCK(pBusMode,SD_MAX_BUS_CLOCK);
77932 + }
77933 + }
77934 + } while (FALSE);
77935 +
77936 + if (pReq != NULL) {
77937 + FreeRequest(pReq);
77938 + }
77939 + return status;
77940 +}
77941 +
77942 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
77943 + SetOperationalBusMode - set operational bus mode
77944 + Input: pDevice - pDevice that is requesting the change
77945 + pBusMode - operational bus mode
77946 + Output: pBusMode - on return will have the actual clock rate set
77947 + Return: status
77948 + Notes:
77949 +
77950 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
77951 +SDIO_STATUS SetOperationalBusMode(PSDDEVICE pDevice,
77952 + PSDCONFIG_BUS_MODE_DATA pBusMode)
77953 +{
77954 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
77955 + UCHAR regData;
77956 + UINT32 arg;
77957 + UINT32 switcharg;
77958 + PSDHCD pHcd = pDevice->pHcd;
77959 +
77960 + /* synchronize access for updating bus mode settings */
77961 + status = SemaphorePendInterruptable(&pDevice->pHcd->ConfigureOpsSem);
77962 + if (!SDIO_SUCCESS(status)) {
77963 + return status;
77964 + }
77965 +
77966 + do {
77967 +
77968 + if (!IS_CARD_PRESENT(pHcd)) {
77969 + /* for an empty slot (a Pseudo dev was passed in) we still allow the
77970 + * bus mode to be set for the card detect
77971 + * polling */
77972 + status = _IssueConfig(pHcd,SDCONFIG_BUS_MODE_CTRL,pBusMode,sizeof(SDCONFIG_BUS_MODE_DATA));
77973 + if (!SDIO_SUCCESS(status)) {
77974 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set bus mode in hcd : Err:%d \n",
77975 + status));
77976 + }
77977 + /* nothing more to do */
77978 + break;
77979 + }
77980 +
77981 +
77982 + if ((pBusMode->BusModeFlags == SDDEVICE_GET_BUSMODE_FLAGS(pDevice)) &&
77983 + (pBusMode->ClockRate == SDDEVICE_GET_OPER_CLOCK(pDevice))) {
77984 + DBG_PRINT(SDDBG_TRACE,
77985 + ("SDIO Bus Driver: Bus mode already set, nothing to do\n"));
77986 + pBusMode->ActualClockRate = SDDEVICE_GET_OPER_CLOCK(pDevice);
77987 + break;
77988 + }
77989 +
77990 + if (pBusMode->BusModeFlags & SDCONFIG_BUS_MODE_MMC_HS) {
77991 + if (!(pHcd->Attributes & SDHCD_ATTRIB_MMC_HIGH_SPEED)) {
77992 + status = SDIO_STATUS_INVALID_PARAMETER;
77993 + DBG_PRINT(SDDBG_ERROR,
77994 + ("SDIO Bus Driver: HCD does not support MMC High Speed\n"));
77995 + break;
77996 + }
77997 + }
77998 +
77999 + if (pBusMode->BusModeFlags & SDCONFIG_BUS_MODE_SD_HS) {
78000 + if (!(pHcd->Attributes & SDHCD_ATTRIB_SD_HIGH_SPEED)) {
78001 + status = SDIO_STATUS_INVALID_PARAMETER;
78002 + DBG_PRINT(SDDBG_ERROR,
78003 + ("SDIO Bus Driver: HCD does not support SD High Speed\n"));
78004 + break;
78005 + }
78006 + }
78007 +
78008 + /* before we set the operational clock and mode, configure the clock for high
78009 + * speed mode on the card , if necessary */
78010 + if ((pHcd->CardProperties.Flags & CARD_MMC) &&
78011 + (pBusMode->BusModeFlags & SDCONFIG_BUS_MODE_MMC_HS) &&
78012 + !(SDDEVICE_GET_BUSMODE_FLAGS(pDevice) & SDCONFIG_BUS_MODE_MMC_HS)) {
78013 +
78014 + switcharg = MMC_SWITCH_BUILD_ARG(MMC_SWITCH_CMD_SET0,
78015 + MMC_SWITCH_WRITE_BYTE,
78016 + MMC_EXT_HS_TIMING_OFFSET,
78017 + MMC_EXT_HS_TIMING_ENABLE);
78018 + status = _IssueSimpleBusRequest(pHcd,
78019 + MMC_CMD_SWITCH,
78020 + switcharg,
78021 + SDREQ_FLAGS_RESP_R1B,
78022 + NULL);
78023 + if (!SDIO_SUCCESS(status)) {
78024 + DBG_PRINT(SDDBG_ERROR,
78025 + ("SDIO Bus Driver: Failed to switch MMC High Speed Mode (arg:0x%X): %d \n",
78026 + switcharg, status));
78027 + break;
78028 + }
78029 +
78030 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: High Speed MMC enabled (arg:0x%X)\n",
78031 + switcharg));
78032 + }
78033 +
78034 + /* before setting bus mode and clock in the HCD, switch card to high speed mode
78035 + * if necessary */
78036 + if ((pHcd->CardProperties.Flags & CARD_SD) &&
78037 + (pBusMode->BusModeFlags & SDCONFIG_BUS_MODE_SD_HS) &&
78038 + !(SDDEVICE_GET_BUSMODE_FLAGS(pDevice) & SDCONFIG_BUS_MODE_SD_HS)) {
78039 + UINT32 arg;
78040 + PUINT8 pSwitchStatusBlock;
78041 +
78042 + pSwitchStatusBlock = KernelAlloc(SD_SWITCH_FUNC_STATUS_BLOCK_BYTES);
78043 +
78044 + if (NULL == pSwitchStatusBlock) {
78045 + status = SDIO_STATUS_NO_RESOURCES;
78046 + break;
78047 + }
78048 +
78049 + /* set high speed group */
78050 + arg = SD_SWITCH_FUNC_ARG_GROUP_SET(SD_SWITCH_HIGH_SPEED_GROUP,
78051 + SD_SWITCH_HIGH_SPEED_FUNC_NO);
78052 +
78053 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Setting SD Card for High Speed mode (CMD6 arg:0x%X)\n",arg));
78054 +
78055 + /* issue simple data transfer request to switch modes */
78056 + status = _IssueBusRequestBd(pHcd,
78057 + CMD6,
78058 + arg,
78059 + SDREQ_FLAGS_RESP_R1 | SDREQ_FLAGS_DATA_TRANS,
78060 + NULL,
78061 + pSwitchStatusBlock,
78062 + SD_SWITCH_FUNC_STATUS_BLOCK_BYTES);
78063 +
78064 + if (SDIO_SUCCESS(status)) {
78065 + ReorderBuffer(pSwitchStatusBlock,SD_SWITCH_FUNC_STATUS_BLOCK_BYTES);
78066 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SD High Speed Result, Got Max Current:%d mA, SwitchResult:0x%X \n",
78067 + SD_SWITCH_FUNC_STATUS_GET_MAX_CURRENT(pSwitchStatusBlock),
78068 + SDSwitchGetSwitchResult(pSwitchStatusBlock, SD_SWITCH_HIGH_SPEED_GROUP)));
78069 + if (SD_SWITCH_FUNC_STATUS_GET_MAX_CURRENT(pSwitchStatusBlock) == 0) {
78070 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Error in Status Block after High Speed Switch (current==0) \n"));
78071 + status = SDIO_STATUS_DEVICE_ERROR;
78072 + }
78073 + if (SDSwitchGetSwitchResult(pSwitchStatusBlock, SD_SWITCH_HIGH_SPEED_GROUP) !=
78074 + SD_SWITCH_HIGH_SPEED_FUNC_NO) {
78075 + DBG_PRINT(SDDBG_ERROR,
78076 + ("SDIO Bus Driver: Error in Status Block after High Speed Switch (Group1 did not switch) \n"));
78077 + status = SDIO_STATUS_DEVICE_ERROR;
78078 + }
78079 + if (SDIO_SUCCESS(status)) {
78080 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SD High Speed Mode Enabled \n"));
78081 + } else {
78082 + SDLIB_PrintBuffer(pSwitchStatusBlock,
78083 + SD_SWITCH_FUNC_STATUS_BLOCK_BYTES,
78084 + "SDIO Bus Driver: SD Switch Status Block Error");
78085 + }
78086 + } else {
78087 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to Set SD High Speed Mode (%d) \n",status));
78088 + }
78089 + KernelFree(pSwitchStatusBlock);
78090 +
78091 + if (!SDIO_SUCCESS(status)) {
78092 + break;
78093 + }
78094 + }
78095 +
78096 + /* enable/disable high speed mode for SDIO card */
78097 + if (pHcd->CardProperties.Flags & CARD_SDIO) {
78098 + BOOL doSet = TRUE;
78099 +
78100 + if ((pBusMode->BusModeFlags & SDCONFIG_BUS_MODE_SD_HS) &&
78101 + !(SDDEVICE_GET_BUSMODE_FLAGS(pDevice) & SDCONFIG_BUS_MODE_SD_HS)) {
78102 + /* enable */
78103 + regData = SDIO_HS_CONTROL_EHS;
78104 + } else if (!(pBusMode->BusModeFlags & SDCONFIG_BUS_MODE_SD_HS) &&
78105 + (SDDEVICE_GET_BUSMODE_FLAGS(pDevice) & SDCONFIG_BUS_MODE_SD_HS)) {
78106 + /* disable */
78107 + regData = 0;
78108 + } else {
78109 + /* do nothing */
78110 + doSet = FALSE;
78111 + }
78112 +
78113 + if (doSet) {
78114 + status = Cmd52WriteByteCommon(pDevice,
78115 + SDIO_HS_CONTROL_REG,
78116 + &regData);
78117 +
78118 + if (!SDIO_SUCCESS(status)) {
78119 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to %s HS mode in SDIO card : Err:%d\n",
78120 + (SDIO_HS_CONTROL_EHS == regData) ? "enable":"disable" , status));
78121 + break;
78122 + } else {
78123 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver:SDIO Card %s for High Speed mode \n",
78124 + (SDIO_HS_CONTROL_EHS == regData) ? "enabled":"disabled" ));
78125 + }
78126 + }
78127 + }
78128 +
78129 + /* use synchronize-with-bus request version, this may have been requested by a
78130 + * function driver */
78131 + status = SDLIB_IssueConfig(pDevice,
78132 + SDCONFIG_BUS_MODE_CTRL,
78133 + pBusMode,
78134 + sizeof(SDCONFIG_BUS_MODE_DATA));
78135 +
78136 + if (!SDIO_SUCCESS(status)) {
78137 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set bus mode in hcd : Err:%d \n",
78138 + status));
78139 + break;
78140 + }
78141 +
78142 + /* check requested bus width against the current mode */
78143 + if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) ==
78144 + SDCONFIG_GET_BUSWIDTH(pHcd->CardProperties.BusMode)) {
78145 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Bus mode set, no width change\n"));
78146 + break;
78147 + }
78148 +
78149 + if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_SPI) {
78150 + /* nothing more to do for SPI */
78151 + break;
78152 + }
78153 +
78154 + /* set the bus width for SD and combo cards */
78155 + if (pHcd->CardProperties.Flags & CARD_SD) {
78156 + if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_4_BIT) {
78157 + /* turn off card detect resistor */
78158 + status = _IssueSimpleBusRequest(pHcd,
78159 + ACMD42,
78160 + 0, /* disable CD */
78161 + SDREQ_FLAGS_APP_CMD | SDREQ_FLAGS_RESP_R1,
78162 + NULL);
78163 + if (!SDIO_SUCCESS(status)) {
78164 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: Failed to disable CD Res: %d \n",
78165 + status)); /* this should be okay */
78166 + }
78167 + arg = SD_ACMD6_BUS_WIDTH_4_BIT;
78168 + } else {
78169 + /* don't need to turn off CD in 1 bit mode, just set mode */
78170 + arg = SD_ACMD6_BUS_WIDTH_1_BIT;
78171 +
78172 + }
78173 + /* set the bus width */
78174 + status = _IssueSimpleBusRequest(pHcd,
78175 + ACMD6,
78176 + arg, /* set bus mode */
78177 + SDREQ_FLAGS_APP_CMD | SDREQ_FLAGS_RESP_R1,
78178 + NULL);
78179 + if (!SDIO_SUCCESS(status)) {
78180 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set bus width: %d \n",
78181 + status));
78182 + break;
78183 + }
78184 + }
78185 + /* set bus width for SDIO cards */
78186 + if (pHcd->CardProperties.Flags & CARD_SDIO) {
78187 + /* default */
78188 + regData = CARD_DETECT_DISABLE | SDIO_BUS_WIDTH_1_BIT;
78189 +
78190 + if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_4_BIT) {
78191 + /* turn off card detect resistor and set buswidth */
78192 + regData = CARD_DETECT_DISABLE | SDIO_BUS_WIDTH_4_BIT;
78193 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Enabling 4 bit mode on card \n"));
78194 + } else {
78195 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Enabling 1 bit mode on card \n"));
78196 + }
78197 + status = Cmd52WriteByteCommon(pDevice,
78198 + SDIO_BUS_IF_REG,
78199 + &regData);
78200 + if (!SDIO_SUCCESS(status)) {
78201 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set bus mode in Card : Err:%d\n",
78202 + status));
78203 + break;
78204 + }
78205 +
78206 + /* check for 4-bit interrupt detect mode */
78207 + if ((SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_4_BIT) &&
78208 + (pHcd->CardProperties.SDIOCaps & SDIO_CAPS_INT_MULTI_BLK) &&
78209 + (pHcd->Attributes & SDHCD_ATTRIB_MULTI_BLK_IRQ)) {
78210 + /* enable interrupts between blocks, this doesn't actually turn on interrupts
78211 + * it merely allows interrupts to be asserted in the inter-block gap */
78212 + pHcd->CardProperties.SDIOCaps |= SDIO_CAPS_ENB_INT_MULTI_BLK;
78213 +
78214 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: 4-Bit Multi-blk Interrupt support enabled\n"));
78215 + } else {
78216 + /* make sure this is disabled */
78217 + pHcd->CardProperties.SDIOCaps &= ~SDIO_CAPS_ENB_INT_MULTI_BLK;
78218 + }
78219 +
78220 + status = Cmd52WriteByteCommon(pDevice,
78221 + SDIO_CARD_CAPS_REG,
78222 + &pHcd->CardProperties.SDIOCaps);
78223 + if (!SDIO_SUCCESS(status)) {
78224 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to update Card Caps register Err:%d\n",
78225 + status));
78226 + break;
78227 + }
78228 + }
78229 +
78230 + /* set data bus width for MMC */
78231 + if (pHcd->CardProperties.Flags & CARD_MMC) {
78232 + UINT8 buswidth = 0;
78233 +
78234 + if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_4_BIT) {
78235 + buswidth = MMC_EXT_BUS_WIDTH_4_BIT;
78236 + } else if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_MMC8_BIT) {
78237 + buswidth = MMC_EXT_BUS_WIDTH_8_BIT;
78238 + } else {
78239 + /* normal 1 bit mode .. nothing to do */
78240 + break;
78241 + }
78242 + /* now set the bus mode on the card */
78243 + switcharg = MMC_SWITCH_BUILD_ARG(MMC_SWITCH_CMD_SET0,
78244 + MMC_SWITCH_WRITE_BYTE,
78245 + MMC_EXT_BUS_WIDTH_OFFSET,
78246 + buswidth);
78247 +
78248 + status = _IssueSimpleBusRequest(pHcd,
78249 + MMC_CMD_SWITCH,
78250 + switcharg,
78251 + SDREQ_FLAGS_RESP_R1B,
78252 + NULL);
78253 + if (!SDIO_SUCCESS(status)) {
78254 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set MMC bus width (arg:0x%X): %d \n",
78255 + switcharg, status));
78256 + break;
78257 + }
78258 +
78259 + if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_4_BIT) {
78260 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: 4 bit MMC mode enabled (arg:0x%X) \n",
78261 + switcharg));
78262 + } else if (SDCONFIG_GET_BUSWIDTH(pBusMode->BusModeFlags) == SDCONFIG_BUS_WIDTH_MMC8_BIT) {
78263 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: 8-Bit MMC mode enabled (arg:0x%X) \n",
78264 + switcharg));
78265 + }
78266 + }
78267 +
78268 + } while (FALSE);
78269 +
78270 + if (SDIO_SUCCESS(status)) {
78271 + /* set the operating mode */
78272 + pHcd->CardProperties.BusMode = pBusMode->BusModeFlags;
78273 + /* set the actual clock rate */
78274 + pHcd->CardProperties.OperBusClock = pBusMode->ActualClockRate;
78275 + }
78276 +
78277 + SemaphorePost(&pDevice->pHcd->ConfigureOpsSem);
78278 +
78279 + return status;
78280 +}
78281 +
78282 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
78283 + CardInitSetup - setup host for card initialization
78284 + Input: pHcd - HCD object
78285 + Output:
78286 + Return:
78287 + Notes:
78288 +
78289 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
78290 +SDIO_STATUS CardInitSetup(PSDHCD pHcd)
78291 +{
78292 + SDCONFIG_INIT_CLOCKS_DATA initClocks;
78293 + SDCONFIG_BUS_MODE_DATA busMode;
78294 + UINT32 OCRvalue;
78295 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
78296 +
78297 + ZERO_OBJECT(initClocks);
78298 + ZERO_OBJECT(busMode);
78299 + /* setup defaults */
78300 + initClocks.NumberOfClocks = SDMMC_MIN_INIT_CLOCKS;
78301 + busMode.ClockRate = SD_INIT_BUS_CLOCK;
78302 +
78303 + /* check for SPI only */
78304 + if (pHcd->Attributes & SDHCD_ATTRIB_BUS_SPI) {
78305 + /* SPI cards startup in non-CRC mode with the exception of CMD0, the
78306 + * HCDs must issue CMD0 with the correct CRC , the spec shows that a
78307 + * CMD 0 sequence is 0x40,0x00,0x00,0x00,0x00,0x95 */
78308 + busMode.BusModeFlags = SDCONFIG_BUS_WIDTH_SPI | SDCONFIG_BUS_MODE_SPI_NO_CRC;
78309 + }
78310 + /* check if host supports 1 bit mode */
78311 + /* TODO : if host supports power switching, we can
78312 + * could initialize cards in SPI mode first */
78313 + if (pHcd->Attributes & SDHCD_ATTRIB_BUS_1BIT) {
78314 + busMode.BusModeFlags = SDCONFIG_BUS_WIDTH_1_BIT;
78315 + }
78316 +
78317 + /* set initial VDD, starting at the highest allowable voltage and working
78318 + * our way down */
78319 + if (pHcd->SlotVoltageCaps & SLOT_POWER_3_3V) {
78320 + OCRvalue = SD_OCR_3_2_TO_3_3_VDD;
78321 + } else if (pHcd->SlotVoltageCaps & SLOT_POWER_3_0V) {
78322 + OCRvalue = SD_OCR_2_9_TO_3_0_VDD;
78323 + } else if (pHcd->SlotVoltageCaps & SLOT_POWER_2_8V) {
78324 + OCRvalue = SD_OCR_2_7_TO_2_8_VDD;
78325 + } else if (pHcd->SlotVoltageCaps & SLOT_POWER_2_0V) {
78326 + OCRvalue = SD_OCR_1_9_TO_2_0_VDD;
78327 + } else if (pHcd->SlotVoltageCaps & SLOT_POWER_1_8V) {
78328 + OCRvalue = SD_OCR_1_7_TO_1_8_VDD;
78329 + } else if (pHcd->SlotVoltageCaps & SLOT_POWER_1_6V) {
78330 + OCRvalue = SD_OCR_1_6_TO_1_7_VDD;
78331 + } else {
78332 + DBG_ASSERT(FALSE);
78333 + OCRvalue = 0;
78334 + }
78335 +
78336 + do {
78337 + /* power up the card */
78338 + status = AdjustSlotPower(pHcd, &OCRvalue);
78339 + if (!SDIO_SUCCESS(status)) {
78340 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to adjust slot power \n"));
78341 + break;
78342 + }
78343 + status = SetOperationalBusMode(pHcd->pPseudoDev,&busMode);
78344 + if (!SDIO_SUCCESS(status)) {
78345 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set bus mode \n"));
78346 + break;
78347 + }
78348 + status = _IssueConfig(pHcd,SDCONFIG_SEND_INIT_CLOCKS,&initClocks,sizeof(initClocks));
78349 + if (!SDIO_SUCCESS(status)) {
78350 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to send init clocks in hcd \n"));
78351 + break;
78352 + }
78353 +
78354 + } while(FALSE);
78355 +
78356 + return status;
78357 +}
78358 +
78359 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
78360 + SDInitializeCard - initialize card
78361 + Input: pHcd - HCD object
78362 + Output: pProperties - card properties
78363 + Return:
78364 + Notes:
78365 +
78366 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
78367 +SDIO_STATUS SDInitializeCard(PSDHCD pHcd)
78368 +{
78369 + SDCONFIG_BUS_MODE_DATA busMode;
78370 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
78371 + PSDREQUEST pReq = NULL;
78372 + UINT32 OCRvalue;
78373 + UINT32 tplAddr;
78374 + UINT8 temp;
78375 + struct SDIO_MANFID_TPL manfid;
78376 + SDCONFIG_WP_VALUE wpValue;
78377 + UINT8 cisBuffer[3];
78378 +
78379 + OCRvalue = 0;
78380 +
78381 + do {
78382 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
78383 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Initializing card in SPI mode \n"));
78384 + } else {
78385 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Initializing card in MMC/SD mode \n"));
78386 + }
78387 +
78388 + pReq = AllocateRequest();
78389 + if (NULL == pReq) {
78390 + status = SDIO_STATUS_NO_RESOURCES;
78391 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: failed to allocate bus request \n"));
78392 + break;
78393 + }
78394 + memset(pReq, 0, sizeof(SDREQUEST));
78395 +
78396 + status = CardInitSetup(pHcd);
78397 + if (!SDIO_SUCCESS(status)) {
78398 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to setup card \n"));
78399 + break;
78400 + }
78401 + status = _IssueConfig(pHcd,SDCONFIG_GET_WP,&wpValue,sizeof(wpValue));
78402 + if (!SDIO_SUCCESS(status)) {
78403 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: host doesn't support Write Protect \n"));
78404 + } else {
78405 + if (wpValue) {
78406 + pHcd->CardProperties.Flags |= CARD_SD_WP;
78407 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: SD WP switch is on \n"));
78408 + }
78409 + }
78410 +
78411 + if (!(pHcd->Attributes & SDHCD_ATTRIB_SLOT_POLLING) &&
78412 + IS_HCD_BUS_MODE_SPI(pHcd)) {
78413 + /* for non-slot polling HCDs operating in SPI mode
78414 + * issue CMD0 to reset card state and to place the card
78415 + * in SPI mode. If slot polling is used, the polling thread
78416 + * will have already issued a CMD0 to place the card in SPI mode*/
78417 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
78418 + INT ii = 256;
78419 + status = SDIO_STATUS_ERROR;
78420 + /* if the CMD0 fails, retry it. Some cards have a hard time getting into SPI mode.*/
78421 + while ((!SDIO_SUCCESS(status)) && (ii-- >= 0)) {
78422 + status = _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_RESP_R1,pReq);
78423 + OSSleep(20);
78424 + }
78425 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: cmd0 go SPI retries:(256) %d\n", ii));
78426 +
78427 + } else {
78428 + status = _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_NO_RESP,pReq);
78429 + }
78430 + if (!SDIO_SUCCESS(status)) {
78431 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: go-idle failed! \n"));
78432 + break;
78433 + }
78434 + }
78435 +
78436 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Looking for SDIO.. \n"));
78437 + /* check for SDIO card by trying to read it's OCR */
78438 + status = ReadOCR(pHcd,CARD_SDIO,pReq,0,&OCRvalue);
78439 + if (SDIO_SUCCESS(status)) {
78440 + /* we got a response, this is an SDIO card */
78441 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
78442 + /* handle SPI */
78443 + pHcd->CardProperties.IOFnCount = SPI_SDIO_R4_GET_IO_FUNC_COUNT(pReq->Response);
78444 + if (SPI_SDIO_R4_IS_MEMORY_PRESENT(pReq->Response)) {
78445 + /* flag an SD function exists */
78446 + pHcd->CardProperties.Flags |= CARD_SD;
78447 + }
78448 + } else {
78449 + /* handle native SD */
78450 + pHcd->CardProperties.IOFnCount = SD_SDIO_R4_GET_IO_FUNC_COUNT(pReq->Response);
78451 + if (SD_SDIO_R4_IS_MEMORY_PRESENT(pReq->Response)) {
78452 + /* flag an SD function exists */
78453 + pHcd->CardProperties.Flags |= CARD_SD;
78454 + }
78455 +
78456 + }
78457 + if (0 == pHcd->CardProperties.IOFnCount) {
78458 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SDIO Card reports no functions \n"));
78459 + status = SDIO_STATUS_DEVICE_ERROR;
78460 + pHcd->CardProperties.Flags = 0;
78461 + break;
78462 + }
78463 + pHcd->CardProperties.Flags |= CARD_SDIO;
78464 +
78465 + DBG_PRINT(SDDBG_TRACE,
78466 + ("SDIO Bus Driver: SDIO Card, Functions: %d Card Info Flags:0x%X OCR:0x%8.8X\n",
78467 + pHcd->CardProperties.IOFnCount, pHcd->CardProperties.Flags, OCRvalue));
78468 + /* adjust slot power for this SDIO card */
78469 + status = AdjustSlotPower(pHcd, &OCRvalue);
78470 + if (!SDIO_SUCCESS(status)) {
78471 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set power in hcd \n"));
78472 + break;
78473 + }
78474 + /* poll for SDIO card ready */
78475 + status = PollCardReady(pHcd,OCRvalue,CARD_SDIO);
78476 + if (!SDIO_SUCCESS(status)) {
78477 + break;
78478 + }
78479 + } else if (status != SDIO_STATUS_BUS_RESP_TIMEOUT){
78480 + /* major error in hcd, bail */
78481 + break;
78482 + }
78483 +
78484 + /* check if this is an SDIO-only card before continuing */
78485 + if (!(pHcd->CardProperties.Flags & CARD_SD) && (pHcd->CardProperties.Flags & CARD_SDIO)) {
78486 + /* this is an SDIO card with no memory function */
78487 + goto prepareCard;
78488 + }
78489 +
78490 + if (!(pHcd->CardProperties.Flags & CARD_SDIO)) {
78491 + /* issue go idle only if we did not find an SDIO function in our earlier test */
78492 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
78493 + status = _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_RESP_R1,pReq);
78494 + } else {
78495 + status = _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_NO_RESP,pReq);
78496 + }
78497 + if (!SDIO_SUCCESS(status)) {
78498 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: go-idle failed! \n"));
78499 + break;
78500 + }
78501 + }
78502 +
78503 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Looking for SD Memory.. \n"));
78504 + /* SD Memory Card checking */
78505 + /* test for present of SD card (stand-alone or combo card) */
78506 + status = TestPresence(pHcd, CARD_SD, pReq);
78507 + if (SDIO_SUCCESS(status)) {
78508 + /* there is an SD Card present, could be part of a combo system */
78509 + pHcd->CardProperties.Flags |= CARD_SD;
78510 + if (0 == OCRvalue) {
78511 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SD Memory card detected. \n"));
78512 + /* no OCR value on entry this is a stand-alone card, go and get it*/
78513 + status = ReadOCR(pHcd,CARD_SD,pReq,0,&OCRvalue);
78514 + if (!SDIO_SUCCESS(status) || (OCRvalue == 0)) {
78515 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get OCR (status:%d) \n",
78516 + status));
78517 + break;
78518 + }
78519 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SD Card Reports OCR:0x%8.8X \n", OCRvalue));
78520 + status = AdjustSlotPower(pHcd, &OCRvalue);
78521 + if (!SDIO_SUCCESS(status)) {
78522 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to adjust power \n"));
78523 + break;
78524 + }
78525 + } else {
78526 + DBG_ASSERT((pHcd->CardProperties.Flags & (CARD_SD | CARD_SDIO)));
78527 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SDIO Combo Card detected \n"));
78528 + }
78529 + /* poll for SD card ready */
78530 + status = PollCardReady(pHcd,OCRvalue,CARD_SD);
78531 + if (!SDIO_SUCCESS(status)) {
78532 + /* check if this card has an SDIO function */
78533 + if (pHcd->CardProperties.Flags & CARD_SDIO) {
78534 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: Combo Detected but SD memory function failed \n"));
78535 + /* allow SDIO functions to load normally */
78536 + status = SDIO_STATUS_SUCCESS;
78537 + /* remove SD flag */
78538 + pHcd->CardProperties.Flags &= ~CARD_SD;
78539 + } else {
78540 + break;
78541 + }
78542 + } else {
78543 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SD Memory ready. \n"));
78544 + }
78545 + /* we're done, no need to check for MMC */
78546 + goto prepareCard;
78547 + } else if (status != SDIO_STATUS_BUS_RESP_TIMEOUT){
78548 + /* major error in hcd, bail */
78549 + break;
78550 + }
78551 +
78552 + /* MMC card checking */
78553 + /* if we get here, these better not be set */
78554 + DBG_ASSERT(!(pHcd->CardProperties.Flags & (CARD_SD | CARD_SDIO)));
78555 + /* issue go idle */
78556 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
78557 + status = _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_RESP_R1,pReq);
78558 + } else {
78559 + status = _IssueSimpleBusRequest(pHcd,CMD0,0,SDREQ_FLAGS_NO_RESP,pReq);
78560 + }
78561 + if (!SDIO_SUCCESS(status)) {
78562 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: go-idle failed! \n"));
78563 + break;
78564 + }
78565 +
78566 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Looking for MMC.. \n"));
78567 + status = TestPresence(pHcd, CARD_MMC, pReq);
78568 + if (!SDIO_SUCCESS(status)) {
78569 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: unknown card detected \n"));
78570 + break;
78571 + }
78572 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: MMC Card Detected \n"));
78573 + pHcd->CardProperties.Flags |= CARD_MMC;
78574 + /* read the OCR value */
78575 + status = ReadOCR(pHcd,CARD_MMC,pReq,0,&OCRvalue);
78576 + if (!SDIO_SUCCESS(status) || (OCRvalue == 0)) {
78577 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Failed to get OCR (status:%d)",
78578 + status));
78579 + break;
78580 + }
78581 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: MMC Card Reports OCR:0x%8.8X \n", OCRvalue));
78582 + /* adjust power */
78583 + status = AdjustSlotPower(pHcd, &OCRvalue);
78584 + if (!SDIO_SUCCESS(status)) {
78585 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to adjust power \n"));
78586 + break;
78587 + }
78588 + /* poll for MMC card ready */
78589 + status = PollCardReady(pHcd,OCRvalue,CARD_MMC);
78590 + if (!SDIO_SUCCESS(status)) {
78591 + break;
78592 + }
78593 + /* fall through and prepare MMC card */
78594 +
78595 +prepareCard:
78596 + /* we're done figuring out what was inserted, and setting up
78597 + * optimal slot voltage, now we need to prepare the card */
78598 + if (!IS_HCD_BUS_MODE_SPI(pHcd) &&
78599 + (pHcd->CardProperties.Flags & (CARD_SD | CARD_MMC))) {
78600 + /* non-SPI SD or MMC cards need to be moved to the "ident" state before we can get the
78601 + * RCA or select the card using the new RCA */
78602 + status = _IssueSimpleBusRequest(pHcd,CMD2,0,SDREQ_FLAGS_RESP_R2,pReq);
78603 + if (!SDIO_SUCCESS(status)){
78604 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: failed to move SD/MMC card into ident state \n"));
78605 + break;
78606 + }
78607 + }
78608 +
78609 + if (!IS_HCD_BUS_MODE_SPI(pHcd)) {
78610 + /* non-SPI mode cards need their RCA's setup */
78611 + if (pHcd->CardProperties.Flags & (CARD_SD | CARD_SDIO)) {
78612 + /* issue CMD3 to get RCA on SD/SDIO cards */
78613 + status = _IssueSimpleBusRequest(pHcd,CMD3,0,SDREQ_FLAGS_RESP_R6,pReq);
78614 + if (!SDIO_SUCCESS(status)){
78615 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: failed to get RCA for SD/SDIO card \n"));
78616 + break;
78617 + }
78618 + pHcd->CardProperties.RCA = SD_R6_GET_RCA(pReq->Response);
78619 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: SD/SDIO RCA:0x%X \n",
78620 + pHcd->CardProperties.RCA));
78621 + } else if (pHcd->CardProperties.Flags & CARD_MMC) {
78622 + /* for MMC cards, we have to assign a relative card address */
78623 + /* just a non-zero number */
78624 + pHcd->CardProperties.RCA = 1;
78625 + /* issue CMD3 to set the RCA for MMC cards */
78626 + status = _IssueSimpleBusRequest(pHcd,
78627 + CMD3,(pHcd->CardProperties.RCA << 16),
78628 + SDREQ_FLAGS_RESP_R1,pReq);
78629 + if (!SDIO_SUCCESS(status)){
78630 + DBG_PRINT(SDDBG_ERROR,
78631 + ("SDIO Bus Driver: failed to set RCA for MMC card! (err=%d) \n",status));
78632 + break;
78633 + }
78634 + } else {
78635 + DBG_ASSERT(FALSE);
78636 + }
78637 + }
78638 + /* select the card in order to get the rest of the card info, applies
78639 + * to SDIO/SD/MMC cards*/
78640 + status = SelectDeselectCard(pHcd, TRUE);
78641 + if (!SDIO_SUCCESS(status)) {
78642 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: failed to select card! \n"));
78643 + break;
78644 + }
78645 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver, Card now Selected.. \n"));
78646 +
78647 + if (pHcd->CardProperties.Flags & CARD_SDIO) {
78648 + /* read SDIO revision register */
78649 + status = Cmd52ReadByteCommon(pHcd->pPseudoDev, CCCR_SDIO_REVISION_REG, &temp);
78650 + if (!SDIO_SUCCESS(status)) {
78651 + break;
78652 + }
78653 + DBG_PRINT(SDDBG_TRACE, ("SDIO Revision Reg: 0x%X \n", temp));
78654 + switch (temp & SDIO_REV_MASK) {
78655 + case SDIO_REV_1_00:
78656 + DBG_PRINT(SDDBG_TRACE, ("SDIO Spec Revision 1.00 \n"));
78657 + pHcd->CardProperties.SDIORevision = SDIO_REVISION_1_00;
78658 + break;
78659 + case SDIO_REV_1_10:
78660 + DBG_PRINT(SDDBG_TRACE, ("SDIO Spec Revision 1.10 \n"));
78661 + pHcd->CardProperties.SDIORevision = SDIO_REVISION_1_10;
78662 + break;
78663 + case SDIO_REV_1_20:
78664 + DBG_PRINT(SDDBG_TRACE, ("SDIO Spec Revision 1.20 \n"));
78665 + pHcd->CardProperties.SDIORevision = SDIO_REVISION_1_20;
78666 + break;
78667 + default:
78668 + DBG_PRINT(SDDBG_WARN, ("SDIO Warning: unknown SDIO revision, treating like 1.0 device \n"));
78669 + pHcd->CardProperties.SDIORevision = SDIO_REVISION_1_00;
78670 + break;
78671 + }
78672 + /* get the common CIS ptr */
78673 + status = Cmd52ReadMultipleCommon(pHcd->pPseudoDev,
78674 + SDIO_CMN_CIS_PTR_LOW_REG,
78675 + cisBuffer,
78676 + 3);
78677 + if (!SDIO_SUCCESS(status)) {
78678 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get CIS ptr, Err:%d", status));
78679 + break;
78680 + }
78681 + /* this is endian-safe*/
78682 + pHcd->CardProperties.CommonCISPtr = ((UINT32)cisBuffer[0]) |
78683 + (((UINT32)cisBuffer[1]) << 8) |
78684 + (((UINT32)cisBuffer[2]) << 16);
78685 +
78686 + DBG_PRINT(SDDBG_TRACE, ("SDIO Card CIS Ptr: 0x%X \n", pHcd->CardProperties.CommonCISPtr));
78687 + temp = sizeof(manfid);
78688 + tplAddr = pHcd->CardProperties.CommonCISPtr;
78689 + /* get the MANFID tuple */
78690 + status = SDLIB_FindTuple(pHcd->pPseudoDev,
78691 + CISTPL_MANFID,
78692 + &tplAddr,
78693 + (PUINT8)&manfid,
78694 + &temp);
78695 + if (!SDIO_SUCCESS(status)) {
78696 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: Failed to get MANFID tuple err:%d \n", status));
78697 + status = SDIO_STATUS_SUCCESS;
78698 + } else {
78699 + /* save this off so that it can be copied into each SDIO Func's SDDEVICE structure */
78700 + pHcd->CardProperties.SDIO_ManufacturerCode =
78701 + CT_LE16_TO_CPU_ENDIAN(manfid.ManufacturerCode);
78702 + pHcd->CardProperties.SDIO_ManufacturerID =
78703 + CT_LE16_TO_CPU_ENDIAN(manfid.ManufacturerInfo);
78704 + DBG_PRINT(SDDBG_TRACE, ("SDIO MANFID:0x%X, MANFINFO:0x%X \n",
78705 + pHcd->CardProperties.SDIO_ManufacturerID,
78706 + pHcd->CardProperties.SDIO_ManufacturerCode));
78707 + }
78708 +
78709 + if (pHcd->CardProperties.SDIORevision >= SDIO_REVISION_1_10) {
78710 + /* read power control */
78711 + status = Cmd52ReadByteCommon(pHcd->pPseudoDev, SDIO_POWER_CONTROL_REG, &temp);
78712 + if (SDIO_SUCCESS(status)) {
78713 + /* check for power control support which indicates the card may use more
78714 + * than 200 mA */
78715 + if (temp & SDIO_POWER_CONTROL_SMPC) {
78716 + /* check that the host can support this. */
78717 + if (pHcd->MaxSlotCurrent >= SDIO_EMPC_CURRENT_THRESHOLD) {
78718 + temp = SDIO_POWER_CONTROL_EMPC;
78719 + /* enable power control on the card */
78720 + status = Cmd52WriteByteCommon(pHcd->pPseudoDev, SDIO_POWER_CONTROL_REG, &temp);
78721 + if (!SDIO_SUCCESS(status)) {
78722 + DBG_PRINT(SDDBG_ERROR,
78723 + ("SDIO Busdriver: failed to enable power control (%d) \n",status));
78724 + break;
78725 + }
78726 + /* mark that the card is high power */
78727 + pHcd->CardProperties.Flags |= CARD_HIPWR;
78728 +
78729 + DBG_PRINT(SDDBG_TRACE,
78730 + ("SDIO Busdriver: Power Control Enabled on SDIO (1.10 or greater) card \n"));
78731 + } else {
78732 + DBG_PRINT(SDDBG_WARN,
78733 + ("SDIO Busdriver: Card can operate higher than 200mA, host cannot (max:%d) \n",
78734 + pHcd->MaxSlotCurrent));
78735 + /* this is not fatal, the card should operate at a reduced rate */
78736 + }
78737 + } else {
78738 + DBG_PRINT(SDDBG_TRACE,
78739 + ("SDIO Busdriver: SDIO 1.10 (or greater) card draws less than 200mA \n"));
78740 + }
78741 + } else {
78742 + DBG_PRINT(SDDBG_WARN,
78743 + ("SDIO Busdriver: failed to get POWER CONTROL REG (%d) \n",status));
78744 + /* fall through and continue on at reduced mode */
78745 + }
78746 + }
78747 + }
78748 + /* get the current bus parameters */
78749 + busMode.BusModeFlags = pHcd->CardProperties.BusMode;
78750 + busMode.ClockRate = pHcd->CardProperties.OperBusClock;
78751 + /* get the rest of the bus parameters like clock and supported bus width */
78752 + status = GetBusParameters(pHcd,&busMode);
78753 + if (!SDIO_SUCCESS(status)) {
78754 + break;
78755 + }
78756 +
78757 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
78758 + /* check HCD if it wants to run without SPI CRC */
78759 + if (pHcd->Attributes & SDHCD_ATTRIB_NO_SPI_CRC) {
78760 + /* hcd would rather not run with CRC we don't need to tell the card since SPI mode
78761 + * cards power up with CRC initially disabled */
78762 + busMode.BusModeFlags |= SDCONFIG_BUS_MODE_SPI_NO_CRC;
78763 + } else {
78764 + /* first enable SPI CRC checking if the HCD can handle it */
78765 + status = SDSPIModeEnableDisableCRC(pHcd->pPseudoDev, TRUE);
78766 + if (!SDIO_SUCCESS(status)) {
78767 + DBG_PRINT(SDDBG_ERROR,
78768 + ("SDIO Bus Driver: Failed to set Enable SPI CRC on card \n"));
78769 + break;
78770 + }
78771 + }
78772 + }
78773 +
78774 + status = SetOperationalBusMode(pHcd->pPseudoDev, &busMode);
78775 +
78776 + if (!SDIO_SUCCESS(status)) {
78777 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set operational bus mode\n"));
78778 + break;
78779 + }
78780 +
78781 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Oper. Mode: Clock:%d, Bus:0x%X \n",
78782 + pHcd->CardProperties.OperBusClock,pHcd->CardProperties.BusMode));
78783 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Card in TRANS state, Ready: CardInfo Flags 0x%X \n",
78784 + pHcd->CardProperties.Flags));
78785 +
78786 + } while (FALSE);
78787 +
78788 + if (pReq != NULL) {
78789 + FreeRequest(pReq);
78790 + }
78791 +
78792 + return status;
78793 +}
78794 +
78795 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
78796 + SDQuerySDMMCInfo - query MMC card info
78797 + Input: pDevice - device
78798 + Output:
78799 + Return:
78800 + Notes:
78801 +
78802 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
78803 +SDIO_STATUS SDQuerySDMMCInfo(PSDDEVICE pDevice)
78804 +{
78805 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
78806 + PSDREQUEST pReq = NULL;
78807 + UINT8 CID[MAX_CSD_CID_BYTES];
78808 +
78809 + do {
78810 + pReq = AllocateRequest();
78811 + if (NULL == pReq) {
78812 + status = SDIO_STATUS_NO_RESOURCES;
78813 + break;
78814 + }
78815 + /* de-select the card */
78816 + status = SelectDeselectCard(pDevice->pHcd,FALSE);
78817 + if (!SDIO_SUCCESS(status)) {
78818 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to deselect card before getting CID \n"));
78819 + break;
78820 + }
78821 +
78822 + if (SDDEVICE_IS_BUSMODE_SPI(pDevice)) {
78823 + /* in SPI mode, getting the CSD requires a data transfer */
78824 + status = _IssueBusRequestBd(pDevice->pHcd,CMD10,0,
78825 + SDREQ_FLAGS_RESP_R1 | SDREQ_FLAGS_DATA_TRANS,
78826 + pReq,
78827 + CID,
78828 + MAX_CSD_CID_BYTES);
78829 + if (SDIO_SUCCESS(status)) {
78830 + /* in SPI mode we need to reorder to the CID since SPI data comes in MSB first*/
78831 + ReorderBuffer(CID,MAX_CSD_CID_BYTES);
78832 + }
78833 + } else {
78834 + /* get the CID */
78835 + status = _IssueSimpleBusRequest(pDevice->pHcd,
78836 + CMD10,
78837 + (SDDEVICE_GET_CARD_RCA(pDevice) << 16),
78838 + SDREQ_FLAGS_RESP_R2,
78839 + pReq);
78840 + if (SDIO_SUCCESS(status)) {
78841 + /* extract it from the reponse */
78842 + memcpy(CID,pReq->Response,MAX_CSD_CID_BYTES);
78843 + }
78844 + }
78845 +
78846 + if (!SDIO_SUCCESS(status)) {
78847 + DBG_PRINT(SDDBG_WARN, ("SDQuerySDMMCInfo: failed to get CID. \n"));
78848 + status = SDIO_STATUS_SUCCESS;
78849 + } else {
78850 + pDevice->pId[0].SDMMC_ManfacturerID = GET_SD_CID_MANFID(CID);
78851 + pDevice->pId[0].SDMMC_OEMApplicationID = GET_SD_CID_OEMID(CID);
78852 +#ifdef DEBUG
78853 + {
78854 + char pBuf[7];
78855 +
78856 + pBuf[0] = GET_SD_CID_PN_1(CID);
78857 + pBuf[1] = GET_SD_CID_PN_2(CID);
78858 + pBuf[2] = GET_SD_CID_PN_3(CID);
78859 + pBuf[3] = GET_SD_CID_PN_4(CID);
78860 + pBuf[4] = GET_SD_CID_PN_5(CID);
78861 + if (pDevice->pHcd->CardProperties.Flags & CARD_MMC) {
78862 + pBuf[5] = GET_SD_CID_PN_6(CID);
78863 + pBuf[6] = 0;
78864 + } else {
78865 + pBuf[5] = 0;
78866 + }
78867 + DBG_PRINT(SDDBG_TRACE, ("SDQuerySDMMCInfo: Product String: %s\n", pBuf));
78868 + }
78869 +#endif
78870 + DBG_PRINT(SDDBG_TRACE, ("SDQuerySDMMCInfo: ManfID: 0x%X, OEMID:0x%X \n",
78871 + pDevice->pId[0].SDMMC_ManfacturerID, pDevice->pId[0].SDMMC_OEMApplicationID));
78872 + }
78873 + /* re-select card */
78874 + status = SelectDeselectCard(pDevice->pHcd,TRUE);
78875 + if (!SDIO_SUCCESS(status)) {
78876 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to re-select card after getting CID \n"));
78877 + break;
78878 + }
78879 + } while (FALSE);
78880 +
78881 + if (pReq != NULL) {
78882 + FreeRequest(pReq);
78883 + }
78884 +
78885 + return status;
78886 +}
78887 +
78888 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
78889 + SDQuerySDIOInfo - query SDIO card info
78890 + Input: pDevice - the device
78891 + Output:
78892 + Return:
78893 + Notes:
78894 +
78895 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
78896 +SDIO_STATUS SDQuerySDIOInfo(PSDDEVICE pDevice)
78897 +{
78898 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
78899 + UINT32 faddress;
78900 + UINT8 fInfo;
78901 + UINT32 nextTpl;
78902 + UINT8 tplLength;
78903 + UINT8 cisPtrBuffer[3];
78904 + struct SDIO_FUNC_EXT_FUNCTION_TPL_1_1 funcTuple;
78905 +
78906 + /* use the card-wide SDIO manufacturer code and ID previously read.*/
78907 + pDevice->pId[0].SDIO_ManufacturerCode = pDevice->pHcd->CardProperties.SDIO_ManufacturerCode;
78908 + pDevice->pId[0].SDIO_ManufacturerID = pDevice->pHcd->CardProperties.SDIO_ManufacturerID;
78909 +
78910 + /* calculate function base address */
78911 + faddress = CalculateFBROffset(SDDEVICE_GET_SDIO_FUNCNO(pDevice));
78912 + DBG_ASSERT(faddress != 0);
78913 +
78914 + do {
78915 + status = Cmd52ReadByteCommon(pDevice,
78916 + FBR_FUNC_INFO_REG_OFFSET(faddress),
78917 + &fInfo);
78918 + if (!SDIO_SUCCESS(status)) {
78919 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get function info, Err:%d , using Class:UNKNOWN\n", status));
78920 + fInfo = 0;
78921 + pDevice->pId[0].SDIO_FunctionClass = 0;
78922 + status = SDIO_STATUS_SUCCESS;
78923 + } else {
78924 + pDevice->pId[0].SDIO_FunctionClass = fInfo & FUNC_INFO_DEVICE_CODE_MASK;
78925 + }
78926 +
78927 + if ((FUNC_INFO_DEVICE_CODE_LAST == pDevice->pId[0].SDIO_FunctionClass) &&
78928 + SDDEVICE_IS_SDIO_REV_GTEQ_1_10(pDevice)) {
78929 + /* if the device code is the last one, check for 1.1 revision and get the
78930 + * extended code */
78931 + status = Cmd52ReadByteCommon(pDevice,
78932 + FBR_FUNC_EXT_DEVICE_CODE_OFFSET(faddress),
78933 + &(pDevice->pId[0].SDIO_FunctionClass));
78934 + if (!SDIO_SUCCESS(status)) {
78935 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get 1.1 extended DC, Err:%d\n",
78936 + status));
78937 + break;
78938 + }
78939 + }
78940 +
78941 + /* get the function CIS ptr */
78942 + status = Cmd52ReadMultipleCommon(pDevice,
78943 + FBR_FUNC_CIS_LOW_OFFSET(faddress),
78944 + cisPtrBuffer,
78945 + 3);
78946 + if (!SDIO_SUCCESS(status)) {
78947 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get FN CIS ptr, Err:%d\n", status));
78948 + break;
78949 + }
78950 + /* endian safe */
78951 + pDevice->DeviceInfo.AsSDIOInfo.FunctionCISPtr = ((UINT32)cisPtrBuffer[0]) |
78952 + (((UINT32)cisPtrBuffer[1]) << 8) |
78953 + (((UINT32)cisPtrBuffer[2]) << 16);
78954 +
78955 + DBG_PRINT(SDDBG_TRACE, ("SDIO Function:%d, Class:%d FnCISPtr:0x%X \n",
78956 + SDDEVICE_GET_SDIO_FUNCNO(pDevice),
78957 + pDevice->pId[0].SDIO_FunctionClass,pDevice->DeviceInfo.AsSDIOInfo.FunctionCISPtr));
78958 +
78959 + if (fInfo & FUNC_INFO_SUPPORTS_CSA_MASK) {
78960 + /* get the function CSA ptr */
78961 + status = Cmd52ReadMultipleCommon(pDevice,
78962 + FBR_FUNC_CSA_LOW_OFFSET(faddress),
78963 + cisPtrBuffer,
78964 + 3);
78965 + if (!SDIO_SUCCESS(status)) {
78966 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get FN CSA ptr, Err:%d \n", status));
78967 + break;
78968 + }
78969 + /* endian safe */
78970 + pDevice->DeviceInfo.AsSDIOInfo.FunctionCSAPtr = ((UINT32)cisPtrBuffer[0]) |
78971 + (((UINT32)cisPtrBuffer[1]) << 8) |
78972 + (((UINT32)cisPtrBuffer[2]) << 16);
78973 +
78974 + }
78975 +
78976 + nextTpl = SDDEVICE_GET_SDIO_FUNC_CISPTR(pDevice);
78977 + /* look for the funce TPL */
78978 + tplLength = sizeof(funcTuple);
78979 + /* go get the func CE tuple */
78980 + status = SDLIB_FindTuple(pDevice,
78981 + CISTPL_FUNCE,
78982 + &nextTpl,
78983 + (PUINT8)&funcTuple,
78984 + &tplLength);
78985 +
78986 + if (!SDIO_SUCCESS(status)){
78987 + /* handles case of bad CIS or missing tupple, allow function driver to handle */
78988 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: Failed to get FuncCE Tuple: %d \n", status));
78989 + status = SDIO_STATUS_SUCCESS;
78990 + break;
78991 + }
78992 + /* set the max block size */
78993 + pDevice->DeviceInfo.AsSDIOInfo.FunctionMaxBlockSize =
78994 + CT_LE16_TO_CPU_ENDIAN(funcTuple.CommonInfo.MaxBlockSize);
78995 +
78996 + DBG_PRINT(SDDBG_TRACE, ("SDIO Function:%d, MaxBlocks:%d \n",
78997 + SDDEVICE_GET_SDIO_FUNCNO(pDevice),
78998 + pDevice->DeviceInfo.AsSDIOInfo.FunctionMaxBlockSize));
78999 +
79000 + /* check for MANFID function tuple (SDIO 1.1 or greater) */
79001 + if (SDDEVICE_IS_SDIO_REV_GTEQ_1_10(pDevice)) {
79002 + struct SDIO_MANFID_TPL manfid;
79003 + nextTpl = SDDEVICE_GET_SDIO_FUNC_CISPTR(pDevice);
79004 + tplLength = sizeof(manfid);
79005 + /* get the MANFID tuple */
79006 + status = SDLIB_FindTuple(pDevice,
79007 + CISTPL_MANFID,
79008 + &nextTpl,
79009 + (PUINT8)&manfid,
79010 + &tplLength);
79011 + if (SDIO_SUCCESS(status)) {
79012 + /* this function has a MANFID tuple */
79013 + pDevice->pId[0].SDIO_ManufacturerCode =
79014 + CT_LE16_TO_CPU_ENDIAN(manfid.ManufacturerCode);
79015 + pDevice->pId[0].SDIO_ManufacturerID =
79016 + CT_LE16_TO_CPU_ENDIAN(manfid.ManufacturerInfo);
79017 + DBG_PRINT(SDDBG_TRACE, ("SDIO 1.1 (Function Specific) MANFID:0x%X, MANFINFO:0x%X \n",
79018 + pDevice->pId[0].SDIO_ManufacturerID,
79019 + pDevice->pId[0].SDIO_ManufacturerCode));
79020 + } else {
79021 + DBG_PRINT(SDDBG_WARN, ("SDIO 1.1, No CISTPL_MANFID Tuple in FUNC CIS \n"));
79022 + status = SDIO_STATUS_SUCCESS;
79023 + }
79024 + }
79025 + } while (FALSE);
79026 +
79027 + return status;
79028 +}
79029 +
79030 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79031 + SDEnableFunction - enable function
79032 + Input: pDevice - the device/function
79033 + pEnData - enable data;
79034 + Output:
79035 + Return: status
79036 + Notes: Note, this performs synchronous calls
79037 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
79038 +SDIO_STATUS SDEnableFunction(PSDDEVICE pDevice, PSDCONFIG_FUNC_ENABLE_DISABLE_DATA pEnData)
79039 +{
79040 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
79041 + UINT8 registerValue;
79042 + UINT8 mask;
79043 + FUNC_ENABLE_TIMEOUT retry;
79044 +
79045 + /* take the configure op lock to make this atomic */
79046 + status = SemaphorePendInterruptable(&pDevice->pHcd->ConfigureOpsSem);
79047 + if (!SDIO_SUCCESS(status)) {
79048 + return status;
79049 + }
79050 +
79051 + status = SDIO_STATUS_INVALID_PARAMETER;
79052 + do {
79053 + if (!(pDevice->pHcd->CardProperties.Flags & CARD_SDIO)){
79054 + /* nothing to do if it's not an SDIO card */
79055 + break;
79056 + }
79057 +
79058 + if (!((SDDEVICE_GET_SDIO_FUNCNO(pDevice) >= SDIO_FIRST_FUNCTION_NUMBER) &&
79059 + (SDDEVICE_GET_SDIO_FUNCNO(pDevice) <= SDIO_LAST_FUNCTION_NUMBER))){
79060 + DBG_ASSERT(FALSE);
79061 + break;
79062 + }
79063 + /* make sure there is a timeout value */
79064 + if (0 == pEnData->TimeOut) {
79065 + break;
79066 + }
79067 +
79068 + mask = 1 << SDDEVICE_GET_SDIO_FUNCNO(pDevice);
79069 + /* read the enable register */
79070 + status = Cmd52ReadByteCommon(pDevice, SDIO_ENABLE_REG, &registerValue);
79071 + if (!SDIO_SUCCESS(status)){
79072 + break;
79073 + }
79074 + if (pEnData->EnableFlags & SDCONFIG_ENABLE_FUNC) {
79075 + /* set the enable register bit */
79076 + registerValue |= mask;
79077 + } else {
79078 + /* clear the bit */
79079 + registerValue &= ~mask;
79080 + }
79081 +
79082 + DBG_PRINT(SDDBG_TRACE,
79083 + ("SDIO Bus Driver %s Function, Mask:0x%X Enable Reg Value:0x%2.2X\n",
79084 + (pEnData->EnableFlags & SDCONFIG_ENABLE_FUNC) ? "Enabling":"Disabling",
79085 + mask,
79086 + registerValue));
79087 +
79088 + /* write it back out */
79089 + status = Cmd52WriteByteCommon(pDevice, SDIO_ENABLE_REG, &registerValue);
79090 + if (!SDIO_SUCCESS(status)){
79091 + break;
79092 + }
79093 + /* now poll the ready bit until it sets or clears */
79094 + retry = pEnData->TimeOut;
79095 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Function Enable/Disable Polling: %d retries \n",
79096 + retry));
79097 + while (retry) {
79098 + status = Cmd52ReadByteCommon(pDevice, SDIO_READY_REG, &registerValue);
79099 + if (!SDIO_SUCCESS(status)){
79100 + break;
79101 + }
79102 + if (pEnData->EnableFlags & SDCONFIG_ENABLE_FUNC) {
79103 + /* if the bit is set, the device is ready */
79104 + if (registerValue & mask) {
79105 + /* device ready */
79106 + break;
79107 + }
79108 + } else {
79109 + if (!(registerValue & mask)) {
79110 + /* device is no longer ready */
79111 + break;
79112 + }
79113 + }
79114 + /* sleep before trying again */
79115 + status = OSSleep(1);
79116 + if (!SDIO_SUCCESS(status)) {
79117 + DBG_PRINT(SDDBG_ERROR, ("OSSleep Failed! \n"));
79118 + break;
79119 + }
79120 + retry--;
79121 + }
79122 +
79123 + if (0 == retry) {
79124 + status = SDIO_STATUS_FUNC_ENABLE_TIMEOUT;
79125 + break;
79126 + }
79127 +
79128 + } while (FALSE);
79129 +
79130 + SemaphorePost(&pDevice->pHcd->ConfigureOpsSem);
79131 + return status;
79132 +}
79133 +
79134 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79135 + SDAllocFreeSlotCurrent - allocate or free slot current
79136 + Input: pDevice - the device/function
79137 + Allocate - Allocate current, else free
79138 + pData - slotcurrent data (non-NULL if Allocate is TRUE)
79139 + Output:
79140 + Return: status
79141 + Notes: if the function returns SDIO_STATUS_NO_RESOURCES, the pData->SlotCurrent field is
79142 + updated with the available current
79143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
79144 +SDIO_STATUS SDAllocFreeSlotCurrent(PSDDEVICE pDevice, BOOL Allocate, PSDCONFIG_FUNC_SLOT_CURRENT_DATA pData)
79145 +{
79146 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
79147 +
79148 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: SDAllocFreeSlotCurrent\n"));
79149 +
79150 + /* take the configure op lock to make this atomic */
79151 + status = SemaphorePendInterruptable(&pDevice->pHcd->ConfigureOpsSem);
79152 + if (!SDIO_SUCCESS(status)) {
79153 + return status;
79154 + }
79155 +
79156 + status = SDIO_STATUS_INVALID_PARAMETER;
79157 + do {
79158 + /* check the current budget and allocate */
79159 + if (Allocate) {
79160 + if (0 == pData->SlotCurrent) {
79161 + /* caller must specify current requirement for the power mode */
79162 + break;
79163 + }
79164 + if (pDevice->SlotCurrentAlloc != 0) {
79165 + /* slot current has already been allocated, caller needs to free
79166 + * first */
79167 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Slot Current Already allocated! \n"));
79168 + break;
79169 + }
79170 + if (((UINT32)pDevice->pHcd->SlotCurrentAllocated + (UINT32)pData->SlotCurrent) >
79171 + (UINT32)pDevice->pHcd->MaxSlotCurrent) {
79172 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Slot Current Budget exceeded, Requesting: %d, Allocated already: %d, Max: %d \n",
79173 + pData->SlotCurrent, pDevice->pHcd->SlotCurrentAllocated,
79174 + pDevice->pHcd->MaxSlotCurrent));
79175 + status = SDIO_STATUS_NO_RESOURCES;
79176 + /* return remaining */
79177 + pData->SlotCurrent = pDevice->pHcd->MaxSlotCurrent -
79178 + pDevice->pHcd->SlotCurrentAllocated;
79179 + break;
79180 + }
79181 + /* bump up allocation */
79182 + pDevice->pHcd->SlotCurrentAllocated += pData->SlotCurrent;
79183 + /* save this off for the call to free slot current */
79184 + pDevice->SlotCurrentAlloc = pData->SlotCurrent;
79185 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Slot Current Requested: %d, New Total: %d, Max: %d \n",
79186 + pData->SlotCurrent, pDevice->pHcd->SlotCurrentAllocated,
79187 + pDevice->pHcd->MaxSlotCurrent));
79188 +
79189 + } else {
79190 + if (0 == pDevice->SlotCurrentAlloc) {
79191 + /* no allocation */
79192 + break;
79193 + }
79194 + /* return the allocation back */
79195 + if (pDevice->SlotCurrentAlloc <= pDevice->pHcd->SlotCurrentAllocated) {
79196 + pDevice->pHcd->SlotCurrentAllocated -= pDevice->SlotCurrentAlloc;
79197 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Slot Current Freed: %d, New Total: %d, Max: %d \n",
79198 + pDevice->SlotCurrentAlloc, pDevice->pHcd->SlotCurrentAllocated,
79199 + pDevice->pHcd->MaxSlotCurrent));
79200 + } else {
79201 + DBG_ASSERT(FALSE);
79202 + }
79203 +
79204 + /* make sure this is zeroed */
79205 + pDevice->SlotCurrentAlloc = 0;
79206 + }
79207 +
79208 + status = SDIO_STATUS_SUCCESS;
79209 +
79210 + } while (FALSE);
79211 +
79212 + SemaphorePost(&pDevice->pHcd->ConfigureOpsSem);
79213 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: SDAllocFreeSlotCurrent, %d\n", status));
79214 + return status;
79215 +}
79216 +
79217 +static void RawHcdIrqControl(PSDHCD pHcd, BOOL Enable)
79218 +{
79219 + SDIO_STATUS status;
79220 + SDCONFIG_SDIO_INT_CTRL_DATA irqData;
79221 + CT_DECLARE_IRQ_SYNC_CONTEXT();
79222 +
79223 + ZERO_OBJECT(irqData);
79224 +
79225 + status = _AcquireHcdLock(pHcd);
79226 + if (!SDIO_SUCCESS(status)) {
79227 + return;
79228 + }
79229 +
79230 + do {
79231 + /* for raw devices, we simply enable/disable in the HCD only */
79232 + if (Enable) {
79233 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver (RAW) Unmasking Int \n"));
79234 + irqData.IRQDetectMode = IRQ_DETECT_RAW;
79235 + irqData.SlotIRQEnable = TRUE;
79236 + } else {
79237 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver (RAW) Masking Int \n"));
79238 + irqData.SlotIRQEnable = FALSE;
79239 + }
79240 +
79241 + status = _IssueConfig(pHcd,SDCONFIG_SDIO_INT_CTRL,
79242 + (PVOID)&irqData, sizeof(irqData));
79243 +
79244 + if (!SDIO_SUCCESS(status)){
79245 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver failed to enable/disable IRQ in (RAW) hcd :%d\n",
79246 + status));
79247 + }
79248 +
79249 + } while (FALSE);
79250 +
79251 + status = _ReleaseHcdLock(pHcd);
79252 +}
79253 +
79254 +static void RawHcdEnableIrqPseudoComplete(PSDREQUEST pReq)
79255 +{
79256 + if (SDIO_SUCCESS(pReq->Status)) {
79257 + RawHcdIrqControl((PSDHCD)pReq->pCompleteContext, TRUE);
79258 + }
79259 + FreeRequest(pReq);
79260 +}
79261 +
79262 +static void RawHcdDisableIrqPseudoComplete(PSDREQUEST pReq)
79263 +{
79264 + RawHcdIrqControl((PSDHCD)pReq->pCompleteContext, FALSE);
79265 + FreeRequest(pReq);
79266 +}
79267 +
79268 +static void HcdIrqControl(PSDHCD pHcd, BOOL Enable)
79269 +{
79270 + SDIO_STATUS status;
79271 + SDCONFIG_SDIO_INT_CTRL_DATA irqData;
79272 + CT_DECLARE_IRQ_SYNC_CONTEXT();
79273 +
79274 + ZERO_OBJECT(irqData);
79275 +
79276 + status = _AcquireHcdLock(pHcd);
79277 + if (!SDIO_SUCCESS(status)) {
79278 + return;
79279 + }
79280 +
79281 + do {
79282 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: HcdIrqControl (%s), IrqsEnabled:0x%X \n",
79283 + Enable ? "Enable":"Disable",pHcd->IrqsEnabled ));
79284 +
79285 + if (Enable) {
79286 + irqData.SlotIRQEnable = TRUE;
79287 + } else {
79288 + irqData.SlotIRQEnable = FALSE;
79289 + }
79290 + /* setup HCD to enable/disable it's detection hardware */
79291 + if (irqData.SlotIRQEnable) {
79292 + /* set the IRQ detection mode */
79293 + switch (SDCONFIG_GET_BUSWIDTH(pHcd->CardProperties.BusMode)) {
79294 + case SDCONFIG_BUS_WIDTH_SPI:
79295 + irqData.IRQDetectMode = IRQ_DETECT_SPI;
79296 + break;
79297 + case SDCONFIG_BUS_WIDTH_1_BIT:
79298 + irqData.IRQDetectMode = IRQ_DETECT_1_BIT;
79299 + break;
79300 + case SDCONFIG_BUS_WIDTH_4_BIT:
79301 + irqData.IRQDetectMode = IRQ_DETECT_4_BIT;
79302 + /* check card and HCD for 4bit multi-block interrupt support */
79303 + if ((pHcd->CardProperties.SDIOCaps & SDIO_CAPS_INT_MULTI_BLK) &&
79304 + (pHcd->Attributes & SDHCD_ATTRIB_MULTI_BLK_IRQ)) {
79305 + /* note: during initialization of the card, the mult-blk IRQ support
79306 + * is enabled in card caps register */
79307 + irqData.IRQDetectMode |= IRQ_DETECT_MULTI_BLK;
79308 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver enabling IRQ in multi-block mode:\n"));
79309 + }
79310 + break;
79311 + default:
79312 + DBG_ASSERT(FALSE);
79313 + break;
79314 + }
79315 +
79316 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver enabling IRQ in HCD Mode:0x%X\n",
79317 + irqData.IRQDetectMode));
79318 + }
79319 +
79320 + status = _IssueConfig(pHcd,SDCONFIG_SDIO_INT_CTRL,
79321 + (PVOID)&irqData, sizeof(irqData));
79322 + if (!SDIO_SUCCESS(status)){
79323 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver failed to enable/disable IRQ in hcd %d\n",
79324 + status));
79325 + }
79326 +
79327 + } while (FALSE);
79328 +
79329 + status = _ReleaseHcdLock(pHcd);
79330 +}
79331 +
79332 +static BOOL CheckWriteIntEnableSuccess(PSDREQUEST pReq)
79333 +{
79334 + if (!SDIO_SUCCESS(pReq->Status)){
79335 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to get write INT Enable register Err:%d\n",
79336 + pReq->Status));
79337 + return FALSE;
79338 + }
79339 +
79340 + if (SD_R5_GET_RESP_FLAGS(pReq->Response) & SD_R5_ERRORS) {
79341 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: WriteIntEnableComplete CMD52 resp error: 0x%X \n",
79342 + SD_R5_GET_RESP_FLAGS(pReq->Response)));
79343 + return FALSE;
79344 + }
79345 +
79346 + return TRUE;
79347 +}
79348 +
79349 +static void HcdIrqEnableComplete(PSDREQUEST pReq)
79350 +{
79351 + if (CheckWriteIntEnableSuccess(pReq)) {
79352 + /* configure HCD */
79353 + HcdIrqControl((PSDHCD)pReq->pCompleteContext, TRUE);
79354 + }
79355 + FreeRequest(pReq);
79356 +}
79357 +
79358 +static void HcdIrqDisableComplete(PSDREQUEST pReq)
79359 +{
79360 + CheckWriteIntEnableSuccess(pReq);
79361 + HcdIrqControl((PSDHCD)pReq->pCompleteContext, FALSE);
79362 + FreeRequest(pReq);
79363 +}
79364 +
79365 +static void WriteIntEnableComplete(PSDREQUEST pReq)
79366 +{
79367 + if (CheckWriteIntEnableSuccess(pReq)) {
79368 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: Wrote INT Enable value:0x%X \n",
79369 + (INT)pReq->pCompleteContext));
79370 + }
79371 + FreeRequest(pReq);
79372 +}
79373 +
79374 +static void HcdAckComplete(PSDREQUEST pReq)
79375 +{
79376 + SDIO_STATUS status;
79377 + DBG_PRINT(SDIODBG_FUNC_IRQ, ("SDIO Bus Driver: Hcd (0x%X) Irq Ack \n",
79378 + (INT)pReq->pCompleteContext));
79379 + /* re-arm the HCD */
79380 + status = _IssueConfig((PSDHCD)pReq->pCompleteContext,SDCONFIG_SDIO_REARM_INT,NULL,0);
79381 +
79382 + if (!SDIO_SUCCESS(status)) {
79383 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: HCD Re-Arm failed : %d\n",
79384 + status));
79385 + }
79386 + FreeRequest(pReq);
79387 +}
79388 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79389 + SDFunctionAckInterrupt - handle device interrupt acknowledgement
79390 + Input: pDevice - the device
79391 + Output:
79392 + Return:
79393 + Notes:
79394 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
79395 +SDIO_STATUS SDFunctionAckInterrupt(PSDDEVICE pDevice)
79396 +{
79397 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
79398 + UCHAR mask;
79399 + PSDREQUEST pReq = NULL;
79400 + BOOL setHcd = FALSE;
79401 + SDIO_STATUS status2;
79402 + CT_DECLARE_IRQ_SYNC_CONTEXT();
79403 +
79404 + pReq = AllocateRequest();
79405 + if (NULL == pReq) {
79406 + return SDIO_STATUS_NO_RESOURCES;
79407 + }
79408 +
79409 + status = _AcquireHcdLock(pDevice->pHcd);
79410 +
79411 + if (!SDIO_SUCCESS(status)) {
79412 + FreeRequest(pReq);
79413 + return status;
79414 + }
79415 +
79416 + do {
79417 + if (!((SDDEVICE_GET_SDIO_FUNCNO(pDevice) >= SDIO_FIRST_FUNCTION_NUMBER) &&
79418 + (SDDEVICE_GET_SDIO_FUNCNO(pDevice) <= SDIO_LAST_FUNCTION_NUMBER))){
79419 + status = SDIO_STATUS_INVALID_PARAMETER;
79420 + DBG_ASSERT(FALSE);
79421 + break;
79422 + }
79423 + mask = 1 << SDDEVICE_GET_SDIO_FUNCNO(pDevice);
79424 + if (pDevice->pHcd->PendingIrqAcks & mask) {
79425 + /* clear the ack bit in question */
79426 + pDevice->pHcd->PendingIrqAcks &= ~mask;
79427 + if (0 == pDevice->pHcd->PendingIrqAcks) {
79428 + pDevice->pHcd->IrqProcState = SDHCD_IDLE;
79429 + /* no pending acks, so re-arm if irqs are stilled enabled */
79430 + if (pDevice->pHcd->IrqsEnabled) {
79431 + setHcd = TRUE;
79432 + /* issue pseudo request to sync this with bus requests */
79433 + pReq->Status = SDIO_STATUS_SUCCESS;
79434 + pReq->pCompletion = HcdAckComplete;
79435 + pReq->pCompleteContext = pDevice->pHcd;
79436 + pReq->Flags = SD_PSEUDO_REQ_FLAGS;
79437 + }
79438 + }
79439 + } else {
79440 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: AckInterrupt: no IRQ pending on Function :%d, \n",
79441 + SDDEVICE_GET_SDIO_FUNCNO(pDevice)));
79442 + }
79443 + } while (FALSE);
79444 +
79445 + status2 = ReleaseHcdLock(pDevice);
79446 +
79447 + if (pReq != NULL) {
79448 + if (SDIO_SUCCESS(status) && (setHcd)) {
79449 + /* issue request */
79450 + IssueRequestToHCD(pDevice->pHcd,pReq);
79451 + } else {
79452 + FreeRequest(pReq);
79453 + }
79454 + }
79455 +
79456 + return status;
79457 +}
79458 +
79459 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79460 + SDMaskUnmaskFunctionIRQ - mask/unmask function IRQ
79461 + Input: pDevice - the device/function
79462 + MaskInt - mask interrupt
79463 + Output:
79464 + Return: status
79465 + Notes: Note, this function can be called from an ISR or completion context
79466 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
79467 +SDIO_STATUS SDMaskUnmaskFunctionIRQ(PSDDEVICE pDevice, BOOL MaskInt)
79468 +{
79469 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
79470 + UINT8 mask;
79471 + UINT8 controlVal;
79472 + BOOL setHcd;
79473 + PSDREQUEST pReq = NULL;
79474 + SDIO_STATUS status2;
79475 +
79476 + CT_DECLARE_IRQ_SYNC_CONTEXT();
79477 +
79478 + setHcd = FALSE;
79479 +
79480 + pReq = AllocateRequest();
79481 + if (NULL == pReq) {
79482 + return SDIO_STATUS_NO_RESOURCES;
79483 + }
79484 +
79485 + status = _AcquireHcdLock(pDevice->pHcd);
79486 +
79487 + if (!SDIO_SUCCESS(status)) {
79488 + FreeRequest(pReq);
79489 + return status;
79490 + }
79491 +
79492 + do {
79493 +
79494 + if (pDevice->pHcd->CardProperties.Flags & CARD_RAW) {
79495 + if (!MaskInt) {
79496 + if (!pDevice->pHcd->IrqsEnabled) {
79497 + pReq->pCompletion = RawHcdEnableIrqPseudoComplete;
79498 + setHcd = TRUE;
79499 + pDevice->pHcd->IrqsEnabled = 1 << 1;
79500 + }
79501 + } else {
79502 + if (pDevice->pHcd->IrqsEnabled) {
79503 + pReq->pCompletion = RawHcdDisableIrqPseudoComplete;
79504 + setHcd = TRUE;
79505 + pDevice->pHcd->IrqsEnabled = 0;
79506 + }
79507 + }
79508 +
79509 + if (setHcd) {
79510 + /* hcd IRQ control requests must be synched with outstanding
79511 + * bus requests so we issue a pseudo bus request */
79512 + pReq->pCompleteContext = pDevice->pHcd;
79513 + pReq->Flags = SD_PSEUDO_REQ_FLAGS;
79514 + pReq->Status = SDIO_STATUS_SUCCESS;
79515 + } else {
79516 + /* no request to submit, just free it */
79517 + FreeRequest(pReq);
79518 + pReq = NULL;
79519 + }
79520 + /* we're done, submit the bus request if any */
79521 + break;
79522 + }
79523 +
79524 + if (!(pDevice->pHcd->CardProperties.Flags & CARD_SDIO)){
79525 + /* nothing to do if it's not an SDIO card */
79526 + DBG_ASSERT(FALSE);
79527 + status = SDIO_STATUS_INVALID_PARAMETER;
79528 + break;
79529 + }
79530 +
79531 + if (!((SDDEVICE_GET_SDIO_FUNCNO(pDevice) >= SDIO_FIRST_FUNCTION_NUMBER) &&
79532 + (SDDEVICE_GET_SDIO_FUNCNO(pDevice) <= SDIO_LAST_FUNCTION_NUMBER))){
79533 + status = SDIO_STATUS_INVALID_PARAMETER;
79534 + DBG_ASSERT(FALSE);
79535 + break;
79536 + }
79537 +
79538 + mask = 1 << SDDEVICE_GET_SDIO_FUNCNO(pDevice);
79539 + if (!MaskInt) {
79540 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver Unmasking Int, Mask:0x%X\n", mask));
79541 + /* check interrupts that were enabled on entry */
79542 + if (0 == pDevice->pHcd->IrqsEnabled) {
79543 + /* need to turn on interrupts in HCD */
79544 + setHcd = TRUE;
79545 + /* use this completion routine */
79546 + pReq->pCompletion = HcdIrqEnableComplete;
79547 + }
79548 + /* set the enable bit, in the shadow register */
79549 + pDevice->pHcd->IrqsEnabled |= mask;
79550 + /* make sure control value includes the master enable */
79551 + controlVal = pDevice->pHcd->IrqsEnabled | SDIO_INT_MASTER_ENABLE;
79552 + } else {
79553 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver Masking Int, Mask:0x%X\n", mask));
79554 + /* clear the bit */
79555 + pDevice->pHcd->IrqsEnabled &= ~mask;
79556 + /* check and see if this clears all the bits */
79557 + if (0 == pDevice->pHcd->IrqsEnabled){
79558 + /* if none of the functions are enabled, clear this register */
79559 + controlVal = 0;
79560 + /* disable in host */
79561 + setHcd = TRUE;
79562 + /* use this completion routine */
79563 + pReq->pCompletion = HcdIrqDisableComplete;
79564 + } else {
79565 + /* set control value making sure master enable is left on */
79566 + controlVal = pDevice->pHcd->IrqsEnabled | SDIO_INT_MASTER_ENABLE;
79567 + }
79568 + }
79569 +
79570 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver INT_ENABLE_REG value:0x%X\n", controlVal));
79571 + /* setup bus request to update the mask register */
79572 + SDIO_SET_CMD52_WRITE_ARG(pReq->Argument,0,SDIO_INT_ENABLE_REG,controlVal);
79573 + pReq->Command = CMD52;
79574 + pReq->Flags = SDREQ_FLAGS_TRANS_ASYNC | SDREQ_FLAGS_RESP_SDIO_R5;
79575 +
79576 + if (setHcd) {
79577 + /* make this a barrier request and set context*/
79578 + pReq->Flags |= SDREQ_FLAGS_BARRIER;
79579 + pReq->pCompleteContext = pDevice->pHcd;
79580 + } else {
79581 + /* does not require an update to the HCD */
79582 + pReq->pCompleteContext = (PVOID)(UINT32)controlVal;
79583 + pReq->pCompletion = WriteIntEnableComplete;
79584 + }
79585 +
79586 + } while (FALSE);
79587 +
79588 + status2 = _ReleaseHcdLock(pDevice->pHcd);
79589 +
79590 + if (pReq != NULL) {
79591 + if (SDIO_SUCCESS(status)) {
79592 + /* issue request */
79593 + IssueRequestToHCD(pDevice->pHcd,pReq);
79594 + } else {
79595 + FreeRequest(pReq);
79596 + }
79597 + }
79598 +
79599 + return status;
79600 +}
79601 +
79602 +
79603 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79604 + SDSPIModeEnableDisableCRC - Enable/Disable SPI Mode CRC checking
79605 + Input: pDevice - the device/function
79606 + Enable - Enable CRC
79607 + Output:
79608 + Return: status
79609 + Notes: Note, this function can be called from an ISR or completion context
79610 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
79611 +SDIO_STATUS SDSPIModeEnableDisableCRC(PSDDEVICE pDevice,BOOL Enable)
79612 +{
79613 + SDCONFIG_BUS_MODE_DATA busMode;
79614 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
79615 + UINT32 cmdARG = 0;
79616 +
79617 + if (!SDDEVICE_IS_BUSMODE_SPI(pDevice)) {
79618 + return SDIO_STATUS_INVALID_PARAMETER;
79619 + }
79620 + //??we should make these atomic using a barrier
79621 +
79622 + /* get the current mode and clock */
79623 + busMode.BusModeFlags = pDevice->pHcd->CardProperties.BusMode;
79624 + busMode.ClockRate = pDevice->pHcd->CardProperties.OperBusClock;
79625 +
79626 + if (Enable) {
79627 + /* clear the no-CRC flag */
79628 + busMode.BusModeFlags &= ~SDCONFIG_BUS_MODE_SPI_NO_CRC;
79629 + cmdARG = SD_CMD59_CRC_ON;
79630 + } else {
79631 + busMode.BusModeFlags |= SDCONFIG_BUS_MODE_SPI_NO_CRC;
79632 + cmdARG = SD_CMD59_CRC_OFF;
79633 + }
79634 +
79635 + do {
79636 + /* issue CMD59 to turn on/off CRC */
79637 + status = _IssueSimpleBusRequest(pDevice->pHcd,
79638 + CMD59,
79639 + cmdARG,
79640 + SDREQ_FLAGS_RESP_R1,
79641 + NULL);
79642 + if (!SDIO_SUCCESS(status)) {
79643 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed issue CMD59 (arg=0x%X) Err:%d \n",
79644 + cmdARG, status));
79645 + break;
79646 + }
79647 + if (Enable) {
79648 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: CRC Enabled in SPI mode \n"));
79649 + } else {
79650 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: CRC Disabled in SPI mode \n"));
79651 + }
79652 + status = SetOperationalBusMode(pDevice,&busMode);
79653 + if (!SDIO_SUCCESS(status)) {
79654 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Failed to set SPI NO CRC mode in hcd : Err:%d \n",
79655 + status));
79656 + break;
79657 + }
79658 + } while (FALSE);
79659 +
79660 + return status;
79661 +}
79662 +
79663 +
79664 +static UINT32 ConvertSPIStatusToSDCardStatus(UINT8 SpiR1, UINT8 SpiR2)
79665 +{
79666 + UINT32 cardStatus = 0;
79667 +
79668 + if (SpiR1 != 0) {
79669 + /* convert the error */
79670 + if (SpiR1 & SPI_CS_ERASE_RESET) {
79671 + cardStatus |= SD_CS_ERASE_RESET;
79672 + }
79673 + if (SpiR1 & SPI_CS_ILLEGAL_CMD) {
79674 + cardStatus |= SD_CS_ILLEGAL_CMD_ERR;
79675 + }
79676 + if (SpiR1 & SPI_CS_CMD_CRC_ERR) {
79677 + cardStatus |= SD_CS_PREV_CMD_CRC_ERR;
79678 + }
79679 + if (SpiR1 & SPI_CS_ERASE_SEQ_ERR) {
79680 + cardStatus |= SD_CS_ERASE_SEQ_ERR;
79681 + }
79682 + if (SpiR1 & SPI_CS_ADDRESS_ERR) {
79683 + cardStatus |= SD_CS_ADDRESS_ERR;
79684 + }
79685 + if (SpiR1 & SPI_CS_PARAM_ERR) {
79686 + cardStatus |= SD_CS_CMD_OUT_OF_RANGE;
79687 + }
79688 + }
79689 +
79690 + if (SpiR2 != 0) {
79691 + /* convert the error */
79692 + if (SpiR2 & SPI_CS_CARD_IS_LOCKED) {
79693 + cardStatus |= SD_CS_CARD_LOCKED;
79694 + }
79695 + if (SpiR2 & SPI_CS_LOCK_UNLOCK_FAILED) {
79696 + /* this bit is shared, just set both */
79697 + cardStatus |= (SD_CS_LK_UNLK_FAILED | SD_CS_WP_ERASE_SKIP);
79698 + }
79699 + if (SpiR2 & SPI_CS_ERROR) {
79700 + cardStatus |= SD_CS_GENERAL_ERR;
79701 + }
79702 + if (SpiR2 & SPI_CS_INTERNAL_ERROR) {
79703 + cardStatus |= SD_CS_CARD_INTERNAL_ERR;
79704 + }
79705 + if (SpiR2 & SPI_CS_ECC_FAILED) {
79706 + cardStatus |= SD_CS_ECC_FAILED;
79707 + }
79708 + if (SpiR2 & SPI_CS_WP_VIOLATION) {
79709 + cardStatus |= SD_CS_WP_ERR;
79710 + }
79711 + if (SpiR2 & SPI_CS_ERASE_PARAM_ERR) {
79712 + cardStatus |= SD_CS_ERASE_PARAM_ERR;
79713 + }
79714 + if (SpiR2 & SPI_CS_OUT_OF_RANGE) {
79715 + cardStatus |= SD_CS_CMD_OUT_OF_RANGE;
79716 + }
79717 + }
79718 +
79719 + return cardStatus;
79720 +}
79721 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79722 + ConvertSPI_Response - filter the SPI response and convert it to an SD Response
79723 + Input: pReq - request
79724 + Output: pReq - modified response, if pRespBuffer is not NULL
79725 + pRespBuffer - converted response (optional)
79726 + Return:
79727 + Notes: This function converts a SPI response into an SD response. A caller
79728 + can supply a buffer instead.
79729 + For SPI bus operation the HCD must send the SPI response as
79730 + a stream of bytes, the highest byte contains the first received byte from the
79731 + card. This function only filters simple responses (R1 primarily).
79732 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
79733 +void ConvertSPI_Response(PSDREQUEST pReq, UINT8 *pRespBuffer)
79734 +{
79735 +
79736 + UINT32 cardStatus;
79737 +
79738 + if (pReq->Flags & SDREQ_FLAGS_RESP_SPI_CONVERTED) {
79739 + /* already converted */
79740 + return;
79741 + }
79742 + if (NULL == pRespBuffer) {
79743 + pRespBuffer = pReq->Response;
79744 + }
79745 +
79746 + switch (GET_SDREQ_RESP_TYPE(pReq->Flags)) {
79747 + case SDREQ_FLAGS_RESP_R1:
79748 + case SDREQ_FLAGS_RESP_R1B:
79749 + cardStatus = ConvertSPIStatusToSDCardStatus(GET_SPI_R1_RESP_TOKEN(pReq->Response),
79750 + 0);
79751 + if (CMD55 == pReq->Command) {
79752 + /* we emulate this since SPI does not have such a bit */
79753 + cardStatus |= SD_CS_APP_CMD;
79754 + }
79755 + /* stuff the SD card status */
79756 + SD_R1_SET_CMD_STATUS(pRespBuffer,cardStatus);
79757 + /* stuff the command */
79758 + SD_R1_SET_CMD(pRespBuffer,pReq->Command);
79759 + pReq->Flags |= SDREQ_FLAGS_RESP_SPI_CONVERTED;
79760 + break;
79761 + case SDREQ_FLAGS_RESP_SDIO_R5:
79762 + {
79763 + UINT8 respFlags;
79764 + UINT8 readData;
79765 +
79766 + readData = GET_SPI_SDIO_R5_RESPONSE_RDATA(pReq->Response);
79767 + respFlags = GET_SPI_SDIO_R5_RESP_TOKEN(pReq->Response);
79768 +
79769 + pRespBuffer[SD_R5_RESP_FLAGS_OFFSET] = 0;
79770 + if (respFlags != 0) {
79771 + if (respFlags & SPI_R5_ILLEGAL_CMD) {
79772 + pRespBuffer[SD_R5_RESP_FLAGS_OFFSET] |= SD_R5_ILLEGAL_CMD;
79773 + }
79774 + if (respFlags & SPI_R5_CMD_CRC) {
79775 + pRespBuffer[SD_R5_RESP_FLAGS_OFFSET] |= SD_R5_RESP_CMD_ERR;
79776 + }
79777 + if (respFlags & SPI_R5_FUNC_ERR) {
79778 + pRespBuffer[SD_R5_RESP_FLAGS_OFFSET] |= SD_R5_INVALID_FUNC;
79779 + }
79780 + if (respFlags & SPI_R5_PARAM_ERR) {
79781 + pRespBuffer[SD_R5_RESP_FLAGS_OFFSET] |= SD_R5_ARG_RANGE_ERR;
79782 + }
79783 + }
79784 + /* stuff read data */
79785 + pRespBuffer[SD_SDIO_R5_READ_DATA_OFFSET] = readData;
79786 + /* stuff the command */
79787 + SD_R5_SET_CMD(pRespBuffer,pReq->Command);
79788 + }
79789 + pReq->Flags |= SDREQ_FLAGS_RESP_SPI_CONVERTED;
79790 + break;
79791 + case SDREQ_FLAGS_RESP_R2:
79792 + /* for CMD13 and ACMD13 , SPI uses it's own R2 response format (2 bytes) */
79793 + /* the issue of CMD13 needs to change the response flag to R2 */
79794 + if (CMD13 == pReq->Command) {
79795 + cardStatus = ConvertSPIStatusToSDCardStatus(
79796 + GET_SPI_R2_RESP_TOKEN(pReq->Response),
79797 + GET_SPI_R2_STATUS_TOKEN(pReq->Response));
79798 + /* stuff the SD card status */
79799 + SD_R1_SET_CMD_STATUS(pRespBuffer,cardStatus);
79800 + /* stuff the command */
79801 + SD_R1_SET_CMD(pRespBuffer,pReq->Command);
79802 + pReq->Flags |= SDREQ_FLAGS_RESP_SPI_CONVERTED;
79803 + break;
79804 + }
79805 + /* no other commands should be using R2 when using SPI, if they are
79806 + * they should be bypassing the filter */
79807 + DBG_ASSERT(FALSE);
79808 + break;
79809 + default:
79810 + /* for all others:
79811 + *
79812 + * SDREQ_FLAGS_RESP_R6 - SPI mode does not use RCA
79813 + * SDREQ_FLAGS_RESP_R3 - bus driver handles this internally
79814 + * SDREQ_FLAGS_RESP_SDIO_R4 - bus driver handles this internally
79815 + *
79816 + */
79817 + DBG_PRINT(SDDBG_ERROR, ("ConvertSPI_Response - invalid response type:0x%2.2X",
79818 + GET_SDREQ_RESP_TYPE(pReq->Flags)));
79819 + DBG_ASSERT(FALSE);
79820 + break;
79821 + }
79822 +}
79823 +
79824 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79825 + @function: Check an SD/MMC/SDIO response.
79826 +
79827 + @function name: SDIO_CheckResponse
79828 + @prototype: SDIO_STATUS SDIO_CheckResponse(PSDHCD pHcd, PSDREQUEST pReq, SDHCD_RESPONSE_CHECK_MODE CheckMode)
79829 + @category: HD_Reference
79830 +
79831 + @input: pHcd - the host controller definition structure.
79832 + @input: pReq - request containing the response
79833 + @input: CheckMode - mode
79834 +
79835 + @return: SDIO_STATUS
79836 +
79837 + @notes: Host controller drivers must call into this function to validate various command
79838 + responses before continuing with data transfers or for decoding received SPI tokens.
79839 + The CheckMode option determines the type of validation to perform.
79840 + if (CheckMode == SDHCD_CHECK_DATA_TRANS_OK) :
79841 + The host controller must check the card response to determine whether it
79842 + is safe to perform a data transfer. This API only checks commands that
79843 + involve data transfers and checks various status fields in the command response.
79844 + If the card cannot accept data, this function will return a non-successful status that
79845 + should be treated as a request failure. The host driver should complete the request with the
79846 + returned status. Host controller should only call this function in preparation for a
79847 + data transfer.
79848 + if (CheckMode == SDHCD_CHECK_SPI_TOKEN) :
79849 + This API checks the SPI token and returns a timeout status if the illegal command bit is
79850 + set. This simulates the behavior of SD 1/4 bit operation where illegal commands result in
79851 + a command timeout. A driver that supports SPI mode should pass every response to this
79852 + function to determine the appropriate error status to complete the request with. If the
79853 + API returns success, the response indicates that the card accepted the command.
79854 +
79855 + @example: Checking the response before starting the data transfer :
79856 + if (SDIO_SUCCESS(status) && (pReq->Flags & SDREQ_FLAGS_DATA_TRANS)) {
79857 + // check the response to see if we should continue with data
79858 + status = SDIO_CheckResponse(pHcd, pReq, SDHCD_CHECK_DATA_TRANS_OK);
79859 + if (SDIO_SUCCESS(status)) {
79860 + .... start data transfer phase
79861 + } else {
79862 + ... card response indicates that the card cannot handle data
79863 + // set completion status
79864 + pRequest->Status = status;
79865 + }
79866 + }
79867 +
79868 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
79869 +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
79870 + _SDIO_CheckResponse - check response on behalf of the host controller
79871 + Input: pHcd - host controller
79872 + pReq - request containing the response
79873 + CheckMode - mode
79874 + Output:
79875 + Return: status
79876 + Notes:
79877 +
79878 + CheckMode == SDHCD_CHECK_DATA_TRANS_OK :
79879 + The host controller requests a check on the response to determine whether it
79880 + is okay to perform a data transfer. This function only filters on commands that
79881 + involve data. Host controller should only call this function in preparation for a
79882 + data transfer.
79883 +
79884 + CheckMode == SDHCD_CHECK_SPI_TOKEN :
79885 + The bus driver checks the SPI token and returns a timeout status if the illegal command bit is
79886 + set. This simulates the behavior of SD native operation.
79887 +
79888 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
79889 +SDIO_STATUS _SDIO_CheckResponse(PSDHCD pHcd, PSDREQUEST pReq, SDHCD_RESPONSE_CHECK_MODE CheckMode)
79890 +{
79891 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
79892 +
79893 + if (CheckMode == SDHCD_CHECK_DATA_TRANS_OK) {
79894 + UINT32 cardStatus;
79895 + UINT8 *pResponse;
79896 + UINT8 convertedResponse[MAX_CARD_RESPONSE_BYTES];
79897 +
79898 + if (!(pReq->Flags & SDREQ_FLAGS_DATA_TRANS) ||
79899 + (pReq->Flags & SDREQ_FLAGS_DATA_SKIP_RESP_CHK) ||
79900 + (GET_SDREQ_RESP_TYPE(pReq->Flags) == SDREQ_FLAGS_NO_RESP)) {
79901 + return SDIO_STATUS_SUCCESS;
79902 + }
79903 + pResponse = pReq->Response;
79904 + /* check SPI mode */
79905 + if (IS_HCD_BUS_MODE_SPI(pHcd)) {
79906 + if (!(pReq->Flags & SDREQ_FLAGS_RESP_SKIP_SPI_FILT)) {
79907 + /* apply conversion */
79908 + ConvertSPI_Response(pReq, NULL);
79909 + } else {
79910 + /* temporarily convert the response, without altering the original */
79911 + ConvertSPI_Response(pReq, convertedResponse);
79912 + /* point to the converted one */
79913 + pResponse = convertedResponse;
79914 + }
79915 + }
79916 +
79917 + switch (GET_SDREQ_RESP_TYPE(pReq->Flags)) {
79918 + case SDREQ_FLAGS_RESP_R1:
79919 + case SDREQ_FLAGS_RESP_R1B:
79920 + cardStatus = SD_R1_GET_CARD_STATUS(pResponse);
79921 + if (!(cardStatus &
79922 + (SD_CS_ILLEGAL_CMD_ERR | SD_CS_CARD_INTERNAL_ERR | SD_CS_GENERAL_ERR))) {
79923 + /* okay for data */
79924 + break;
79925 + }
79926 + /* figure out what it was */
79927 + if (cardStatus & SD_CS_ILLEGAL_CMD_ERR) {
79928 + status = SDIO_STATUS_DATA_STATE_INVALID;
79929 + } else {
79930 + status = SDIO_STATUS_DATA_ERROR_UNKNOWN;
79931 + }
79932 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Check Response Error. R1 CardStatus:0x%X \n",
79933 + cardStatus));
79934 + break;
79935 + case SDREQ_FLAGS_RESP_SDIO_R5:
79936 + cardStatus = SD_R5_GET_RESP_FLAGS(pResponse);
79937 + if (!(cardStatus & SD_R5_CURRENT_CMD_ERRORS)){
79938 + /* all okay */
79939 + break;
79940 + }
79941 +
79942 + status = ConvertCMD52ResponseToSDIOStatus((UINT8)cardStatus);
79943 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: Check Response Error. R5 CardStatus:0x%X \n",
79944 + cardStatus));
79945 + break;
79946 + default:
79947 + break;
79948 + }
79949 +
79950 + return status;
79951 + }
79952 +
79953 + {
79954 + UINT8 spiToken;
79955 +
79956 + /* handle SPI token validation */
79957 + switch (GET_SDREQ_RESP_TYPE(pReq->Flags)) {
79958 + case SDREQ_FLAGS_RESP_R2:
79959 + spiToken = GET_SPI_R2_RESP_TOKEN(pReq->Response);
79960 + break;
79961 + case SDREQ_FLAGS_RESP_SDIO_R5:
79962 + spiToken = GET_SPI_SDIO_R5_RESP_TOKEN(pReq->Response);
79963 + break;
79964 + case SDREQ_FLAGS_RESP_R3:
79965 + spiToken = GET_SPI_R3_RESP_TOKEN(pReq->Response);
79966 + break;
79967 + case SDREQ_FLAGS_RESP_SDIO_R4:
79968 + spiToken = GET_SPI_SDIO_R4_RESP_TOKEN(pReq->Response);
79969 + break;
79970 + default:
79971 + /* all other tokesn are SPI R1 type */
79972 + spiToken = GET_SPI_R1_RESP_TOKEN(pReq->Response);
79973 + break;
79974 + }
79975 +
79976 + if ((GET_SDREQ_RESP_TYPE(pReq->Flags) == SDREQ_FLAGS_RESP_SDIO_R5) ||
79977 + (GET_SDREQ_RESP_TYPE(pReq->Flags) == SDREQ_FLAGS_RESP_SDIO_R4)) {
79978 + /* handle SDIO status tokens */
79979 + if ((spiToken & SPI_R5_ILLEGAL_CMD) ||
79980 + (spiToken & SPI_R5_CMD_CRC)) {
79981 + status = SDIO_STATUS_BUS_RESP_TIMEOUT;
79982 + }
79983 + } else {
79984 + /* handle all other status tokens */
79985 + if ((spiToken & SPI_CS_ILLEGAL_CMD) ||
79986 + (spiToken & SPI_CS_CMD_CRC_ERR)) {
79987 + status = SDIO_STATUS_BUS_RESP_TIMEOUT;
79988 + }
79989 + }
79990 + }
79991 +
79992 + return status;
79993 +}
79994 +
79995 Index: linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_bus_os.c
79996 ===================================================================
79997 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
79998 +++ linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_bus_os.c 2008-12-11 22:46:49.000000000 +0100
79999 @@ -0,0 +1,832 @@
80000 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
80001 +@file: sdio_bus_os.c
80002 +
80003 +@abstract: Linux implementation module
80004 +
80005 +#notes: includes module load and unload functions
80006 +
80007 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
80008 +
80009 +
80010 + *
80011 + * This program is free software; you can redistribute it and/or modify
80012 + * it under the terms of the GNU General Public License version 2 as
80013 + * published by the Free Software Foundation;
80014 + *
80015 + * Software distributed under the License is distributed on an "AS
80016 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
80017 + * implied. See the License for the specific language governing
80018 + * rights and limitations under the License.
80019 + *
80020 + * Portions of this code were developed with information supplied from the
80021 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
80022 + *
80023 + * The following conditions apply to the release of the SD simplified specification (�Simplified
80024 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
80025 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
80026 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
80027 + * Specification may require a license from the SD Card Association or other third parties.
80028 + * Disclaimers:
80029 + * The information contained in the Simplified Specification is presented only as a standard
80030 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
80031 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
80032 + * any damages, any infringements of patents or other right of the SD Card Association or any third
80033 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
80034 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
80035 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
80036 + * information, know-how or other confidential information to any third party.
80037 + *
80038 + *
80039 + * The initial developers of the original code are Seung Yi and Paul Lever
80040 + *
80041 + * sdio@atheros.com
80042 + *
80043 + *
80044 +
80045 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
80046 +/* debug level for this module*/
80047 +#define DBG_DECLARE 3;
80048 +
80049 +#include <linux/sdio/ctsystem.h>
80050 +#include <linux/kernel.h>
80051 +#include <linux/module.h>
80052 +#include <linux/version.h>
80053 +#include <linux/init.h>
80054 +#include <linux/workqueue.h>
80055 +#include <linux/delay.h>
80056 +#include <linux/kthread.h>
80057 +#include <linux/pnp.h>
80058 +void pnp_remove_card_device(struct pnp_dev *dev);
80059 +#include <linux/sdio/sdio_busdriver.h>
80060 +#include <linux/sdio/sdio_lib.h>
80061 +#include "_busdriver.h"
80062 +
80063 +#define DESCRIPTION "SDIO Bus Driver"
80064 +#define AUTHOR "Atheros Communications, Inc."
80065 +
80066 +/* debug print parameter */
80067 +/* configuration and default parameters */
80068 +static int RequestRetries = SDMMC_DEFAULT_CMD_RETRIES;
80069 +module_param(RequestRetries, int, 0644);
80070 +MODULE_PARM_DESC(RequestRetries, "number of command retries");
80071 +static int CardReadyPollingRetry = SDMMC_DEFAULT_CARD_READY_RETRIES;
80072 +module_param(CardReadyPollingRetry, int, 0644);
80073 +MODULE_PARM_DESC(CardReadyPollingRetry, "number of card ready retries");
80074 +static int PowerSettleDelay = SDMMC_POWER_SETTLE_DELAY;
80075 +module_param(PowerSettleDelay, int, 0644);
80076 +MODULE_PARM_DESC(PowerSettleDelay, "delay in ms for power to settle after power changes");
80077 +static int DefaultOperClock = 52000000;
80078 +module_param(DefaultOperClock, int, 0644);
80079 +MODULE_PARM_DESC(DefaultOperClock, "maximum operational clock limit");
80080 +static int DefaultBusMode = SDCONFIG_BUS_WIDTH_4_BIT;
80081 +module_param(DefaultBusMode, int, 0644);
80082 +MODULE_PARM_DESC(DefaultBusMode, "default bus mode: see SDCONFIG_BUS_WIDTH_xxx");
80083 +static int RequestListSize = SDBUS_DEFAULT_REQ_LIST_SIZE;
80084 +module_param(RequestListSize, int, 0644);
80085 +MODULE_PARM_DESC(RequestListSize, "");
80086 +static int SignalSemListSize = SDBUS_DEFAULT_REQ_SIG_SIZE;
80087 +module_param(SignalSemListSize, int, 0644);
80088 +MODULE_PARM_DESC(SignalSemListSize, "");
80089 +static int CDPollingInterval = SDBUS_DEFAULT_CD_POLLING_INTERVAL;
80090 +module_param(CDPollingInterval, int, 0644);
80091 +MODULE_PARM_DESC(CDPollingInterval, "");
80092 +static int DefaultOperBlockLen = SDMMC_DEFAULT_BYTES_PER_BLOCK;
80093 +module_param(DefaultOperBlockLen, int, 0644);
80094 +MODULE_PARM_DESC(DefaultOperBlockLen, "operational block length");
80095 +static int DefaultOperBlockCount = SDMMC_DEFAULT_BLOCKS_PER_TRANS;
80096 +module_param(DefaultOperBlockCount, int, 0644);
80097 +MODULE_PARM_DESC(DefaultOperBlockCount, "operational block count");
80098 +static int ConfigFlags = BD_DEFAULT_CONFIG_FLAGS;
80099 +module_param(ConfigFlags, int, 0644);
80100 +MODULE_PARM_DESC(ConfigFlags, "config flags");
80101 +
80102 +static int HcdRCount = MAX_HCD_REQ_RECURSION;
80103 +module_param(HcdRCount, int, 0644);
80104 +MODULE_PARM_DESC(HcdRCount, "HCD request recursion count");
80105 +
80106 +static void CardDetect_WorkItem(
80107 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
80108 +void *context);
80109 +#else
80110 +struct work_struct *ignored);
80111 +#endif
80112 +static void CardDetect_TimerFunc(unsigned long Context);
80113 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
80114 +static DECLARE_WORK(CardDetectPollWork, CardDetect_WorkItem
80115 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
80116 +, 0);
80117 +#else
80118 +);
80119 +#endif
80120 +#endif
80121 +static int RegisterDriver(PSDFUNCTION pFunction);
80122 +static int UnregisterDriver(PSDFUNCTION pFunction);
80123 +
80124 +static struct timer_list CardDetectTimer;
80125 +
80126 +#define SDDEVICE_FROM_OSDEVICE(pOSDevice) container_of(pOSDevice, SDDEVICE, Device)
80127 +#define SDFUNCTION_FROM_OSDRIVER(pOSDriver) container_of(pOSDriver, SDFUNCTION, Driver)
80128 +
80129 +
80130 +/*
80131 + * SDIO_RegisterHostController - register a host controller bus driver
80132 +*/
80133 +SDIO_STATUS SDIO_RegisterHostController(PSDHCD pHcd) {
80134 + /* we are the exported verison, call the internal verison */
80135 + return _SDIO_RegisterHostController(pHcd);
80136 +}
80137 +
80138 +/*
80139 + * SDIO_UnregisterHostController - unregister a host controller bus driver
80140 +*/
80141 +SDIO_STATUS SDIO_UnregisterHostController(PSDHCD pHcd) {
80142 + /* we are the exported verison, call the internal verison */
80143 + return _SDIO_UnregisterHostController(pHcd);
80144 +}
80145 +
80146 +/*
80147 + * SDIO_RegisterFunction - register a function driver
80148 +*/
80149 +SDIO_STATUS SDIO_RegisterFunction(PSDFUNCTION pFunction) {
80150 + int error;
80151 + SDIO_STATUS status;
80152 +
80153 + DBG_PRINT(SDDBG_TRACE, ("SDIO BusDriver - SDIO_RegisterFunction\n"));
80154 +
80155 + /* since we do PnP registration first, we need to check the version */
80156 + if (!CHECK_FUNCTION_DRIVER_VERSION(pFunction)) {
80157 + DBG_PRINT(SDDBG_ERROR,
80158 + ("SDIO Bus Driver: Function Major Version Mismatch (hcd = %d, bus driver = %d)\n",
80159 + GET_SDIO_STACK_VERSION_MAJOR(pFunction), CT_SDIO_STACK_VERSION_MAJOR(g_Version)));
80160 + return SDIO_STATUS_INVALID_PARAMETER;
80161 + }
80162 +
80163 + /* we are the exported verison, call the internal verison after registering with the bus
80164 + we handle probes internally to the bus driver */
80165 + if ((error = RegisterDriver(pFunction)) < 0) {
80166 + DBG_PRINT(SDDBG_ERROR,
80167 + ("SDIO BusDriver - SDIO_RegisterFunction, failed to register with system bus driver: %d\n",
80168 + error));
80169 + status = OSErrorToSDIOError(error);
80170 + } else {
80171 + status = _SDIO_RegisterFunction(pFunction);
80172 + if (!SDIO_SUCCESS(status)) {
80173 + UnregisterDriver(pFunction);
80174 + }
80175 + }
80176 +
80177 + return status;
80178 +}
80179 +
80180 +/*
80181 + * SDIO_UnregisterFunction - unregister a function driver
80182 +*/
80183 +SDIO_STATUS SDIO_UnregisterFunction(PSDFUNCTION pFunction) {
80184 + SDIO_STATUS status;
80185 + /* we are the exported verison, call the internal verison */
80186 + status = _SDIO_UnregisterFunction(pFunction);
80187 + UnregisterDriver(pFunction);
80188 + return status;
80189 +}
80190 +
80191 +/*
80192 + * SDIO_HandleHcdEvent - tell core an event occurred
80193 +*/
80194 +SDIO_STATUS SDIO_HandleHcdEvent(PSDHCD pHcd, HCD_EVENT Event) {
80195 + /* we are the exported verison, call the internal verison */
80196 + DBG_PRINT(SDIODBG_HCD_EVENTS, ("SDIO Bus Driver: SDIO_HandleHcdEvent, event type 0x%X, HCD:0x%X\n",
80197 + Event, (UINT)pHcd));
80198 + return _SDIO_HandleHcdEvent(pHcd, Event);
80199 +}
80200 +
80201 +/* get default settings */
80202 +SDIO_STATUS _SDIO_BusGetDefaultSettings(PBDCONTEXT pBdc)
80203 +{
80204 + /* these defaults are module params */
80205 + pBdc->RequestRetries = RequestRetries;
80206 + pBdc->CardReadyPollingRetry = CardReadyPollingRetry;
80207 + pBdc->PowerSettleDelay = PowerSettleDelay;
80208 + pBdc->DefaultOperClock = DefaultOperClock;
80209 + pBdc->DefaultBusMode = DefaultBusMode;
80210 + pBdc->RequestListSize = RequestListSize;
80211 + pBdc->SignalSemListSize = SignalSemListSize;
80212 + pBdc->CDPollingInterval = CDPollingInterval;
80213 + pBdc->DefaultOperBlockLen = DefaultOperBlockLen;
80214 + pBdc->DefaultOperBlockCount = DefaultOperBlockCount;
80215 + pBdc->ConfigFlags = ConfigFlags;
80216 + pBdc->MaxHcdRecursion = HcdRCount;
80217 + return SDIO_STATUS_SUCCESS;
80218 +}
80219 +
80220 +static void CardDetect_TimerFunc(unsigned long Context)
80221 +{
80222 + DBG_PRINT(SDIODBG_CD_TIMER, ("+ SDIO BusDriver Card Detect Timer\n"));
80223 +
80224 + /* timers run in an ISR context and cannot block or sleep, so we need
80225 + * to queue a work item to call the bus driver timer notification */
80226 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
80227 + if (schedule_work(&CardDetectPollWork) <= 0) {
80228 + DBG_PRINT(SDDBG_ERROR, ("Failed to queue Card Detect timer!\n"));
80229 + }
80230 +#else
80231 + CardDetect_WorkItem(NULL);
80232 +#endif
80233 + DBG_PRINT(SDIODBG_CD_TIMER, ("- SDIO BusDriver Card Detect Timer\n"));
80234 +}
80235 +
80236 +/*
80237 + * Initialize any timers we are using
80238 +*/
80239 +SDIO_STATUS InitializeTimers(void)
80240 +{
80241 + init_timer(&CardDetectTimer);
80242 + CardDetectTimer.function = CardDetect_TimerFunc;
80243 + CardDetectTimer.data = 0;
80244 + return SDIO_STATUS_SUCCESS;
80245 +}
80246 +
80247 +/*
80248 + * cleanup timers
80249 +*/
80250 +SDIO_STATUS CleanupTimers(void)
80251 +{
80252 + del_timer(&CardDetectTimer);
80253 + return SDIO_STATUS_SUCCESS;
80254 +}
80255 +
80256 +
80257 +/*
80258 + * Queue a timer, Timeout is in milliseconds
80259 +*/
80260 +SDIO_STATUS QueueTimer(INT TimerID, UINT32 TimeOut)
80261 +{
80262 + UINT32 delta;
80263 +
80264 + /* convert timeout to ticks */
80265 + delta = (TimeOut * HZ)/1000;
80266 + if (delta == 0) {
80267 + delta = 1;
80268 + }
80269 + DBG_PRINT(SDIODBG_CD_TIMER, ("SDIO BusDriver - SDIO_QueueTimer System Ticks Per Sec:%d \n",HZ));
80270 + DBG_PRINT(SDIODBG_CD_TIMER, ("SDIO BusDriver - SDIO_QueueTimer TimerID: %d TimeOut:%d MS, requires %d Ticks\n",
80271 + TimerID,TimeOut,delta));
80272 + switch (TimerID) {
80273 + case SDIOBUS_CD_TIMER_ID:
80274 + CardDetectTimer.expires = jiffies + delta;
80275 + add_timer(&CardDetectTimer);
80276 + break;
80277 + default:
80278 + return SDIO_STATUS_INVALID_PARAMETER;
80279 + }
80280 +
80281 + return SDIO_STATUS_SUCCESS;
80282 +}
80283 +
80284 +/* check a response on behalf of the host controller, to allow it to proceed with a
80285 + * data transfer */
80286 +SDIO_STATUS SDIO_CheckResponse(PSDHCD pHcd, PSDREQUEST pReq, SDHCD_RESPONSE_CHECK_MODE CheckMode)
80287 +{
80288 + return _SDIO_CheckResponse(pHcd,pReq,CheckMode);
80289 +}
80290 +
80291 +/*
80292 + * CardDetect_WorkItem - the work item for handling card detect polling interrupt
80293 +*/
80294 +static void CardDetect_WorkItem(
80295 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
80296 +void *context)
80297 +#else
80298 +struct work_struct *ignored)
80299 +#endif
80300 +{
80301 + /* call bus driver function */
80302 + SDIO_NotifyTimerTriggered(SDIOBUS_CD_TIMER_ID);
80303 +}
80304 +
80305 +/*
80306 + * OS_IncHcdReference - increment host controller driver reference count
80307 +*/
80308 +SDIO_STATUS Do_OS_IncHcdReference(PSDHCD pHcd)
80309 +{
80310 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
80311 +
80312 + do {
80313 + if (NULL == pHcd->pModule) {
80314 + /* hcds that are 2.3 or higher should set this */
80315 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: HCD:%s should set module ptr!\n",
80316 + (pHcd->pName != NULL) ? pHcd->pName : "Unknown"));
80317 + break;
80318 + }
80319 +
80320 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
80321 + if (!try_module_get(pHcd->pModule)) {
80322 + status = SDIO_STATUS_ERROR;
80323 + }
80324 +#else
80325 + if (!try_inc_mod_count(pHcd->pModule)) {
80326 + status = SDIO_STATUS_ERROR;
80327 + }
80328 +#endif
80329 +
80330 + } while (FALSE);
80331 +
80332 + if (!SDIO_SUCCESS(status)) {
80333 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: HCD:%s failed to get module\n",
80334 + (pHcd->pName != NULL) ? pHcd->pName : "Unknown"));
80335 + }
80336 +
80337 + return status;
80338 +}
80339 +
80340 +/*
80341 + * OS_DecHcdReference - decrement host controller driver reference count
80342 +*/
80343 +SDIO_STATUS Do_OS_DecHcdReference(PSDHCD pHcd)
80344 +{
80345 + if (pHcd->pModule != NULL) {
80346 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
80347 + module_put(pHcd->pModule);
80348 +#else
80349 + /* 2.4 or lower */
80350 + __MOD_DEC_USE_COUNT(pHcd->pModule);
80351 +#endif
80352 + }
80353 + return SDIO_STATUS_SUCCESS;
80354 +}
80355 +
80356 +/****************************************************************************************/
80357 +
80358 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
80359 +#include <linux/pnp.h>
80360 +
80361 +#if !defined(CONFIG_PNP)
80362 +#error "CONFIG_PNP not defined"
80363 +#endif
80364 +
80365 +static ULONG InUseDevices = 0;
80366 +static spinlock_t InUseDevicesLock = SPIN_LOCK_UNLOCKED;
80367 +
80368 +static const struct pnp_device_id pnp_idtable[] = {
80369 + {"SD_XXXX", 0}
80370 +};
80371 +static int sdio_get_resources(struct pnp_dev * pDev, struct pnp_resource_table * res)
80372 +{
80373 + DBG_PRINT(SDDBG_TRACE,
80374 + ("SDIO BusDriver - sdio_get_resources: %s\n",
80375 + pDev->dev.bus_id));
80376 + return 0;
80377 +}
80378 +static int sdio_set_resources(struct pnp_dev * pDev, struct pnp_resource_table * res)
80379 +{
80380 + DBG_PRINT(SDDBG_TRACE,
80381 + ("SDIO BusDriver - sdio_set_resources: %s\n",
80382 + pDev->dev.bus_id));
80383 + return 0;
80384 +}
80385 +
80386 +static int sdio_disable_resources(struct pnp_dev *pDev)
80387 +{
80388 + DBG_PRINT(SDDBG_TRACE,
80389 + ("SDIO BusDriver - sdio_disable_resources: %s\n",
80390 + pDev->dev.bus_id));
80391 + if (pDev != NULL) {
80392 + pDev->active = 0;
80393 + }
80394 + return 0;
80395 +}
80396 +void release(struct device * pDev) {
80397 + DBG_PRINT(SDDBG_TRACE,
80398 + ("SDIO BusDriver - release: %s\n",
80399 + pDev->bus_id));
80400 + return;
80401 +}
80402 +struct pnp_protocol sdio_protocol = {
80403 + .name = "SDIO",
80404 + .get = sdio_get_resources,
80405 + .set = sdio_set_resources,
80406 + .disable = sdio_disable_resources,
80407 + .dev.release = release,
80408 +};
80409 +
80410 +/*
80411 + * driver_probe - probe for OS based driver
80412 +*/
80413 +static int driver_probe(struct pnp_dev* pOSDevice, const struct pnp_device_id *pId)
80414 +{
80415 + PSDDEVICE pDevice = SDDEVICE_FROM_OSDEVICE(pOSDevice);
80416 + PSDFUNCTION pFunction = pDevice->Device.dev.driver_data;
80417 +
80418 + if (pFunction == NULL) {
80419 + return -1;
80420 + }
80421 +
80422 + if (strcmp(pFunction->pName, pOSDevice->dev.driver->name) == 0) {
80423 + DBG_PRINT(SDDBG_TRACE,
80424 + ("SDIO BusDriver - driver_probe, match: %s/%s driver: %s\n",
80425 + pOSDevice->dev.bus_id, pFunction->pName, pOSDevice->dev.driver->name));
80426 + return 1;
80427 + } else {
80428 + DBG_PRINT(SDDBG_TRACE,
80429 + ("SDIO BusDriver - driver_probe, no match: %s/%s driver: %s\n",
80430 + pOSDevice->dev.bus_id, pFunction->pName, pOSDevice->dev.driver->name));
80431 + return -1;
80432 + }
80433 +/* if (pOSDevice->id != NULL) {
80434 + if (strcmp(pOSDevice->id->id, pId->id) == 0) {
80435 + DBG_PRINT(SDDBG_TRACE,
80436 + ("SDIO BusDriver - driver_probe, match: %s/%s\n",
80437 + pOSDevice->dev.bus_id, pId->id));
80438 + return 1;
80439 + }
80440 + DBG_PRINT(SDDBG_TRACE,
80441 + ("SDIO BusDriver - driver_probe, did not match: %s/%s/%s\n",
80442 + pOSDevice->dev.bus_id, pId->id, pOSDevice->id->id));
80443 + } else {
80444 + DBG_PRINT(SDDBG_TRACE,
80445 + ("SDIO BusDriver - driver_probe, did not match: %s/%s\n",
80446 + pOSDevice->dev.bus_id, pId->id));
80447 + }
80448 + return -1;
80449 +*/
80450 +//?? if (pDevice->Device.dev.driver_data != NULL) {
80451 +//?? if (pDevice->Device.dev.driver_data == pFunction) {
80452 +//?? if (pDevice->Device.data != NULL) {
80453 +//?? if (pDevice->Device.data == pFunction) {
80454 +//?? DBG_PRINT(SDDBG_TRACE,
80455 +//?? ("SDIO BusDriver - driver_probe, match: %s\n",
80456 +//?? pOSDevice->dev.bus_id));
80457 +//?? return 1;
80458 +//?? }
80459 +//?? }
80460 + DBG_PRINT(SDDBG_TRACE,
80461 + ("SDIO BusDriver - driver_probe, match: %s\n",
80462 + pOSDevice->dev.bus_id));
80463 + return 1;
80464 +}
80465 +
80466 +static int RegisterDriver(PSDFUNCTION pFunction)
80467 +{
80468 + memset(&pFunction->Driver, 0, sizeof(pFunction->Driver));
80469 + pFunction->Driver.name = pFunction->pName;
80470 + pFunction->Driver.probe = driver_probe;
80471 + pFunction->Driver.id_table = pnp_idtable;
80472 + pFunction->Driver.flags = PNP_DRIVER_RES_DO_NOT_CHANGE;
80473 +
80474 + DBG_PRINT(SDDBG_TRACE,
80475 + ("SDIO BusDriver - SDIO_RegisterFunction, registering driver: %s\n",
80476 + pFunction->Driver.name));
80477 + return pnp_register_driver(&pFunction->Driver);
80478 +}
80479 +
80480 +static int UnregisterDriver(PSDFUNCTION pFunction)
80481 +{
80482 + DBG_PRINT(SDDBG_TRACE,
80483 + ("+SDIO BusDriver - UnregisterDriver, driver: %s\n",
80484 + pFunction->Driver.name));
80485 + pnp_unregister_driver(&pFunction->Driver);
80486 + DBG_PRINT(SDDBG_TRACE,
80487 + ("-SDIO BusDriver - UnregisterDriver\n"));
80488 + return 0;
80489 +}
80490 +
80491 +/*
80492 + * OS_InitializeDevice - initialize device that will be registered
80493 +*/
80494 +SDIO_STATUS OS_InitializeDevice(PSDDEVICE pDevice, PSDFUNCTION pFunction)
80495 +{
80496 + struct pnp_id *pFdname;
80497 + memset(&pDevice->Device, 0, sizeof(pDevice->Device));
80498 + pDevice->Device.dev.driver_data = (PVOID)pFunction;
80499 +//?? pDevice->Device.data = (PVOID)pFunction;
80500 +//?? pDevice->Device.dev.driver = &pFunction->Driver.driver;
80501 +//?? pDevice->Device.driver = &pFunction->Driver;
80502 +//?? pDevice->Device.dev.release = release;
80503 + /* get a unique device number, must be done with locks held */
80504 + spin_lock(&InUseDevicesLock);
80505 + pDevice->Device.number = FirstClearBit(&InUseDevices);
80506 + SetBit(&InUseDevices, pDevice->Device.number);
80507 + spin_unlock(&InUseDevicesLock);
80508 + pDevice->Device.capabilities = PNP_REMOVABLE | PNP_DISABLE;
80509 + pDevice->Device.protocol = &sdio_protocol;
80510 + pDevice->Device.active = 1;
80511 +
80512 + pnp_init_resource_table(&pDevice->Device.res);
80513 +
80514 + pFdname = KernelAlloc(sizeof(struct pnp_id));
80515 +
80516 + if (NULL == pFdname) {
80517 + return SDIO_STATUS_NO_RESOURCES;
80518 + }
80519 + /* set the id as slot number/function number */
80520 + snprintf(pFdname->id, sizeof(pFdname->id), "SD_%02X%02X",
80521 + pDevice->pHcd->SlotNumber, (UINT)SDDEVICE_GET_SDIO_FUNCNO(pDevice));
80522 + pFdname->next = NULL;
80523 + DBG_PRINT(SDDBG_TRACE, ("SDIO BusDriver - OS_InitializeDevice adding id: %s\n",
80524 + pFdname->id));
80525 + pnp_add_id(pFdname, &pDevice->Device);
80526 +
80527 + /* deal with DMA settings */
80528 + if (pDevice->pHcd->pDmaDescription != NULL) {
80529 + pDevice->Device.dev.dma_mask = &pDevice->pHcd->pDmaDescription->Mask;
80530 + pDevice->Device.dev.coherent_dma_mask = pDevice->pHcd->pDmaDescription->Mask;
80531 + }
80532 +
80533 + return SDIO_STATUS_SUCCESS;
80534 +}
80535 +
80536 +/*
80537 + * OS_AddDevice - must be pre-initialized with OS_InitializeDevice
80538 +*/
80539 +SDIO_STATUS OS_AddDevice(PSDDEVICE pDevice, PSDFUNCTION pFunction)
80540 +{
80541 + int error;
80542 + DBG_PRINT(SDDBG_TRACE, ("SDIO BusDriver - OS_AddDevice adding function: %s\n",
80543 + pFunction->pName));
80544 + error = pnp_add_device(&pDevice->Device);
80545 + if (error < 0) {
80546 + DBG_PRINT(SDDBG_ERROR, ("SDIO BusDriver - OS_AddDevice failed pnp_add_device: %d\n",
80547 + error));
80548 + }
80549 + /* replace the buggy pnp's release */
80550 + pDevice->Device.dev.release = release;
80551 +
80552 + return OSErrorToSDIOError(error);
80553 +}
80554 +
80555 +/*
80556 + * OS_RemoveDevice - unregister device with driver and bus
80557 +*/
80558 +void OS_RemoveDevice(PSDDEVICE pDevice)
80559 +{
80560 + DBG_PRINT(SDDBG_TRACE, ("SDIO BusDriver - OS_RemoveDevice \n"));
80561 + pnp_remove_card_device(&pDevice->Device);
80562 + spin_lock(&InUseDevicesLock);
80563 + ClearBit(&InUseDevices, pDevice->Device.number);
80564 + spin_unlock(&InUseDevicesLock);
80565 +
80566 + if (pDevice->Device.id != NULL) {
80567 + KernelFree(pDevice->Device.id);
80568 + pDevice->Device.id = NULL;
80569 + }
80570 +}
80571 +
80572 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
80573 + @function: Add OS device to bus driver.
80574 +
80575 + @function name: SDIO_BusAddOSDevice
80576 + @category: HD_Reference
80577 +
80578 + @output: pDma - descrip[tion of support DMA or NULL
80579 + @output: pDriver - assigned driver object
80580 + @output: pDevice - assigned device object
80581 +
80582 + @return: SDIO_STATUS - SDIO_STATUS_SUCCESS when successful.
80583 +
80584 + @notes: If the HCD does not register with the driver sub-system directly (like in the PCI case),
80585 + then it should register with the bus driver to obtain OS dependent device objects.
80586 + All input structures should be maintained throughout the life of the driver.
80587 +
80588 + @example: getting device objects:
80589 + typedef struct _SDHCD_DRIVER {
80590 + OS_PNPDEVICE HcdDevice; / * the OS device for this HCD * /
80591 + OS_PNPDRIVER HcdDriver; / * the OS driver for this HCD * /
80592 + SDDMA_DESCRIPTION Dma; / * driver DMA description * /
80593 + }SDHCD_DRIVER, *PSDHCD_DRIVER;
80594 +
80595 + typedef struct _SDHCD_DRIVER_CONTEXT {
80596 + PTEXT pDescription; / * human readable device decsription * /
80597 + SDLIST DeviceList; / * the list of current devices handled by this driver * /
80598 + OS_SEMAPHORE DeviceListSem; / * protection for the DeviceList * /
80599 + UINT DeviceCount; / * number of devices currently installed * /
80600 + SDHCD_DRIVER Driver; / * OS dependent driver specific info * /
80601 + }SDHCD_DRIVER_CONTEXT, *PSDHCD_DRIVER_CONTEXT;
80602 +
80603 + static SDHCD_DRIVER_CONTEXT HcdContext = {
80604 + .pDescription = DESCRIPTION,
80605 + .DeviceCount = 0,
80606 + .Driver.HcdDevice.name = "sdio_xxx_hcd",
80607 + .Driver.HcdDriver.name = "sdio_xxx_hcd",
80608 + }
80609 + .....
80610 + status = SDIO_BusAddOSDevice(NULL, &HcdContext.Driver, &HcdContext.Device);
80611 + if (SDIO_SUCCESS(status) {
80612 + return Probe(&HcdContext.Device);
80613 + }
80614 + return SDIOErrorToOSError(status);
80615 +
80616 + @see also: SDIO_BusRemoveOSDevice
80617 +
80618 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
80619 +SDIO_STATUS SDIO_BusAddOSDevice(PSDDMA_DESCRIPTION pDma, POS_PNPDRIVER pDriver, POS_PNPDEVICE pDevice)
80620 +{
80621 + int err;
80622 + struct pnp_id *pFdname;
80623 + struct pnp_device_id *pFdid;
80624 + static int slotNumber = 0; /* we just use an increasing count for the slots number */
80625 +
80626 + if (pDma != NULL) {
80627 + pDevice->dev.dma_mask = &pDma->Mask;
80628 + pDevice->dev.coherent_dma_mask = pDma->Mask;
80629 + }
80630 + DBG_PRINT(SDDBG_ERROR,
80631 + ("SDIO BusDriver - SDIO_GetBusOSDevice, registering driver: %s DMAmask: 0x%x\n",
80632 + pDriver->name, (UINT)*pDevice->dev.dma_mask));
80633 + pFdid = KernelAlloc(sizeof(struct pnp_device_id)*2);
80634 + /* set the id as slot number/function number */
80635 + snprintf(pFdid[0].id, sizeof(pFdid[0].id), "SD_%02X08",
80636 + slotNumber++);
80637 + pFdid[0].driver_data = 0;
80638 + pFdid[1].id[0] = '\0';
80639 + pFdid[1].driver_data = 0;
80640 +
80641 + pDriver->id_table = pFdid;
80642 + pDriver->flags = PNP_DRIVER_RES_DO_NOT_CHANGE;
80643 + err = pnp_register_driver(pDriver);
80644 + if (err < 0) {
80645 + DBG_PRINT(SDDBG_ERROR,
80646 + ("SDIO BusDriver - SDIO_GetBusOSDevice, failed registering driver: %s, err: %d\n",
80647 + pDriver->name, err));
80648 + return OSErrorToSDIOError(err);
80649 + }
80650 +
80651 + pDevice->protocol = &sdio_protocol;
80652 + pDevice->capabilities = PNP_REMOVABLE | PNP_DISABLE;
80653 + pDevice->active = 1;
80654 +
80655 + pFdname = KernelAlloc(sizeof(struct pnp_id));
80656 + /* set the id as slot number/function number */
80657 + snprintf(pFdname->id, sizeof(pFdname->id), "SD_%02X08",
80658 + 0); //??pDevice->pHcd->SlotNumber);//?????fix this, slotnumber isn't vaialble yet
80659 + pFdname->next = NULL;
80660 + pnp_add_id(pFdname, pDevice);
80661 +
80662 + /* get a unique device number */
80663 + spin_lock(&InUseDevicesLock);
80664 + pDevice->number = FirstClearBit(&InUseDevices);
80665 + SetBit(&InUseDevices, pDevice->number);
80666 + spin_unlock(&InUseDevicesLock);
80667 + pnp_init_resource_table(&pDevice->res);
80668 + err = pnp_add_device(pDevice);
80669 + if (err < 0) {
80670 + DBG_PRINT(SDDBG_ERROR, ("SDIO BusDriver - SDIO_GetBusOSDevice failed pnp_device_add: %d\n",
80671 + err));
80672 + pnp_unregister_driver(pDriver);
80673 + }
80674 + /* replace the buggy pnp's release */
80675 + pDevice->dev.release = release;
80676 + return OSErrorToSDIOError(err);
80677 +}
80678 +
80679 +/**+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
80680 + @function: Return OS device from bus driver.
80681 +
80682 + @function name: SDIO_BusRemoveOSDevice
80683 + @category: HD_Reference
80684 +
80685 + @input: pDriver - setup PNP driver object
80686 + @input: pDevice - setup PNP device object
80687 +
80688 + @return: none
80689 +
80690 +
80691 + @example: returning device objects:
80692 + SDIO_BusRemoveOSDevice(&HcdContext.Driver, &HcdContext.Device);
80693 +
80694 +
80695 + @see also: SDIO_BusAddOSDevice
80696 +
80697 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
80698 +void SDIO_BusRemoveOSDevice(POS_PNPDRIVER pDriver, POS_PNPDEVICE pDevice)
80699 +{
80700 + DBG_PRINT(SDDBG_ERROR,
80701 + ("SDIO BusDriver - SDIO_PutBusOSDevice, unregistering driver: %s\n",
80702 + pDriver->name));
80703 +
80704 + pnp_remove_card_device(pDevice);
80705 + if (pDevice->id != NULL) {
80706 + KernelFree(pDevice->id);
80707 + pDevice->id = NULL;
80708 + }
80709 +
80710 + spin_lock(&InUseDevicesLock);
80711 + ClearBit(&InUseDevices, pDevice->number);
80712 + spin_unlock(&InUseDevicesLock);
80713 +
80714 + pnp_unregister_driver(pDriver);
80715 + if (pDriver->id_table != NULL) {
80716 + KernelFree((void *)pDriver->id_table);
80717 + pDriver->id_table = NULL;
80718 + }
80719 +
80720 +}
80721 +
80722 +
80723 +/*
80724 + * module init
80725 +*/
80726 +static int __init sdio_busdriver_init(void) {
80727 + SDIO_STATUS status;
80728 + int error;
80729 + REL_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: loaded\n"));
80730 + if (!SDIO_SUCCESS((status = _SDIO_BusDriverInitialize()))) {
80731 + return SDIOErrorToOSError(status);
80732 + }
80733 + /* register the sdio bus */
80734 + error = pnp_register_protocol(&sdio_protocol);
80735 + if (error < 0) {
80736 + REL_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: failed to register bus device, %d\n", error));
80737 + _SDIO_BusDriverCleanup();
80738 + return error;
80739 + }
80740 + return 0;
80741 +}
80742 +
80743 +/*
80744 + * module cleanup
80745 +*/
80746 +static void __exit sdio_busdriver_cleanup(void) {
80747 + REL_PRINT(SDDBG_TRACE, ("SDIO unloaded\n"));
80748 + _SDIO_BusDriverCleanup();
80749 + pnp_unregister_protocol(&sdio_protocol);
80750 +DBG_PRINT(SDDBG_TRACE,
80751 + ("SDIO BusDriver - unloaded 1\n"));
80752 +}
80753 +EXPORT_SYMBOL(SDIO_BusAddOSDevice);
80754 +EXPORT_SYMBOL(SDIO_BusRemoveOSDevice);
80755 +
80756 +#elif LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
80757 + /* 2.4 */
80758 +static int RegisterDriver(PSDFUNCTION pFunction)
80759 +{
80760 + return 0;
80761 +}
80762 +
80763 +static int UnregisterDriver(PSDFUNCTION pFunction)
80764 +{
80765 + DBG_PRINT(SDDBG_TRACE,
80766 + ("+-SDIO BusDriver - UnregisterDriver, driver: \n"));
80767 + return 0;
80768 +}
80769 +
80770 +/*
80771 + * OS_InitializeDevice - initialize device that will be registered
80772 +*/
80773 +SDIO_STATUS OS_InitializeDevice(PSDDEVICE pDevice, PSDFUNCTION pFunction)
80774 +{
80775 + return SDIO_STATUS_SUCCESS;
80776 +}
80777 +
80778 +/*
80779 + * OS_AddDevice - must be pre-initialized with OS_InitializeDevice
80780 +*/
80781 +SDIO_STATUS OS_AddDevice(PSDDEVICE pDevice, PSDFUNCTION pFunction)
80782 +{
80783 + DBG_PRINT(SDDBG_TRACE, ("SDIO BusDriver - OS_AddDevice adding function: %s\n",
80784 + pFunction->pName));
80785 + return SDIO_STATUS_SUCCESS;
80786 +
80787 +}
80788 +
80789 +/*
80790 + * OS_RemoveDevice - unregister device with driver and bus
80791 +*/
80792 +void OS_RemoveDevice(PSDDEVICE pDevice)
80793 +{
80794 + DBG_PRINT(SDDBG_TRACE, ("SDIO BusDriver - OS_RemoveDevice \n"));
80795 +}
80796 +
80797 +/*
80798 + * module init
80799 +*/
80800 +static int __init sdio_busdriver_init(void) {
80801 + SDIO_STATUS status;
80802 + REL_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: loaded\n"));
80803 + if (!SDIO_SUCCESS((status = _SDIO_BusDriverInitialize()))) {
80804 + return SDIOErrorToOSError(status);
80805 + }
80806 + return 0;
80807 +}
80808 +
80809 +/*
80810 + * module cleanup
80811 +*/
80812 +static void __exit sdio_busdriver_cleanup(void) {
80813 + REL_PRINT(SDDBG_TRACE, ("SDIO unloaded\n"));
80814 + _SDIO_BusDriverCleanup();
80815 +}
80816 +#else ////KERNEL_VERSION
80817 +#error "unsupported kernel version: "UTS_RELEASE
80818 +#endif //KERNEL_VERSION
80819 +
80820 +MODULE_LICENSE("GPL and additional rights");
80821 +MODULE_DESCRIPTION(DESCRIPTION);
80822 +MODULE_AUTHOR(AUTHOR);
80823 +
80824 +module_init(sdio_busdriver_init);
80825 +module_exit(sdio_busdriver_cleanup);
80826 +EXPORT_SYMBOL(SDIO_RegisterHostController);
80827 +EXPORT_SYMBOL(SDIO_UnregisterHostController);
80828 +EXPORT_SYMBOL(SDIO_HandleHcdEvent);
80829 +EXPORT_SYMBOL(SDIO_CheckResponse);
80830 +EXPORT_SYMBOL(SDIO_RegisterFunction);
80831 +EXPORT_SYMBOL(SDIO_UnregisterFunction);
80832 Index: linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_function.c
80833 ===================================================================
80834 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
80835 +++ linux-2.6.24.7/drivers/sdio/stack/busdriver/sdio_function.c 2008-12-11 22:46:49.000000000 +0100
80836 @@ -0,0 +1,715 @@
80837 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
80838 +@file: sdio_function.c
80839 +
80840 +@abstract: OS independent bus driver support for function drivers
80841 +
80842 +@notes: This file supports the interface between SDIO function drivers and the bus driver.
80843 +
80844 +@notice: Copyright (c), 2004-2005 Atheros Communications, Inc.
80845 +
80846 +
80847 + *
80848 + * This program is free software; you can redistribute it and/or modify
80849 + * it under the terms of the GNU General Public License version 2 as
80850 + * published by the Free Software Foundation;
80851 + *
80852 + * Software distributed under the License is distributed on an "AS
80853 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
80854 + * implied. See the License for the specific language governing
80855 + * rights and limitations under the License.
80856 + *
80857 + * Portions of this code were developed with information supplied from the
80858 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
80859 + *
80860 + * The following conditions apply to the release of the SD simplified specification (�Simplified
80861 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
80862 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
80863 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
80864 + * Specification may require a license from the SD Card Association or other third parties.
80865 + * Disclaimers:
80866 + * The information contained in the Simplified Specification is presented only as a standard
80867 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
80868 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
80869 + * any damages, any infringements of patents or other right of the SD Card Association or any third
80870 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
80871 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
80872 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
80873 + * information, know-how or other confidential information to any third party.
80874 + *
80875 + *
80876 + * The initial developers of the original code are Seung Yi and Paul Lever
80877 + *
80878 + * sdio@atheros.com
80879 + *
80880 + *
80881 +
80882 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
80883 +#define MODULE_NAME SDBUSDRIVER
80884 +#include <linux/sdio/ctsystem.h>
80885 +#include <linux/sdio/sdio_busdriver.h>
80886 +#include <linux/sdio/sdio_lib.h>
80887 +#include "_busdriver.h"
80888 +
80889 +static SDIO_STATUS ProbeForDevice(PSDFUNCTION pFunction);
80890 +
80891 +#ifdef CT_MAN_CODE_CHECK
80892 +static UINT16 ManCodeCheck = CT_MAN_CODE_CHECK;
80893 +#endif
80894 +
80895 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
80896 + @function: Register a function driver with the bus driver.
80897 +
80898 + @function name: SDIO_RegisterFunction
80899 + @prototype: SDIO_STATUS SDIO_RegisterFunction(PSDFUNCTION pFunction)
80900 + @category: PD_Reference
80901 + @input: pFunction - the function definition structure.
80902 +
80903 + @output: none
80904 +
80905 + @return: SDIO_STATUS - SDIO_STATUS_SUCCESS when succesful.
80906 +
80907 + @notes: Each function driver must register with the bus driver once upon loading.
80908 + The calling function must be prepared to receive a Probe callback before
80909 + this function returns. This will occur when an perpheral device is already
80910 + pluugged in that is supported by this function.
80911 + The function driver should unregister itself when exiting.
80912 + The bus driver checks for possible function drivers to support a device
80913 + in reverse registration order.
80914 +
80915 + @example: Registering a function driver:
80916 + //list of devices supported by this function driver
80917 + static SD_PNP_INFO Ids[] = {
80918 + {.SDIO_ManufacturerID = 0xaa55,
80919 + .SDIO_ManufacturerCode = 0x5555,
80920 + .SDIO_FunctionNo = 1},
80921 + {} //list is null termintaed
80922 + };
80923 + static GENERIC_FUNCTION_CONTEXT FunctionContext = {
80924 + .Function.pName = "sdio_generic", //name of the device
80925 + .Function.Version = CT_SDIO_STACK_VERSION_CODE, // set stack version
80926 + .Function.MaxDevices = 1, //maximum number of devices supported by this driver
80927 + .Function.NumDevices = 0, //current number of devices, always zero to start
80928 + .Function.pIds = Ids, //the list of devices supported by this device
80929 + .Function.pProbe = Probe, //pointer to the function drivers Probe function
80930 + // that will be called when a possibly supported device
80931 + // is inserted.
80932 + .Function.pRemove = Remove, //pointer to the function drivers Remove function
80933 + / that will be called when a device is removed.
80934 + .Function.pContext = &FunctionContext, //data value that will be passed into Probe and
80935 + // Remove callbacks.
80936 + };
80937 + SDIO_STATUS status;
80938 + status = SDIO_RegisterFunction(&FunctionContext.Function)
80939 + if (!SDIO_SUCCESS(status)) {
80940 + ...failed to register
80941 + }
80942 +
80943 + @see also: SDIO_UnregisterFunction
80944 +
80945 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
80946 +SDIO_STATUS _SDIO_RegisterFunction(PSDFUNCTION pFunction)
80947 +{
80948 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
80949 +
80950 +#ifdef CT_MAN_CODE_CHECK
80951 + DBG_PRINT(SDDBG_TRACE,
80952 + ("SDIO Bus Driver: _SDIO_RegisterFunction: WARNING, this version is locked to Memory cards and SDIO cards with JEDEC IDs of: 0x%X\n",
80953 + ManCodeCheck));
80954 +#else
80955 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: _SDIO_RegisterFunction\n"));
80956 +#endif
80957 +
80958 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: Function Driver Stack Version: %d.%d \n",
80959 + GET_SDIO_STACK_VERSION_MAJOR(pFunction),GET_SDIO_STACK_VERSION_MINOR(pFunction)));
80960 +
80961 + if (!CHECK_FUNCTION_DRIVER_VERSION(pFunction)) {
80962 + DBG_PRINT(SDDBG_ERROR,
80963 + ("SDIO Bus Driver: Function Major Version Mismatch (hcd = %d, bus driver = %d)\n",
80964 + GET_SDIO_STACK_VERSION_MAJOR(pFunction), CT_SDIO_STACK_VERSION_MAJOR(g_Version)));
80965 + return SDIO_STATUS_INVALID_PARAMETER;
80966 + }
80967 +
80968 +
80969 + /* sanity check the driver */
80970 + if ((pFunction == NULL) ||
80971 + (pFunction->pProbe == NULL) ||
80972 + (pFunction->pIds == NULL)) {
80973 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_RegisterFunction, invalid registration data\n"));
80974 + return SDIO_STATUS_INVALID_PARAMETER;
80975 + }
80976 + /* protect the function list and add the function */
80977 + if (!SDIO_SUCCESS((status = SemaphorePendInterruptable(&pBusContext->FunctionListSem)))) {
80978 + goto cleanup; /* wait interrupted */
80979 + }
80980 + SignalInitialize(&pFunction->CleanupReqSig);
80981 + SDLIST_INIT(&pFunction->DeviceList);
80982 + SDListAdd(&pBusContext->FunctionList, &pFunction->SDList);
80983 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->FunctionListSem)))) {
80984 + goto cleanup; /* wait interrupted */
80985 + }
80986 +
80987 + /* see if we have devices for this new function driver */
80988 + ProbeForDevice(pFunction);
80989 +
80990 + return status;
80991 +cleanup:
80992 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: _SDIO_RegisterFunction, error exit 0x%X\n", status));
80993 + return status;
80994 +}
80995 +
80996 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
80997 + @function: Unregister a function driver with the bus driver.
80998 +
80999 + @function name: SDIO_UnregisterFunction
81000 + @prototype: SDIO_STATUS SDIO_UnregisterFunction(PSDFUNCTION pFunction)
81001 + @category: PD_Reference
81002 +
81003 + @input: pFunction - the function definition structure.
81004 +
81005 + @output: none
81006 +
81007 + @return: SDIO_STATUS - SDIO_STATUS_SUCCESS when succesful.
81008 +
81009 + @notes: Each function driver must unregister from the bus driver when the function driver
81010 + exits.
81011 + A function driver must disconnect from any interrupts before calling this function.
81012 +
81013 + @example: Unregistering a function driver:
81014 + SDIO_UnregisterFunction(&FunctionContext.Function);
81015 +
81016 + @see also: SDIO_RegisterFunction
81017 +
81018 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81019 +SDIO_STATUS _SDIO_UnregisterFunction(PSDFUNCTION pFunction)
81020 +{
81021 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
81022 + PSDDEVICE pDevice;
81023 +
81024 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: _SDIO_UnregisterFunction\n"));
81025 +
81026 + /* protect the function list and synchronize with Probe() and Remove()*/
81027 + if (!SDIO_SUCCESS((status = SemaphorePendInterruptable(&pBusContext->FunctionListSem)))) {
81028 + goto cleanup; /* wait interrupted */
81029 + }
81030 + /* remove this function from the function list */
81031 + SDListRemove(&pFunction->SDList);
81032 + /* now remove this function as the handler for any of its devices */
81033 + SDITERATE_OVER_LIST_ALLOW_REMOVE(&pFunction->DeviceList, pDevice, SDDEVICE,FuncListLink) {
81034 + if (pDevice->pFunction == pFunction) {
81035 + /* notify removal */
81036 + NotifyDeviceRemove(pDevice);
81037 + }
81038 + }SDITERATE_END;
81039 +
81040 + SignalDelete(&pFunction->CleanupReqSig);
81041 +
81042 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->FunctionListSem)))) {
81043 + goto cleanup; /* wait interrupted */
81044 + }
81045 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: _SDIO_UnregisterFunction\n"));
81046 + return status;
81047 +
81048 +cleanup:
81049 + DBG_PRINT(SDDBG_ERROR, ("-SDIO Bus Driver: _SDIO_UnregisterFunction, error exit 0x%X\n", status));
81050 + return status;
81051 +}
81052 +
81053 +/* documentation headers only for Probe and Remove */
81054 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81055 + @function: This function is called by the Busdriver when a device is inserted that can be supported by this function driver.
81056 +
81057 + @function name: Probe
81058 + @prototype: BOOL (*pProbe)(struct _SDFUNCTION *pFunction, struct _SDDEVICE *pDevice)
81059 + @category: PD_Reference
81060 +
81061 + @input: pFunction - the function definition structure that was passed to Busdriver
81062 + via the SDIO_RegisterFunction.
81063 + @input: pDevice - the description of the newly inserted device.
81064 +
81065 + @output: none
81066 +
81067 + @return: TRUE - this function driver will suport this device
81068 + FALSE - this function driver will not support this device
81069 +
81070 + @notes: The Busdriver calls the Probe function of a function driver to inform it that device is
81071 + available for the function driver to control. The function driver should initialize the
81072 + device and be pepared to acceopt any interrupts from the device before returning.
81073 +
81074 + @example: Example of typical Probe function callback:
81075 + static BOOL Probe(PSDFUNCTION pFunction, PSDDEVICE pDevice) {
81076 + ...get the our context info passed into the SDIO_RegisterFunction
81077 + PSDXXX_DRIVER_CONTEXT pFunctionContext =
81078 + (PSDXXX_DRIVER_CONTEXT)pFunction->pContext;
81079 + SDIO_STATUS status;
81080 + //test the identification of this device and ensure we want to support it
81081 + // we can test based on class, or use more specific tests on SDIO_ManufacturerID, etc.
81082 + if (pDevice->pId[0].SDIO_FunctionClass == XXX) {
81083 + DBG_PRINT(SDDBG_TRACE, ("SDIO XXX Function: Probe - card matched (0x%X/0x%X/0x%X)\n",
81084 + pDevice->pId[0].SDIO_ManufacturerID,
81085 + pDevice->pId[0].SDIO_ManufacturerCode,
81086 + pDevice->pId[0].SDIO_FunctionNo));
81087 + ...
81088 +
81089 + @see also: SDIO_RegisterFunction
81090 + @see also: Remove
81091 +
81092 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81093 +
81094 +BOOL FilterPnpInfo(PSDDEVICE pDevice)
81095 +{
81096 +#ifdef CT_MAN_CODE_CHECK
81097 + if (pDevice->pId[0].CardFlags & CARD_SDIO) {
81098 + if (pDevice->pId[0].SDIO_ManufacturerCode != ManCodeCheck) {
81099 + DBG_PRINT(SDDBG_ERROR,
81100 + ("SDIO Card with JEDEC ID:0x%X , not Allowed! Driver check halted. "
81101 + "Please Contact sales@codetelligence.com.\n",
81102 + pDevice->pId[0].SDIO_ManufacturerCode));
81103 + return FALSE;
81104 + }
81105 + }
81106 + return TRUE;
81107 +#else
81108 + return TRUE;
81109 +#endif
81110 +}
81111 +
81112 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81113 + @function: This function is called by the Busdriver when a device controlled by this function
81114 + function driver is removed.
81115 +
81116 + @function name: Remove
81117 + @prototype: void (*pRemove)(struct _SDFUNCTION *pFunction, struct _SDDEVICE *pDevice)
81118 + @category: PD_Reference
81119 +
81120 + @input: pFunction - the function definition structure that was passed to Busdriver
81121 + via the SDIO_RegisterFunction.
81122 + @input: pDevice - the description of the device being removed.
81123 +
81124 + @output: none
81125 +
81126 + @return: none
81127 +
81128 + @notes: The Busdriver calls the Remove function of a function driver to inform it that device it
81129 + was supporting has been removed. The device has already been removed, so no further I/O
81130 + to the device can be performed.
81131 +
81132 + @example: Example of typical Remove function callback:
81133 + void Remove(PSDFUNCTION pFunction, PSDDEVICE pDevice) {
81134 + // get the our context info passed into the SDIO_RegisterFunction
81135 + PSDXXX_DRIVER_CONTEXT pFunctionContext =
81136 + (PSDXXX_DRIVER_CONTEXT)pFunction->pContext;
81137 + ...free any acquired resources.
81138 +
81139 + @see also: SDIO_RegisterFunction
81140 + @see also: Probe
81141 +
81142 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81143 +
81144 +/*
81145 + * ProbeForFunction - look for a function driver to handle this card
81146 + *
81147 +*/
81148 +SDIO_STATUS ProbeForFunction(PSDDEVICE pDevice, PSDHCD pHcd) {
81149 + SDIO_STATUS status;
81150 + PSDLIST pList;
81151 + PSDFUNCTION pFunction;
81152 +
81153 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: ProbeForFunction\n"));
81154 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: ProbeForFunction - Dump of Device PNP Data: \n"));
81155 + DBG_PRINT(SDDBG_TRACE, (" Card Flags 0x%X \n", pDevice->pId[0].CardFlags));
81156 + if (pDevice->pId[0].CardFlags & CARD_SDIO) {
81157 + DBG_PRINT(SDDBG_TRACE, (" SDIO MANF: 0x%X \n", pDevice->pId[0].SDIO_ManufacturerID));
81158 + DBG_PRINT(SDDBG_TRACE, (" SDIO MANFCODE: 0x%X \n", pDevice->pId[0].SDIO_ManufacturerCode));
81159 + DBG_PRINT(SDDBG_TRACE, (" SDIO FuncNo: %d \n", pDevice->pId[0].SDIO_FunctionNo));
81160 + DBG_PRINT(SDDBG_TRACE, (" SDIO FuncClass: %d \n", pDevice->pId[0].SDIO_FunctionClass));
81161 + }
81162 + if (pDevice->pId[0].CardFlags & (CARD_MMC | CARD_SD)) {
81163 + DBG_PRINT(SDDBG_TRACE, (" SDMMC MANFID: 0x%X \n",pDevice->pId[0].SDMMC_ManfacturerID));
81164 + DBG_PRINT(SDDBG_TRACE, (" SDMMC OEMID: 0x%X \n",pDevice->pId[0].SDMMC_OEMApplicationID));
81165 + }
81166 +
81167 + if (!FilterPnpInfo(pDevice)) {
81168 + status = SDIO_STATUS_SUCCESS;
81169 + goto cleanup;
81170 + }
81171 +
81172 + /* protect the function list */
81173 + if (!SDIO_SUCCESS((status = SemaphorePendInterruptable(&pBusContext->FunctionListSem)))) {
81174 + goto cleanup; /* wait interrupted */
81175 + }
81176 +
81177 + /* protect against ProbeForDevice */
81178 + if (!SDIO_SUCCESS((status = SemaphorePendInterruptable(&pBusContext->DeviceListSem)))) {
81179 + /* release the function list semaphore we just took */
81180 + SemaphorePost(&pBusContext->FunctionListSem);
81181 + goto cleanup;
81182 + }
81183 +
81184 + if (pDevice->pFunction != NULL) {
81185 + /* device already has a function driver handling it */
81186 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: ProbeForFunction, device already has function\n"));
81187 + /* release function list */
81188 + SemaphorePost(&pBusContext->DeviceListSem);
81189 + /* release function list */
81190 + SemaphorePost(&pBusContext->FunctionListSem);
81191 + /* just return success */
81192 + status = SDIO_STATUS_SUCCESS;
81193 + goto cleanup;
81194 + }
81195 +
81196 + /* release device list */
81197 + SemaphorePost(&pBusContext->DeviceListSem);
81198 +
81199 + /* walk functions looking for one that can handle this device */
81200 + SDITERATE_OVER_LIST(&pBusContext->FunctionList, pList) {
81201 + pFunction = CONTAINING_STRUCT(pList, SDFUNCTION, SDList);
81202 + if (pFunction->NumDevices >= pFunction->MaxDevices) {
81203 + /* function can't support any more devices */
81204 + continue;
81205 + }
81206 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: ProbeForFunction - checking: %s \n",
81207 + pFunction->pName));
81208 +
81209 + /* see if this function handles this device */
81210 + if (IsPotentialIdMatch(pDevice->pId, pFunction->pIds)) {
81211 + if (!FilterPnpInfo(pDevice)) {
81212 + break;
81213 + }
81214 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: ProbeForFunction -Got Match, probing: %s \n",
81215 + pFunction->pName));
81216 + /* we need to setup with the OS bus driver before the probe, so probe can
81217 + do OS operations. */
81218 + OS_InitializeDevice(pDevice, pFunction);
81219 + if (!SDIO_SUCCESS(OS_AddDevice(pDevice, pFunction))) {
81220 + break;
81221 + }
81222 + /* close enough match, ask the function driver if it supports us */
81223 + if (pFunction->pProbe(pFunction, pDevice)) {
81224 + /* she accepted the device, add to list */
81225 + pDevice->pFunction = pFunction;
81226 + SDListAdd(&pFunction->DeviceList, &pDevice->FuncListLink);
81227 + pFunction->NumDevices++;
81228 + break;
81229 + } else {
81230 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: %s did not claim the device \n",
81231 + pFunction->pName));
81232 + /* didn't take this device */
81233 + OS_RemoveDevice(pDevice);
81234 + }
81235 +
81236 + }
81237 + }
81238 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->FunctionListSem)))) {
81239 + goto cleanup; /* wait interrupted */
81240 + }
81241 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: ProbeForFunction\n"));
81242 + return status;
81243 +cleanup:
81244 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: ProbeForFunction, error exit 0x%X\n", status));
81245 + return status;
81246 +}
81247 +
81248 +/*
81249 + * ProbeForDevice - look for a device that this function driver supports
81250 + *
81251 +*/
81252 +static SDIO_STATUS ProbeForDevice(PSDFUNCTION pFunction) {
81253 + SDIO_STATUS status;
81254 + PSDLIST pList;
81255 + PSDDEVICE pDevice;
81256 +
81257 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: ProbeForDevice\n"));
81258 + if (pFunction->NumDevices >= pFunction->MaxDevices) {
81259 + /* function can't support any more devices */
81260 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: ProbeForDevice, too many devices in function\n"));
81261 + return SDIO_STATUS_SUCCESS;
81262 + }
81263 +
81264 + /* protect the driver list */
81265 + if (!SDIO_SUCCESS((status = SemaphorePendInterruptable(&pBusContext->DeviceListSem)))) {
81266 + goto cleanup; /* wait interrupted */
81267 + }
81268 + /* walk device list */
81269 + SDITERATE_OVER_LIST(&pBusContext->DeviceList, pList) {
81270 + pDevice = CONTAINING_STRUCT(pList, SDDEVICE, SDList);
81271 + if (pDevice->pFunction != NULL) {
81272 + /* device already has a function driver handling it */
81273 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: ProbeForDevice, device already has function\n"));
81274 + continue;
81275 + }
81276 + /* see if this function handles this device */
81277 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: ProbeForDevice, matching ID:%d %d class:%d\n",
81278 + pDevice->pId[0].SDIO_ManufacturerID,
81279 + pDevice->pId[0].SDIO_FunctionNo,
81280 + pDevice->pId[0].SDIO_FunctionClass));
81281 + if (IsPotentialIdMatch(pDevice->pId, pFunction->pIds)) {
81282 + if (!FilterPnpInfo(pDevice)) {
81283 + break;
81284 + }
81285 + /* we need to setup with the OS bus driver before the probe, so probe can
81286 + do OS operations. */
81287 + OS_InitializeDevice(pDevice, pFunction);
81288 + if (!SDIO_SUCCESS(OS_AddDevice(pDevice, pFunction))) {
81289 + break;
81290 + }
81291 + /* close enough match, ask the function driver if it supports us */
81292 + if (pFunction->pProbe(pFunction, pDevice)) {
81293 + /* she accepted the device, add to list */
81294 + pDevice->pFunction = pFunction;
81295 + SDListAdd(&pFunction->DeviceList, &pDevice->FuncListLink);
81296 + pFunction->NumDevices++;
81297 + break;
81298 + } else {
81299 + DBG_PRINT(SDDBG_WARN, ("SDIO Bus Driver: %s did not claim the device \n",
81300 + pFunction->pName));
81301 + /* didn't take this device */
81302 + OS_RemoveDevice(pDevice);
81303 + }
81304 + }
81305 + }
81306 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->DeviceListSem)))) {
81307 + goto cleanup; /* wait interrupted */
81308 + }
81309 +
81310 + return status;
81311 +cleanup:
81312 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: ProbeForDevice, error exit 0x%X\n", status));
81313 + return status;
81314 +}
81315 +
81316 +#if 0
81317 +static void DumpPnpEntry(PSD_PNP_INFO pInfo)
81318 +{
81319 + DBG_PRINT(SDDBG_TRACE, ("Function PnpInfo Dump: \n"));
81320 + DBG_PRINT(SDDBG_TRACE, (" Card Flags 0x%X \n", pInfo->CardFlags));
81321 + DBG_PRINT(SDDBG_TRACE, (" SDIO MANF: 0x%X \n", pInfo->SDIO_ManufacturerID));
81322 + DBG_PRINT(SDDBG_TRACE, (" SDIO MANFCODE: 0x%X \n", pInfo->SDIO_ManufacturerCode));
81323 + DBG_PRINT(SDDBG_TRACE, (" SDIO FuncNo: %d \n", pInfo->SDIO_FunctionNo));
81324 + DBG_PRINT(SDDBG_TRACE, (" SDIO FuncClass: %d \n", pInfo->SDIO_FunctionClass));
81325 + DBG_PRINT(SDDBG_TRACE, (" SDMMC MANFID: 0x%X \n", pInfo->SDMMC_ManfacturerID));
81326 + DBG_PRINT(SDDBG_TRACE, (" SDMMC OEMID: 0x%X \n", pInfo->SDMMC_OEMApplicationID));
81327 +}
81328 +#endif
81329 +/*
81330 + * IsPotentialIdMatch - test for potential device match
81331 + *
81332 +*/
81333 +BOOL IsPotentialIdMatch(PSD_PNP_INFO pIdsDev, PSD_PNP_INFO pIdsFuncList) {
81334 + PSD_PNP_INFO pTFn;
81335 + BOOL match = FALSE;
81336 +
81337 + for (pTFn = pIdsFuncList;!IS_LAST_SDPNPINFO_ENTRY(pTFn);pTFn++) {
81338 + //DumpPnpEntry(pTFn);
81339 + /* check specific SDIO Card manufacturer ID, Code and Function number */
81340 + if ((pIdsDev->SDIO_ManufacturerID != 0) &&
81341 + (pTFn->SDIO_ManufacturerID != 0) &&
81342 + (pIdsDev->SDIO_ManufacturerID == pTFn->SDIO_ManufacturerID) &&
81343 + (pIdsDev->SDIO_ManufacturerCode == pTFn->SDIO_ManufacturerCode) &&
81344 + ((pIdsDev->SDIO_FunctionNo == pTFn->SDIO_FunctionNo) ||
81345 + (pTFn->SDIO_FunctionNo == 0)) ) {
81346 + match = TRUE;
81347 + break;
81348 + }
81349 + /* check generic function class */
81350 + if ((pIdsDev->SDIO_FunctionClass != 0) &&
81351 + (pTFn->SDIO_FunctionClass != 0) &&
81352 + (pIdsDev->SDIO_FunctionClass == pTFn->SDIO_FunctionClass)) {
81353 + match = TRUE;
81354 + break;
81355 + }
81356 + /* check specific SDMMC MANFID and APPLICATION ID, NOTE SANDISK
81357 + * uses a MANFID of zero! */
81358 + if ((pTFn->SDMMC_OEMApplicationID != 0) &&
81359 + (pIdsDev->SDMMC_ManfacturerID == pTFn->SDMMC_ManfacturerID) &&
81360 + (pIdsDev->SDMMC_OEMApplicationID == pTFn->SDMMC_OEMApplicationID)) {
81361 + match = TRUE;
81362 + break;
81363 + }
81364 +
81365 + /* check generic SD Card */
81366 + if ((pIdsDev->CardFlags & CARD_SD) &&
81367 + (pTFn->CardFlags & CARD_SD)){
81368 + match = TRUE;
81369 + break;
81370 + }
81371 +
81372 + /* check generic MMC Card */
81373 + if ((pIdsDev->CardFlags & CARD_MMC) &&
81374 + (pTFn->CardFlags & CARD_MMC)){
81375 + match = TRUE;
81376 + break;
81377 + }
81378 +
81379 + /* check raw Card */
81380 + if ((pIdsDev->CardFlags & CARD_RAW) &&
81381 + (pTFn->CardFlags & CARD_RAW)){
81382 + match = TRUE;
81383 + break;
81384 + }
81385 + }
81386 +
81387 + return match;
81388 +}
81389 +
81390 +/*
81391 + * NotifyDeviceRemove - tell function driver on this device that the device is being removed
81392 + *
81393 +*/
81394 +SDIO_STATUS NotifyDeviceRemove(PSDDEVICE pDevice) {
81395 + SDIO_STATUS status;
81396 + SDREQUESTQUEUE cancelQueue;
81397 + PSDREQUEST pReq;
81398 + CT_DECLARE_IRQ_SYNC_CONTEXT();
81399 +
81400 + InitializeRequestQueue(&cancelQueue);
81401 +
81402 + if ((pDevice->pFunction != NULL) &&
81403 + (pDevice->pFunction->pRemove != NULL)){
81404 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: removing device 0x%X\n", (INT)pDevice));
81405 + /* fail any outstanding requests for this device */
81406 + /* acquire lock for request queue */
81407 + status = _AcquireHcdLock(pDevice->pHcd);
81408 + if (!SDIO_SUCCESS(status)) {
81409 + return status;
81410 + }
81411 + /* mark the function to block any more requests comming down */
81412 + pDevice->pFunction->Flags |= SDFUNCTION_FLAG_REMOVING;
81413 + /* walk through HCD queue and remove this function's requests */
81414 + SDITERATE_OVER_LIST_ALLOW_REMOVE(&pDevice->pHcd->RequestQueue.Queue, pReq, SDREQUEST, SDList) {
81415 + if (pReq->pFunction == pDevice->pFunction) {
81416 + /* cancel this request, as this device or function is being removed */
81417 + /* note that these request are getting completed out of order */
81418 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver - NotifyDeviceRemove: canceling req 0x%X\n", (UINT)pReq));
81419 + pReq->Status = SDIO_STATUS_CANCELED;
81420 + /* remove it from the HCD queue */
81421 + SDListRemove(&pReq->SDList);
81422 + /* add it to the cancel queue */
81423 + QueueRequest(&cancelQueue, pReq);
81424 + }
81425 + }SDITERATE_END;
81426 +
81427 + status = _ReleaseHcdLock(pDevice->pHcd);
81428 +
81429 + /* now empty the cancel queue if anything is in there */
81430 + while (TRUE) {
81431 + pReq = DequeueRequest(&cancelQueue);
81432 + if (NULL == pReq) {
81433 + break;
81434 + }
81435 + /* complete the request */
81436 + DoRequestCompletion(pReq, pDevice->pHcd);
81437 + }
81438 + /* re-acquire the lock to deal with the current request */
81439 + status = _AcquireHcdLock(pDevice->pHcd);
81440 + if (!SDIO_SUCCESS(status)) {
81441 + return status;
81442 + }
81443 + /* now deal with the current request */
81444 + pReq = GET_CURRENT_REQUEST(pDevice->pHcd);
81445 + if ((pReq !=NULL) && (pReq->pFunction == pDevice->pFunction) && (pReq->pFunction != NULL)) {
81446 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver - NotifyDeviceRemove: Outstanding Req 0x%X on HCD: 0x%X.. waiting...\n",
81447 + (UINT)pReq, (UINT)pDevice->pHcd));
81448 + /* the outstanding request on this device is for the function being removed */
81449 + pReq->Flags |= SDREQ_FLAGS_CANCELED;
81450 + /* wait for this request to get completed normally */
81451 + status = _ReleaseHcdLock(pDevice->pHcd);
81452 + SignalWait(&pDevice->pFunction->CleanupReqSig);
81453 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver - NotifyDeviceRemove: Outstanding HCD Req 0x%X completed \n", (UINT)pReq));
81454 + } else {
81455 + /* release lock */
81456 + status = _ReleaseHcdLock(pDevice->pHcd);
81457 + }
81458 +
81459 + /* synchronize with ISR SYNC Handlers */
81460 + status = SemaphorePendInterruptable(&pBusContext->DeviceListSem);
81461 + if (!SDIO_SUCCESS(status)) {
81462 + return status;
81463 + }
81464 + /* call this devices Remove function */
81465 + pDevice->pFunction->pRemove(pDevice->pFunction,pDevice);
81466 + pDevice->pFunction->NumDevices--;
81467 + /* make sure the sync handler is NULLed out */
81468 + pDevice->pIrqFunction = NULL;
81469 + SemaphorePost(&pBusContext->DeviceListSem);
81470 +
81471 + OS_RemoveDevice(pDevice);
81472 + /* detach this device from the function list it belongs to */
81473 + SDListRemove(&pDevice->FuncListLink);
81474 + pDevice->pFunction->Flags &= ~SDFUNCTION_FLAG_REMOVING;
81475 + pDevice->pFunction = NULL;
81476 + }
81477 + return SDIO_STATUS_SUCCESS;
81478 +}
81479 +
81480 +
81481 +/*
81482 + * RemoveHcdFunctions - remove all functions attached to an HCD
81483 + *
81484 +*/
81485 +SDIO_STATUS RemoveHcdFunctions(PSDHCD pHcd) {
81486 + SDIO_STATUS status;
81487 + PSDLIST pList;
81488 + PSDFUNCTION pFunction;
81489 + PSDDEVICE pDevice;
81490 + DBG_PRINT(SDDBG_TRACE, ("+SDIO Bus Driver: RemoveHcdFunctions\n"));
81491 +
81492 + /* walk through the functions and remove the ones associated with this HCD */
81493 + /* protect the driver list */
81494 + if (!SDIO_SUCCESS((status = SemaphorePend(&pBusContext->FunctionListSem)))) {
81495 + goto cleanup; /* wait interrupted */
81496 + }
81497 + /* mark that card is being removed */
81498 + pHcd->CardProperties.CardState |= CARD_STATE_REMOVED;
81499 + SDITERATE_OVER_LIST(&pBusContext->FunctionList, pList) {
81500 + pFunction = CONTAINING_STRUCT(pList, SDFUNCTION, SDList);
81501 + DBG_PRINT(SDDBG_TRACE, ("SDIO Bus Driver: scanning function 0x%X, %s\n", (INT)pFunction,
81502 + (pFunction == NULL)?"NULL":pFunction->pName));
81503 +
81504 + /* walk the devices on this function and look for a match */
81505 + SDITERATE_OVER_LIST_ALLOW_REMOVE(&pFunction->DeviceList, pDevice, SDDEVICE,FuncListLink) {
81506 + if (pDevice->pHcd == pHcd) {
81507 + /* match, remove it */
81508 + NotifyDeviceRemove(pDevice);
81509 + }
81510 + SDITERATE_END;
81511 + SDITERATE_END;
81512 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->FunctionListSem)))) {
81513 + goto cleanup; /* wait interrupted */
81514 + }
81515 + DBG_PRINT(SDDBG_TRACE, ("-SDIO Bus Driver: RemoveHcdFunctions\n"));
81516 + return SDIO_STATUS_SUCCESS;
81517 +
81518 +cleanup:
81519 + DBG_PRINT(SDDBG_ERROR, ("-SDIO Bus Driver: RemoveHcdFunctions, error exit 0x%X\n", status));
81520 + return status;
81521 +}
81522 +
81523 +/*
81524 + * RemoveAllFunctions - remove all functions attached
81525 + *
81526 +*/
81527 +SDIO_STATUS RemoveAllFunctions()
81528 +{
81529 + SDIO_STATUS status;
81530 + PSDLIST pList;
81531 + PSDHCD pHcd;
81532 +
81533 + /* walk through the HCDs */
81534 + /* protect the driver list */
81535 + if (!SDIO_SUCCESS((status = SemaphorePend(&pBusContext->HcdListSem)))) {
81536 + goto cleanup; /* wait interrupted */
81537 + }
81538 + SDITERATE_OVER_LIST(&pBusContext->HcdList, pList) {
81539 + pHcd = CONTAINING_STRUCT(pList, SDHCD, SDList);
81540 + /* remove the functions */
81541 + RemoveHcdFunctions(pHcd);
81542 + }
81543 + if (!SDIO_SUCCESS((status = SemaphorePost(&pBusContext->HcdListSem)))) {
81544 + goto cleanup; /* wait interrupted */
81545 + }
81546 + return SDIO_STATUS_SUCCESS;
81547 +cleanup:
81548 + DBG_PRINT(SDDBG_ERROR, ("SDIO Bus Driver: RemoveAllFunctions, error exit 0x%X\n", status));
81549 + return status;
81550 +}
81551 +
81552 Index: linux-2.6.24.7/drivers/sdio/stack/lib/Makefile
81553 ===================================================================
81554 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
81555 +++ linux-2.6.24.7/drivers/sdio/stack/lib/Makefile 2008-12-11 22:46:49.000000000 +0100
81556 @@ -0,0 +1,2 @@
81557 +obj-$(CONFIG_SDIO) += sdio_lib.o
81558 +sdio_lib-objs := sdio_lib_c.o sdio_lib_os.o
81559 Index: linux-2.6.24.7/drivers/sdio/stack/lib/sdio_lib_c.c
81560 ===================================================================
81561 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
81562 +++ linux-2.6.24.7/drivers/sdio/stack/lib/sdio_lib_c.c 2008-12-11 22:46:49.000000000 +0100
81563 @@ -0,0 +1,908 @@
81564 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81565 +@file: sdio_lib_c.c
81566 +
81567 +@abstract: OS independent SDIO library functions
81568 +@category abstract: Support_Reference Support Functions.
81569 +
81570 +@notes: Support functions for device I/O
81571 +
81572 +@notice: Copyright (c), 2004-2005 Atheros Communications, Inc.
81573 +
81574 +
81575 + *
81576 + * This program is free software; you can redistribute it and/or modify
81577 + * it under the terms of the GNU General Public License version 2 as
81578 + * published by the Free Software Foundation;
81579 + *
81580 + * Software distributed under the License is distributed on an "AS
81581 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
81582 + * implied. See the License for the specific language governing
81583 + * rights and limitations under the License.
81584 + *
81585 + * Portions of this code were developed with information supplied from the
81586 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
81587 + *
81588 + * The following conditions apply to the release of the SD simplified specification (�Simplified
81589 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
81590 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
81591 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
81592 + * Specification may require a license from the SD Card Association or other third parties.
81593 + * Disclaimers:
81594 + * The information contained in the Simplified Specification is presented only as a standard
81595 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
81596 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
81597 + * any damages, any infringements of patents or other right of the SD Card Association or any third
81598 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
81599 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
81600 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
81601 + * information, know-how or other confidential information to any third party.
81602 + *
81603 + *
81604 + * The initial developers of the original code are Seung Yi and Paul Lever
81605 + *
81606 + * sdio@atheros.com
81607 + *
81608 + *
81609 +
81610 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81611 +#define MODULE_NAME SDLIB_
81612 +
81613 +#include <linux/sdio/ctsystem.h>
81614 +#include <linux/sdio/sdio_busdriver.h>
81615 +#include <linux/sdio/_sdio_defs.h>
81616 +#include <linux/sdio/sdio_lib.h>
81617 +#include "_sdio_lib.h"
81618 +
81619 +#define _Cmd52WriteByteCommon(pDev, Address, pValue) \
81620 + _SDLIB_IssueCMD52((pDev),0,(Address),(pValue),1,TRUE)
81621 +#define _Cmd52ReadByteCommon(pDev, Address, pValue) \
81622 + _SDLIB_IssueCMD52((pDev),0,(Address),pValue,1,FALSE)
81623 +#define _Cmd52ReadMultipleCommon(pDev, Address, pBuf,length) \
81624 + _SDLIB_IssueCMD52((pDev),0,(Address),(pBuf),(length),FALSE)
81625 +
81626 +/* inline version */
81627 +static INLINE void _iSDLIB_SetupCMD52Request(UINT8 FuncNo,
81628 + UINT32 Address,
81629 + BOOL Write,
81630 + UINT8 WriteData,
81631 + PSDREQUEST pRequest) {
81632 + if (Write) {
81633 + SDIO_SET_CMD52_ARG(pRequest->Argument,CMD52_WRITE,
81634 + FuncNo,
81635 + CMD52_NORMAL_WRITE,Address,WriteData);
81636 + } else {
81637 + SDIO_SET_CMD52_ARG(pRequest->Argument,CMD52_READ,FuncNo,0,Address,0x00);
81638 + }
81639 +
81640 + pRequest->Flags = SDREQ_FLAGS_RESP_SDIO_R5;
81641 + pRequest->Command = CMD52;
81642 +}
81643 +
81644 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81645 + @function: Setup cmd52 requests
81646 +
81647 + @function name: SDLIB_SetupCMD52Request
81648 + @prototype: void SDLIB_SetupCMD52Request(UINT8 FuncNo,
81649 + UINT32 Address,
81650 + BOOL Write,
81651 + UINT8 WriteData,
81652 + PSDREQUEST pRequest)
81653 + @category: PD_Reference
81654 +
81655 + @input: FunctionNo - function number.
81656 + @input: Address - I/O address, 17-bit register address.
81657 + @input: Write - TRUE if a write operation, FALSE for reads.
81658 + @input: WriteData - write data, byte to write if write operation.
81659 +
81660 + @output: pRequest - request is updated with cmd52 parameters
81661 +
81662 + @return: none
81663 +
81664 + @notes: This function does not perform any I/O. For register reads, the completion
81665 + routine can use the SD_R5_GET_READ_DATA() macro to extract the register value.
81666 + The routine should also extract the response flags using the SD_R5_GET_RESP_FLAGS()
81667 + macro and check the flags with the SD_R5_ERRORS mask.
81668 +
81669 + @example: Getting the register value from the completion routine:
81670 + flags = SD_R5_GET_RESP_FLAGS(pRequest->Response);
81671 + if (flags & SD_R5_ERRORS) {
81672 + ... errors
81673 + } else {
81674 + registerValue = SD_R5_GET_READ_DATA(pRequest->Response);
81675 + }
81676 +
81677 + @see also: SDLIB_IssueCMD52
81678 + @see also: SDDEVICE_CALL_REQUEST_FUNC
81679 +
81680 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81681 +void _SDLIB_SetupCMD52Request(UINT8 FuncNo,
81682 + UINT32 Address,
81683 + BOOL Write,
81684 + UINT8 WriteData,
81685 + PSDREQUEST pRequest)
81686 +{
81687 + _iSDLIB_SetupCMD52Request(FuncNo,Address,Write,WriteData,pRequest);
81688 +}
81689 +
81690 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81691 + @function: Issue a CMD52 to read or write a register
81692 +
81693 + @function name: SDLIB_IssueCMD52
81694 + @prototype: SDIO_STATUS SDLIB_IssueCMD52(PSDDEVICE pDevice,
81695 + UINT8 FuncNo,
81696 + UINT32 Address,
81697 + PUINT8 pData,
81698 + INT ByteCount,
81699 + BOOL Write)
81700 + @category: PD_Reference
81701 + @input: pDevice - the device that is the target of the command.
81702 + @input: FunctionNo - function number of the target.
81703 + @input: Address - 17-bit register address.
81704 + @input: ByteCount - number of bytes to read or write,
81705 + @input: Write - TRUE if a write operation, FALSE for reads.
81706 + @input: pData - data buffer for writes.
81707 +
81708 + @output: pData - data buffer for writes.
81709 +
81710 + @return: SDIO Status
81711 +
81712 + @notes: This function will allocate a request and issue multiple byte reads or writes
81713 + to satisfy the ByteCount requested. This function is fully synchronous and will block
81714 + the caller.
81715 +
81716 + @see also: SDLIB_SetupCMD52Request
81717 +
81718 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81719 +SDIO_STATUS _SDLIB_IssueCMD52(PSDDEVICE pDevice,
81720 + UINT8 FuncNo,
81721 + UINT32 Address,
81722 + PUINT8 pData,
81723 + INT ByteCount,
81724 + BOOL Write)
81725 +{
81726 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
81727 +
81728 + PSDREQUEST pReq = NULL;
81729 +
81730 + pReq = SDDeviceAllocRequest(pDevice);
81731 +
81732 + if (NULL == pReq) {
81733 + return SDIO_STATUS_NO_RESOURCES;
81734 + }
81735 +
81736 + while (ByteCount) {
81737 + _iSDLIB_SetupCMD52Request(FuncNo,Address,Write,*pData,pReq);
81738 + status = SDDEVICE_CALL_REQUEST_FUNC(pDevice,pReq);
81739 + if (!SDIO_SUCCESS(status)) {
81740 + break;
81741 + }
81742 +
81743 + status = ConvertCMD52ResponseToSDIOStatus(SD_R5_GET_RESP_FLAGS(pReq->Response));
81744 + if (!SDIO_SUCCESS(status)) {
81745 + DBG_PRINT(SDDBG_TRACE, ("SDIO Library: CMD52 resp error: 0x%X \n",
81746 + SD_R5_GET_RESP_FLAGS(pReq->Response)));
81747 + break;
81748 + }
81749 + if (!Write) {
81750 + /* store the byte */
81751 + *pData = SD_R5_GET_READ_DATA(pReq->Response);
81752 + }
81753 + pData++;
81754 + Address++;
81755 + ByteCount--;
81756 + }
81757 +
81758 + SDDeviceFreeRequest(pDevice,pReq);
81759 + return status;
81760 +}
81761 +
81762 +
81763 +
81764 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81765 + @function: Find a device's tuple.
81766 +
81767 + @function name: SDLIB_FindTuple
81768 + @prototype: SDIO_STATUS SDLIB_FindTuple(PSDDEVICE pDevice,
81769 + UINT8 Tuple,
81770 + UINT32 *pTupleScanAddress,
81771 + PUINT8 pBuffer,
81772 + UINT8 *pLength)
81773 +
81774 + @category: PD_Reference
81775 + @input: pDevice - the device that is the target of the command.
81776 + @input: Tuple - 8-bit ID of tuple to find
81777 + @input: pTupleScanAddress - On entry pTupleScanAddress is the adddress to start scanning
81778 + @input: pLength - length of pBuffer
81779 +
81780 + @output: pBuffer - storage for tuple
81781 + @output: pTupleScanAddress - address of the next tuple
81782 + @output: pLength - length of tuple read
81783 +
81784 + @return: status
81785 +
81786 + @notes: It is possible to have the same tuple ID multiple times with different lengths. This function
81787 + blocks and is fully synchronous.
81788 +
81789 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81790 +SDIO_STATUS _SDLIB_FindTuple(PSDDEVICE pDevice,
81791 + UINT8 Tuple,
81792 + UINT32 *pTupleScanAddress,
81793 + PUINT8 pBuffer,
81794 + UINT8 *pLength)
81795 +{
81796 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
81797 + UINT32 scanStart = *pTupleScanAddress;
81798 + UINT8 tupleCode;
81799 + UINT8 tupleLink;
81800 +
81801 + /* sanity check */
81802 + if (scanStart < SDIO_CIS_AREA_BEGIN) {
81803 + return SDIO_STATUS_CIS_OUT_OF_RANGE;
81804 + }
81805 +
81806 + while (TRUE) {
81807 + /* check for end */
81808 + if (scanStart > SDIO_CIS_AREA_END) {
81809 + status = SDIO_STATUS_TUPLE_NOT_FOUND;
81810 + break;
81811 + }
81812 + /* get the code */
81813 + status = _Cmd52ReadByteCommon(pDevice, scanStart, &tupleCode);
81814 + if (!SDIO_SUCCESS(status)) {
81815 + break;
81816 + }
81817 + if (CISTPL_END == tupleCode) {
81818 + /* found the end */
81819 + status = SDIO_STATUS_TUPLE_NOT_FOUND;
81820 + break;
81821 + }
81822 + /* bump past tuple code */
81823 + scanStart++;
81824 + /* get the tuple link value */
81825 + status = _Cmd52ReadByteCommon(pDevice, scanStart, &tupleLink);
81826 + if (!SDIO_SUCCESS(status)) {
81827 + break;
81828 + }
81829 + /* bump past tuple link*/
81830 + scanStart++;
81831 + /* check tuple we just found */
81832 + if (tupleCode == Tuple) {
81833 + DBG_PRINT(SDDBG_TRACE, ("SDIO Library: Tuple:0x%2.2X Found at Address:0x%X, TupleLink:0x%X \n",
81834 + Tuple, (scanStart - 2), tupleLink));
81835 + if (tupleLink != CISTPL_LINK_END) {
81836 + /* return the next scan address to the caller */
81837 + *pTupleScanAddress = scanStart + tupleLink;
81838 + } else {
81839 + /* the tuple link is an end marker */
81840 + *pTupleScanAddress = 0xFFFFFFFF;
81841 + }
81842 + /* go get the tuple */
81843 + status = _Cmd52ReadMultipleCommon(pDevice, scanStart,pBuffer,min(*pLength,tupleLink));
81844 + if (SDIO_SUCCESS(status)) {
81845 + /* set the actual return length */
81846 + *pLength = min(*pLength,tupleLink);
81847 + }
81848 + /* break out of loop */
81849 + break;
81850 + }
81851 + /*increment past this entire tuple */
81852 + scanStart += tupleLink;
81853 + }
81854 +
81855 + return status;
81856 +}
81857 +
81858 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81859 + @function: Issue an SDIO configuration command.
81860 +
81861 + @function name: SDLIB_IssueConfig
81862 + @prototype: SDIO_STATUS _SDLIB_IssueConfig(PSDDEVICE pDevice,
81863 + SDCONFIG_COMMAND Command,
81864 + PVOID pData,
81865 + INT Length)
81866 +
81867 + @category: PD_Reference
81868 + @input: pDevice - the device that is the target of the command.
81869 + @input: Command - command to send, see example.
81870 + @input: pData - command's data
81871 + @input: Length length of pData
81872 +
81873 + @output: pData - updated on commands that return data.
81874 +
81875 + @return: SDIO Status
81876 +
81877 + @example: Command and data pairs:
81878 + Type Data
81879 + SDCONFIG_GET_WP SDCONFIG_WP_VALUE
81880 + SDCONFIG_SEND_INIT_CLOCKS none
81881 + SDCONFIG_SDIO_INT_CTRL SDCONFIG_SDIO_INT_CTRL_DATA
81882 + SDCONFIG_SDIO_REARM_INT none
81883 + SDCONFIG_BUS_MODE_CTRL SDCONFIG_BUS_MODE_DATA
81884 + SDCONFIG_POWER_CTRL SDCONFIG_POWER_CTRL_DATA
81885 +
81886 + @notes:
81887 +
81888 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81889 +SDIO_STATUS _SDLIB_IssueConfig(PSDDEVICE pDevice,
81890 + SDCONFIG_COMMAND Command,
81891 + PVOID pData,
81892 + INT Length)
81893 +{
81894 + SDCONFIG configHdr;
81895 + SET_SDCONFIG_CMD_INFO(&configHdr,Command,pData,Length);
81896 + return SDDEVICE_CALL_CONFIG_FUNC(pDevice,&configHdr);
81897 +}
81898 +
81899 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81900 + @function: Set function block size
81901 +
81902 + @function name: SDLIB_SetFunctionBlockSize
81903 + @prototype: SDIO_STATUS SDLIB_SetFunctionBlockSize(PSDDEVICE pDevice,
81904 + UINT16 BlockSize)
81905 +
81906 + @category: PD_Reference
81907 + @input: pDevice - the device that is the target of the command.
81908 + @input: BlockSize - block size to set in function
81909 +
81910 + @output: none
81911 +
81912 + @return: SDIO Status
81913 +
81914 + @notes: Issues CMD52 to set the block size. This function is fully synchronous and may
81915 + block.
81916 +
81917 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81918 +SDIO_STATUS _SDLIB_SetFunctionBlockSize(PSDDEVICE pDevice,
81919 + UINT16 BlockSize)
81920 +{
81921 + UINT8 data[2];
81922 +
81923 + /* endian safe */
81924 + data[0] = (UINT8)BlockSize;
81925 + data[1] = (UINT8)(BlockSize >> 8);
81926 + /* write the function blk size control register */
81927 + return _SDLIB_IssueCMD52(pDevice,
81928 + 0, /* function 0 register space */
81929 + FBR_FUNC_BLK_SIZE_LOW_OFFSET(CalculateFBROffset(
81930 + SDDEVICE_GET_SDIO_FUNCNO(pDevice))),
81931 + data,
81932 + 2,
81933 + TRUE);
81934 +}
81935 +
81936 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
81937 + @function: Print a buffer to the debug output
81938 +
81939 + @function name: SDLIB_PrintBuffer
81940 + @prototype: void SDLIB_PrintBuffer(PUCHAR pBuffer, INT Length, PTEXT pDescription)
81941 + @category: Support_Reference
81942 +
81943 + @input: pBuffer - Hex buffer to be printed.
81944 + @input: Length - length of pBuffer.
81945 + @input: pDescription - String title to be printed above the dump.
81946 +
81947 + @output: none
81948 +
81949 + @return: none
81950 +
81951 + @notes: Prints the buffer by converting to ASCII and using REL_PRINT() with 16
81952 + bytes per line.
81953 +
81954 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
81955 +void _SDLIB_PrintBuffer(PUCHAR pBuffer, INT Length, PTEXT pDescription)
81956 +{
81957 + TEXT line[49];
81958 + TEXT address[5];
81959 + TEXT ascii[17];
81960 + TEXT temp[5];
81961 + INT i;
81962 + UCHAR num;
81963 + USHORT offset = 0;
81964 +
81965 + REL_PRINT(0,
81966 + ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"));
81967 + if (pDescription != NULL) {
81968 + REL_PRINT(0, ("Description: %s \n\n",pDescription));
81969 + } else {
81970 + REL_PRINT(0, ("Description: NONE \n\n"));
81971 + }
81972 + REL_PRINT(0,
81973 + ("Offset Data ASCII \n"));
81974 + REL_PRINT(0,
81975 + ("--------------------------------------------------------------------------\n"));
81976 +
81977 + while (Length) {
81978 + line[0] = (TEXT)0;
81979 + ascii[0] = (TEXT)0;
81980 + address[0] = (TEXT)0;
81981 + sprintf(address,"%4.4X",offset);
81982 + for (i = 0; i < 16; i++) {
81983 + if (Length != 0) {
81984 + num = *pBuffer;
81985 + sprintf(temp,"%2.2X ",num);
81986 + strcat(line,temp);
81987 + if ((num >= 0x20) && (num <= 0x7E)) {
81988 + sprintf(temp,"%c",*pBuffer);
81989 + } else {
81990 + sprintf(temp,"%c",0x2e);
81991 + }
81992 + strcat(ascii,temp);
81993 + pBuffer++;
81994 + Length--;
81995 + } else {
81996 + /* pad partial line with spaces */
81997 + strcat(line," ");
81998 + strcat(ascii," ");
81999 + }
82000 + }
82001 + REL_PRINT(0,("%s %s %s\n", address, line, ascii));
82002 + offset += 16;
82003 + }
82004 + REL_PRINT(0,
82005 + ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"));
82006 +
82007 +}
82008 +
82009 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82010 + @function: Get default operational current
82011 +
82012 + @function name: SDLIB_GetDefaultOpCurrent
82013 + @prototype: SDIO_STATUS SDLIB_GetDefaultOpCurrent(PSDDEVICE pDevice, SD_SLOT_CURRENT *pOpCurrent)
82014 + @category: PD_Reference
82015 +
82016 + @input: pDevice - the device that is the target of the command.
82017 +
82018 + @output: pOpCurrent - operational current in mA.
82019 +
82020 + @return: SDIO_STATUS
82021 +
82022 + @notes: This routine reads the function's CISTPL_FUNCE tuple for the default operational
82023 + current. For SDIO 1.0 devices this value is read from the 8-bit TPLFE_OP_MAX_PWR
82024 + field. For SDIO 1.1 devices, the HP MAX power field is used only if the device is
82025 + operating in HIPWR mode. Otherwise the 8-bit TPLFE_OP_MAX_PWR field is used.
82026 + Some systems may restrict high power/current mode and force cards to operate in a
82027 + legacy (< 200mA) mode. This function is fully synchronous and will block the caller.
82028 +
82029 + @example: Getting the default operational current for this function:
82030 + // get default operational current
82031 + status = SDLIB_GetDefaultOpCurrent(pDevice, &slotCurrent);
82032 + if (!SDIO_SUCCESS(status)) {
82033 + .. failed
82034 + }
82035 +
82036 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82037 +SDIO_STATUS _SDLIB_GetDefaultOpCurrent(PSDDEVICE pDevice, SD_SLOT_CURRENT *pOpCurrent)
82038 +{
82039 + UINT32 nextTpl;
82040 + UINT8 tplLength;
82041 + struct SDIO_FUNC_EXT_FUNCTION_TPL_1_1 funcTuple;
82042 + SDIO_STATUS status;
82043 +
82044 + /* get the FUNCE tuple */
82045 + nextTpl = SDDEVICE_GET_SDIO_FUNC_CISPTR(pDevice);
82046 + tplLength = sizeof(funcTuple);
82047 + /* go get the function Extension tuple */
82048 + status = _SDLIB_FindTuple(pDevice,
82049 + CISTPL_FUNCE,
82050 + &nextTpl,
82051 + (PUINT8)&funcTuple,
82052 + &tplLength);
82053 +
82054 + if (!SDIO_SUCCESS(status)) {
82055 + DBG_PRINT(SDDBG_ERROR, ("SDLIB_GetDefaultOpCurrent: Failed to get FuncE Tuple: %d \n", status));
82056 + return status;
82057 + }
82058 + /* use the operational power (8-bit) value of current in mA as default*/
82059 + *pOpCurrent = funcTuple.CommonInfo.OpMaxPwr;
82060 + if ((tplLength >= sizeof(funcTuple)) && (SDDEVICE_IS_SDIO_REV_GTEQ_1_10(pDevice))) {
82061 + /* we have a 1.1 tuple */
82062 + /* check for HIPWR mode */
82063 + if (SDDEVICE_GET_CARD_FLAGS(pDevice) & CARD_HIPWR) {
82064 + /* use the maximum operational power (16 bit ) from the tuple */
82065 + *pOpCurrent = CT_LE16_TO_CPU_ENDIAN(funcTuple.HiPwrMaxPwr);
82066 + }
82067 + }
82068 + return SDIO_STATUS_SUCCESS;
82069 +}
82070 +
82071 +
82072 +static INLINE void FreeMessageBlock(PSDMESSAGE_QUEUE pQueue, PSDMESSAGE_BLOCK pMsg) {
82073 + SDListInsertHead(&pQueue->FreeMessageList, &pMsg->SDList);
82074 +}
82075 +static INLINE void QueueMessageBlock(PSDMESSAGE_QUEUE pQueue, PSDMESSAGE_BLOCK pMsg) {
82076 + SDListInsertTail(&pQueue->MessageList, &pMsg->SDList);
82077 +}
82078 +static INLINE void QueueMessageToHead(PSDMESSAGE_QUEUE pQueue, PSDMESSAGE_BLOCK pMsg) {
82079 + SDListInsertHead(&pQueue->MessageList, &pMsg->SDList);
82080 +}
82081 +
82082 +static INLINE PSDMESSAGE_BLOCK GetFreeMessageBlock(PSDMESSAGE_QUEUE pQueue) {
82083 + PSDLIST pItem = SDListRemoveItemFromHead(&pQueue->FreeMessageList);
82084 + if (pItem != NULL) {
82085 + return CONTAINING_STRUCT(pItem, SDMESSAGE_BLOCK , SDList);
82086 + }
82087 + return NULL;
82088 +}
82089 +static INLINE PSDMESSAGE_BLOCK GetQueuedMessage(PSDMESSAGE_QUEUE pQueue) {
82090 + PSDLIST pItem = SDListRemoveItemFromHead(&pQueue->MessageList);
82091 + if (pItem != NULL) {
82092 + return CONTAINING_STRUCT(pItem, SDMESSAGE_BLOCK , SDList);
82093 + }
82094 + return NULL;
82095 +}
82096 +
82097 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82098 + @function: Create a message queue
82099 +
82100 + @function name: SDLIB_CreateMessageQueue
82101 + @prototype: PSDMESSAGE_QUEUE SDLIB_CreateMessageQueue(INT MaxMessages, INT MaxMessageLength)
82102 + @category: Support_Reference
82103 +
82104 + @input: MaxMessages - Maximum number of messages this queue supports
82105 + @input: MaxMessageLength - Maximum size of each message
82106 +
82107 + @return: Message queue object, NULL on failure
82108 +
82109 + @notes: This function creates a simple first-in-first-out message queue. The caller must determine
82110 + the maximum number of messages the queue supports and the size of each message. This
82111 + function will pre-allocate memory for each message. A producer of data posts a message
82112 + using SDLIB_PostMessage with a user defined data structure. A consumer of this data
82113 + can retrieve the message (in FIFO order) using SDLIB_GetMessage. A message queue does not
82114 + provide a signaling mechanism for notifying a consumer of data. Notifying a consumer is
82115 + user defined.
82116 +
82117 + @see also: SDLIB_DeleteMessageQueue, SDLIB_GetMessage, SDLIB_PostMessage.
82118 +
82119 + @example: Creating a message queue:
82120 + typedef struct _MyMessage {
82121 + UINT8 Code;
82122 + PVOID pDataBuffer;
82123 + } MyMessage;
82124 + // create message queue, 16 messages max.
82125 + pMsgQueue = SDLIB_CreateMessageQueue(16,sizeof(MyMessage));
82126 + if (NULL == pMsgQueue) {
82127 + .. failed
82128 + }
82129 +
82130 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82131 +PSDMESSAGE_QUEUE _CreateMessageQueue(INT MaxMessages, INT MaxMessageLength)
82132 +{
82133 + PSDMESSAGE_QUEUE pQueue = NULL;
82134 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
82135 + INT ii;
82136 + PSDMESSAGE_BLOCK pMsg;
82137 +
82138 + do {
82139 + pQueue = (PSDMESSAGE_QUEUE)KernelAlloc(sizeof(SDMESSAGE_QUEUE));
82140 +
82141 + if (NULL == pQueue) {
82142 + status = SDIO_STATUS_NO_RESOURCES;
82143 + break;
82144 + }
82145 + SDLIST_INIT(&pQueue->MessageList);
82146 + SDLIST_INIT(&pQueue->FreeMessageList);
82147 + pQueue->MaxMessageLength = MaxMessageLength;
82148 + status = CriticalSectionInit(&pQueue->MessageCritSection);
82149 + if (!SDIO_SUCCESS(status)) {
82150 + break;
82151 + }
82152 + /* allocate message blocks */
82153 + for (ii = 0; ii < MaxMessages; ii++) {
82154 + pMsg = (PSDMESSAGE_BLOCK)KernelAlloc(sizeof(SDMESSAGE_BLOCK) + MaxMessageLength -1);
82155 + if (NULL == pMsg) {
82156 + break;
82157 + }
82158 + FreeMessageBlock(pQueue, pMsg);
82159 + }
82160 +
82161 + if (0 == ii) {
82162 + status = SDIO_STATUS_NO_RESOURCES;
82163 + break;
82164 + }
82165 +
82166 + } while (FALSE);
82167 +
82168 + if (!SDIO_SUCCESS(status)) {
82169 + if (pQueue != NULL) {
82170 + _DeleteMessageQueue(pQueue);
82171 + pQueue = NULL;
82172 + }
82173 + }
82174 + return pQueue;
82175 +}
82176 +
82177 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82178 + @function: Delete a message queue
82179 +
82180 + @function name: SDLIB_DeleteMessageQueue
82181 + @prototype: void SDLIB_DeleteMessageQueue(PSDMESSAGE_QUEUE pQueue)
82182 + @category: Support_Reference
82183 +
82184 + @input: pQueue - message queue to delete
82185 +
82186 + @notes: This function flushes the message queue and frees all memory allocated for
82187 + messages.
82188 +
82189 + @see also: SDLIB_CreateMessageQueue
82190 +
82191 + @example: Deleting a message queue:
82192 + if (pMsgQueue != NULL) {
82193 + SDLIB_DeleteMessageQueue(pMsgQueue);
82194 + }
82195 +
82196 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82197 +void _DeleteMessageQueue(PSDMESSAGE_QUEUE pQueue)
82198 +{
82199 + PSDMESSAGE_BLOCK pMsg;
82200 + SDIO_STATUS status;
82201 + CT_DECLARE_IRQ_SYNC_CONTEXT();
82202 +
82203 + status = CriticalSectionAcquireSyncIrq(&pQueue->MessageCritSection);
82204 +
82205 + /* cleanup free list */
82206 + while (1) {
82207 + pMsg = GetFreeMessageBlock(pQueue);
82208 + if (pMsg != NULL) {
82209 + KernelFree(pMsg);
82210 + } else {
82211 + break;
82212 + }
82213 + }
82214 + /* cleanup any in the queue */
82215 + while (1) {
82216 + pMsg = GetQueuedMessage(pQueue);
82217 + if (pMsg != NULL) {
82218 + KernelFree(pMsg);
82219 + } else {
82220 + break;
82221 + }
82222 + }
82223 +
82224 + status = CriticalSectionReleaseSyncIrq(&pQueue->MessageCritSection);
82225 + CriticalSectionDelete(&pQueue->MessageCritSection);
82226 + KernelFree(pQueue);
82227 +
82228 +}
82229 +
82230 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82231 + @function: Post a message queue
82232 +
82233 + @function name: SDLIB_PostMessage
82234 + @prototype: SDIO_STATUS SDLIB_PostMessage(PSDMESSAGE_QUEUE pQueue, PVOID pMessage, INT MessageLength)
82235 + @category: Support_Reference
82236 +
82237 + @input: pQueue - message queue to post to
82238 + @input: pMessage - message to post
82239 + @input: MessageLength - length of message (for validation)
82240 +
82241 + @return: SDIO_STATUS
82242 +
82243 + @notes: The message queue uses an internal list of user defined message structures. When
82244 + posting a message the message is copied into an allocated structure and queued. The memory
82245 + pointed to by pMessage does not need to be allocated and can reside on the stack.
82246 + The length of the message to post can be smaller that the maximum message size. This allows
82247 + for variable length messages up to the maximum message size. This
82248 + function returns SDIO_STATUS_NO_RESOURCES, if the message queue is full. This
82249 + function returns SDIO_STATUS_BUFFER_TOO_SMALL, if the message size exceeds the maximum
82250 + size of a message. Posting and getting messsages from a message queue is safe in any
82251 + driver context.
82252 +
82253 + @see also: SDLIB_CreateMessageQueue , SDLIB_GetMessage
82254 +
82255 + @example: Posting a message
82256 + MyMessage message;
82257 + // set up message
82258 + message.code = MESSAGE_DATA_READY;
82259 + message.pData = pInstance->pDataBuffers[currentIndex];
82260 + // post message
82261 + status = SDLIB_PostMessage(pInstance->pReadQueue,&message,sizeof(message));
82262 + if (!SDIO_SUCCESS(status)) {
82263 + // failed
82264 + }
82265 +
82266 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82267 +SDIO_STATUS _PostMessage(PSDMESSAGE_QUEUE pQueue, PVOID pMessage, INT MessageLength)
82268 +{
82269 + SDIO_STATUS status2;
82270 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
82271 + PSDMESSAGE_BLOCK pMsg;
82272 + CT_DECLARE_IRQ_SYNC_CONTEXT();
82273 +
82274 + if (MessageLength > pQueue->MaxMessageLength) {
82275 + return SDIO_STATUS_BUFFER_TOO_SMALL;
82276 + }
82277 +
82278 + status = CriticalSectionAcquireSyncIrq(&pQueue->MessageCritSection);
82279 + if (!SDIO_SUCCESS(status)) {
82280 + return status;
82281 + }
82282 +
82283 + do {
82284 + /* get a message block */
82285 + pMsg = GetFreeMessageBlock(pQueue);
82286 + if (NULL == pMsg) {
82287 + status = SDIO_STATUS_NO_RESOURCES;
82288 + break;
82289 + }
82290 + /* copy the message */
82291 + memcpy(pMsg->MessageStart,pMessage,MessageLength);
82292 + /* set the length of the message */
82293 + pMsg->MessageLength = MessageLength;
82294 + /* queue the message to the list */
82295 + QueueMessageBlock(pQueue,pMsg);
82296 + } while (FALSE);
82297 +
82298 + status2 = CriticalSectionReleaseSyncIrq(&pQueue->MessageCritSection);
82299 + return status;
82300 +}
82301 +
82302 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82303 + @function: Get a message from a message queue
82304 +
82305 + @function name: SDLIB_GetMessage
82306 + @prototype: SDIO_STATUS SDLIB_GetMessage(PSDMESSAGE_QUEUE pQueue, PVOID pData, INT *pBufferLength)
82307 + @category: Support_Reference
82308 +
82309 + @input: pQueue - message queue to retreive a message from
82310 + @input: pBufferLength - on entry, the length of the data buffer
82311 + @output: pData - buffer to hold the message
82312 + @output: pBufferLength - on return, contains the number of bytes copied
82313 +
82314 + @return: SDIO_STATUS
82315 +
82316 + @notes: The message queue uses an internal list of user defined message structures. The message is
82317 + dequeued (FIFO order) and copied to the callers buffer. The internal allocation for the message
82318 + is returned back to the message queue. This function returns SDIO_STATUS_NO_MORE_MESSAGES
82319 + if the message queue is empty. If the length of the buffer is smaller than the length of
82320 + the message at the head of the queue,this function returns SDIO_STATUS_BUFFER_TOO_SMALL and
82321 + returns the required length in pBufferLength.
82322 +
82323 + @see also: SDLIB_CreateMessageQueue , SDLIB_PostMessage
82324 +
82325 + @example: Getting a message
82326 + MyMessage message;
82327 + INT length;
82328 + // set length
82329 + length = sizeof(message);
82330 + // post message
82331 + status = SDLIB_GetMessage(pInstance->pReadQueue,&message,&length);
82332 + if (!SDIO_SUCCESS(status)) {
82333 + // failed
82334 + }
82335 +
82336 + @example: Checking queue for a message and getting the size of the message
82337 + INT length;
82338 + // use zero length to get the size of the message
82339 + length = 0;
82340 + status = SDLIB_GetMessage(pInstance->pReadQueue,NULL,&length);
82341 + if (status == SDIO_STATUS_NO_MORE_MESSAGES) {
82342 + // no messages in queue
82343 + } else if (status == SDIO_STATUS_BUFFER_TOO_SMALL) {
82344 + // message exists in queue and length of message is returned
82345 + messageSizeInQueue = length;
82346 + } else {
82347 + // some other failure
82348 + }
82349 +
82350 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82351 +SDIO_STATUS _GetMessage(PSDMESSAGE_QUEUE pQueue, PVOID pData, INT *pBufferLength)
82352 +{
82353 + SDIO_STATUS status2;
82354 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
82355 + PSDMESSAGE_BLOCK pMsg;
82356 + CT_DECLARE_IRQ_SYNC_CONTEXT();
82357 +
82358 + status = CriticalSectionAcquireSyncIrq(&pQueue->MessageCritSection);
82359 + if (!SDIO_SUCCESS(status)) {
82360 + return status;
82361 + }
82362 +
82363 + do {
82364 + pMsg = GetQueuedMessage(pQueue);
82365 + if (NULL == pMsg) {
82366 + status = SDIO_STATUS_NO_MORE_MESSAGES;
82367 + break;
82368 + }
82369 + if (*pBufferLength < pMsg->MessageLength) {
82370 + /* caller buffer is too small */
82371 + *pBufferLength = pMsg->MessageLength;
82372 + /* stick it back to the front */
82373 + QueueMessageToHead(pQueue, pMsg);
82374 + status = SDIO_STATUS_BUFFER_TOO_SMALL;
82375 + break;
82376 + }
82377 + /* copy the message to the callers buffer */
82378 + memcpy(pData,pMsg->MessageStart,pMsg->MessageLength);
82379 + /* return actual length */
82380 + *pBufferLength = pMsg->MessageLength;
82381 + /* return this message block back to the free list */
82382 + FreeMessageBlock(pQueue, pMsg);
82383 +
82384 + } while (FALSE);
82385 +
82386 + status2 = CriticalSectionReleaseSyncIrq(&pQueue->MessageCritSection);
82387 +
82388 + return status;
82389 +}
82390 +
82391 +/* the following documents the OS helper APIs */
82392 +
82393 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82394 + @function: Create an OS-specific helper task/thread
82395 +
82396 + @function name: SDLIB_OSCreateHelper
82397 + @prototype: SDIO_STATUS SDLIB_OSCreateHelper(POSKERNEL_HELPER pHelper,
82398 + PHELPER_FUNCTION pFunction,
82399 + PVOID pContext)
82400 + @category: Support_Reference
82401 +
82402 + @input: pHelper - caller allocated helper object
82403 + @input: pFunction - helper function
82404 + @input: pContext - helper context
82405 +
82406 + @return: SDIO_STATUS
82407 +
82408 + @notes: This function creates a helper task/thread that runs in a new execution context. The newly
82409 + created task/thread invokes the helper function. The thread/task exits when the helper
82410 + function returns. The helper function has the prototype of:
82411 + THREAD_RETURN HelperFunction(POSKERNEL_HELPER pHelper)
82412 + The helper function usually implements a while loop and suspends execution using
82413 + SD_WAIT_FOR_WAKEUP(). On exit the helper function can return an OS-specific THREAD_RETURN
82414 + code (usually zero). The helper function executes in a fully schedule-able context and
82415 + can block on semaphores and sleep.
82416 +
82417 + @see also: SDLIB_OSDeleteHelper , SD_WAIT_FOR_WAKEUP
82418 +
82419 + @example: A thread helper function:
82420 + THREAD_RETURN HelperFunction(POSKERNEL_HELPER pHelper)
82421 + {
82422 + SDIO_STATUS status;
82423 + PMYCONTEXT pContext = (PMYCONTEXT)SD_GET_OS_HELPER_CONTEXT(pHelper);
82424 + // wait for wake up
82425 + while(1) {
82426 + status = SD_WAIT_FOR_WAKEUP(pHelper);
82427 + if (!SDIO_SUCCESS(status)) {
82428 + break;
82429 + }
82430 + if (SD_IS_HELPER_SHUTTING_DOWN(pHelper)) {
82431 + //... shutting down
82432 + break;
82433 + }
82434 + // handle wakeup...
82435 + }
82436 + return 0;
82437 + }
82438 +
82439 + @example: Creating a helper:
82440 + status = SDLIB_OSCreateHelper(&pInstance->OSHelper,HelperFunction,pInstance);
82441 + if (!SDIO_SUCCESS(status)) {
82442 + // failed
82443 + }
82444 +
82445 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82446 +
82447 +/**++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82448 + @function: Delete an OS helper task/thread
82449 +
82450 + @function name: SDLIB_OSDeleteHelper
82451 + @prototype: void SDLIB_OSDeleteHelper(POSKERNEL_HELPER pHelper)
82452 + @category: Support_Reference
82453 +
82454 + @input: pHelper - caller allocated helper object
82455 +
82456 + @notes: This function wakes the helper and waits(blocks) until the helper exits. The caller can
82457 + only pass an OS helper structure that was initialized sucessfully by
82458 + SDLIB_OSCreateHelper. The caller must be in a schedulable context.
82459 +
82460 + @see also: SDLIB_OSCreateHelper
82461 +
82462 + @example: Deleting a helper:
82463 + if (pInstance->HelperCreated) {
82464 + // clean up the helper if we successfully created it
82465 + SDLIB_OSDeleteHelper(&pInstance->OSHelper);
82466 + }
82467 +
82468 +
82469 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82470 +
82471 +
82472 Index: linux-2.6.24.7/drivers/sdio/stack/lib/_sdio_lib.h
82473 ===================================================================
82474 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
82475 +++ linux-2.6.24.7/drivers/sdio/stack/lib/_sdio_lib.h 2008-12-11 22:46:49.000000000 +0100
82476 @@ -0,0 +1,50 @@
82477 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82478 +@file: _sdio_lib.h
82479 +
82480 +@abstract: SDIO Lib internal include
82481 +
82482 +#notes:
82483 +
82484 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
82485 +
82486 +
82487 + *
82488 + * This program is free software; you can redistribute it and/or modify
82489 + * it under the terms of the GNU General Public License version 2 as
82490 + * published by the Free Software Foundation;
82491 + *
82492 + * Software distributed under the License is distributed on an "AS
82493 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
82494 + * implied. See the License for the specific language governing
82495 + * rights and limitations under the License.
82496 + *
82497 + * Portions of this code were developed with information supplied from the
82498 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
82499 + *
82500 + * The following conditions apply to the release of the SD simplified specification (�Simplified
82501 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
82502 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
82503 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
82504 + * Specification may require a license from the SD Card Association or other third parties.
82505 + * Disclaimers:
82506 + * The information contained in the Simplified Specification is presented only as a standard
82507 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
82508 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
82509 + * any damages, any infringements of patents or other right of the SD Card Association or any third
82510 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
82511 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
82512 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
82513 + * information, know-how or other confidential information to any third party.
82514 + *
82515 + *
82516 + * The initial developers of the original code are Seung Yi and Paul Lever
82517 + *
82518 + * sdio@atheros.com
82519 + *
82520 + *
82521 +
82522 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82523 +#ifndef ___SDIO_LIB_H___
82524 +#define ___SDIO_LIB_H___
82525 +
82526 +#endif /* ___SDIO_LIB_H___*/
82527 Index: linux-2.6.24.7/drivers/sdio/stack/lib/sdio_lib_os.c
82528 ===================================================================
82529 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
82530 +++ linux-2.6.24.7/drivers/sdio/stack/lib/sdio_lib_os.c 2008-12-11 22:46:49.000000000 +0100
82531 @@ -0,0 +1,251 @@
82532 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82533 +@file: sdio_function_os.c
82534 +
82535 +@abstract: Linux implementation module for SDIO library
82536 +
82537 +#notes: includes module load and unload functions
82538 +
82539 +@notice: Copyright (c), 2004 Atheros Communications, Inc.
82540 +
82541 +
82542 + *
82543 + * This program is free software; you can redistribute it and/or modify
82544 + * it under the terms of the GNU General Public License version 2 as
82545 + * published by the Free Software Foundation;
82546 + *
82547 + * Software distributed under the License is distributed on an "AS
82548 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
82549 + * implied. See the License for the specific language governing
82550 + * rights and limitations under the License.
82551 + *
82552 + * Portions of this code were developed with information supplied from the
82553 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
82554 + *
82555 + * The following conditions apply to the release of the SD simplified specification (�Simplified
82556 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
82557 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
82558 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
82559 + * Specification may require a license from the SD Card Association or other third parties.
82560 + * Disclaimers:
82561 + * The information contained in the Simplified Specification is presented only as a standard
82562 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
82563 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
82564 + * any damages, any infringements of patents or other right of the SD Card Association or any third
82565 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
82566 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
82567 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
82568 + * information, know-how or other confidential information to any third party.
82569 + *
82570 + *
82571 + * The initial developers of the original code are Seung Yi and Paul Lever
82572 + *
82573 + * sdio@atheros.com
82574 + *
82575 + *
82576 +
82577 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82578 +/* debug level for this module*/
82579 +#define DBG_DECLARE 4;
82580 +#include <linux/sdio/ctsystem.h>
82581 +
82582 +#include <linux/module.h>
82583 +#include <linux/init.h>
82584 +#include <linux/kthread.h>
82585 +
82586 +#include <linux/sdio/sdio_busdriver.h>
82587 +#include <linux/sdio/sdio_lib.h>
82588 +#include "_sdio_lib.h"
82589 +
82590 +#define DESCRIPTION "SDIO Kernel Library"
82591 +#define AUTHOR "Atheros Communications, Inc."
82592 +
82593 +/* proxies */
82594 +SDIO_STATUS SDLIB_IssueCMD52(PSDDEVICE pDevice,
82595 + UINT8 FuncNo,
82596 + UINT32 Address,
82597 + PUINT8 pData,
82598 + INT ByteCount,
82599 + BOOL Write)
82600 +{
82601 + return _SDLIB_IssueCMD52(pDevice,FuncNo,Address,pData,ByteCount,Write);
82602 +}
82603 +
82604 +SDIO_STATUS SDLIB_FindTuple(PSDDEVICE pDevice,
82605 + UINT8 Tuple,
82606 + UINT32 *pTupleScanAddress,
82607 + PUINT8 pBuffer,
82608 + UINT8 *pLength)
82609 +{
82610 + return _SDLIB_FindTuple(pDevice,Tuple,pTupleScanAddress,pBuffer,pLength);
82611 +}
82612 +
82613 +SDIO_STATUS SDLIB_IssueConfig(PSDDEVICE pDevice,
82614 + SDCONFIG_COMMAND Command,
82615 + PVOID pData,
82616 + INT Length)
82617 +{
82618 + return _SDLIB_IssueConfig(pDevice,Command,pData,Length);
82619 +}
82620 +
82621 +void SDLIB_PrintBuffer(PUCHAR pBuffer,INT Length,PTEXT pDescription)
82622 +{
82623 + _SDLIB_PrintBuffer(pBuffer,Length,pDescription);
82624 +}
82625 +
82626 +SDIO_STATUS SDLIB_SetFunctionBlockSize(PSDDEVICE pDevice,
82627 + UINT16 BlockSize)
82628 +{
82629 + return _SDLIB_SetFunctionBlockSize(pDevice,BlockSize);
82630 +}
82631 +
82632 +void SDLIB_SetupCMD52Request(UINT8 FuncNo,
82633 + UINT32 Address,
82634 + BOOL Write,
82635 + UINT8 WriteData,
82636 + PSDREQUEST pRequest)
82637 +{
82638 + _SDLIB_SetupCMD52Request(FuncNo,Address,Write,WriteData,pRequest);
82639 +}
82640 +
82641 +SDIO_STATUS SDLIB_GetDefaultOpCurrent(PSDDEVICE pDevice, SD_SLOT_CURRENT *pOpCurrent)
82642 +{
82643 + return _SDLIB_GetDefaultOpCurrent(pDevice,pOpCurrent);
82644 +}
82645 +
82646 +/* helper function launcher */
82647 +INT HelperLaunch(PVOID pContext)
82648 +{
82649 + INT exit;
82650 + /* call function */
82651 + exit = ((POSKERNEL_HELPER)pContext)->pHelperFunc((POSKERNEL_HELPER)pContext);
82652 + complete_and_exit(&((POSKERNEL_HELPER)pContext)->Completion, exit);
82653 + return exit;
82654 +}
82655 +
82656 +/*
82657 + * OSCreateHelper - create a worker kernel thread
82658 +*/
82659 +SDIO_STATUS SDLIB_OSCreateHelper(POSKERNEL_HELPER pHelper,
82660 + PHELPER_FUNCTION pFunction,
82661 + PVOID pContext)
82662 +{
82663 + SDIO_STATUS status = SDIO_STATUS_SUCCESS;
82664 +
82665 + memset(pHelper,0,sizeof(OSKERNEL_HELPER));
82666 +
82667 + do {
82668 + pHelper->pContext = pContext;
82669 + pHelper->pHelperFunc = pFunction;
82670 + status = SignalInitialize(&pHelper->WakeSignal);
82671 + if (!SDIO_SUCCESS(status)) {
82672 + break;
82673 + }
82674 + init_completion(&pHelper->Completion);
82675 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
82676 + pHelper->pTask = kthread_create(HelperLaunch,
82677 + (PVOID)pHelper,
82678 + "SDIO Helper");
82679 + if (NULL == pHelper->pTask) {
82680 + status = SDIO_STATUS_NO_RESOURCES;
82681 + break;
82682 + }
82683 + wake_up_process(pHelper->pTask);
82684 +#else
82685 + /* 2.4 */
82686 + pHelper->pTask = kernel_thread(HelperLaunch,
82687 + (PVOID)pHelper,
82688 + (CLONE_FS | CLONE_FILES | SIGCHLD));
82689 + if (pHelper->pTask < 0) {
82690 + DBG_PRINT(SDDBG_TRACE,
82691 + ("SDIO BusDriver - OSCreateHelper, failed to create thread\n"));
82692 + }
82693 +#endif
82694 +
82695 + } while (FALSE);
82696 +
82697 + if (!SDIO_SUCCESS(status)) {
82698 + SDLIB_OSDeleteHelper(pHelper);
82699 + }
82700 + return status;
82701 +}
82702 +
82703 +/*
82704 + * OSDeleteHelper - delete thread created with OSCreateHelper
82705 +*/
82706 +void SDLIB_OSDeleteHelper(POSKERNEL_HELPER pHelper)
82707 +{
82708 +
82709 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
82710 + if (pHelper->pTask != NULL) {
82711 +#else
82712 + /* 2.4 */
82713 + if (pHelper->pTask >= 0) {
82714 +#endif
82715 + pHelper->ShutDown = TRUE;
82716 + SignalSet(&pHelper->WakeSignal);
82717 + /* wait for thread to exit */
82718 + wait_for_completion(&pHelper->Completion);
82719 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
82720 + pHelper->pTask = NULL;
82721 +#else
82722 + /* 2.4 */
82723 + pHelper->pTask = 0;
82724 +#endif
82725 + }
82726 +
82727 + SignalDelete(&pHelper->WakeSignal);
82728 +}
82729 +
82730 +/*
82731 + * module init
82732 +*/
82733 +static int __init sdio_lib_init(void) {
82734 + REL_PRINT(SDDBG_TRACE, ("SDIO Library load\n"));
82735 + return 0;
82736 +}
82737 +
82738 +/*
82739 + * module cleanup
82740 +*/
82741 +static void __exit sdio_lib_cleanup(void) {
82742 + REL_PRINT(SDDBG_TRACE, ("SDIO Library unload\n"));
82743 +}
82744 +
82745 +PSDMESSAGE_QUEUE SDLIB_CreateMessageQueue(INT MaxMessages, INT MaxMessageLength)
82746 +{
82747 + return _CreateMessageQueue(MaxMessages,MaxMessageLength);
82748 +
82749 +}
82750 +void SDLIB_DeleteMessageQueue(PSDMESSAGE_QUEUE pQueue)
82751 +{
82752 + _DeleteMessageQueue(pQueue);
82753 +}
82754 +
82755 +SDIO_STATUS SDLIB_PostMessage(PSDMESSAGE_QUEUE pQueue, PVOID pMessage, INT MessageLength)
82756 +{
82757 + return _PostMessage(pQueue,pMessage,MessageLength);
82758 +}
82759 +
82760 +SDIO_STATUS SDLIB_GetMessage(PSDMESSAGE_QUEUE pQueue, PVOID pData, INT *pBufferLength)
82761 +{
82762 + return _GetMessage(pQueue,pData,pBufferLength);
82763 +}
82764 +
82765 +MODULE_LICENSE("GPL and additional rights");
82766 +MODULE_DESCRIPTION(DESCRIPTION);
82767 +MODULE_AUTHOR(AUTHOR);
82768 +module_init(sdio_lib_init);
82769 +module_exit(sdio_lib_cleanup);
82770 +EXPORT_SYMBOL(SDLIB_IssueCMD52);
82771 +EXPORT_SYMBOL(SDLIB_FindTuple);
82772 +EXPORT_SYMBOL(SDLIB_IssueConfig);
82773 +EXPORT_SYMBOL(SDLIB_PrintBuffer);
82774 +EXPORT_SYMBOL(SDLIB_SetFunctionBlockSize);
82775 +EXPORT_SYMBOL(SDLIB_SetupCMD52Request);
82776 +EXPORT_SYMBOL(SDLIB_GetDefaultOpCurrent);
82777 +EXPORT_SYMBOL(SDLIB_OSCreateHelper);
82778 +EXPORT_SYMBOL(SDLIB_OSDeleteHelper);
82779 +EXPORT_SYMBOL(SDLIB_CreateMessageQueue);
82780 +EXPORT_SYMBOL(SDLIB_DeleteMessageQueue);
82781 +EXPORT_SYMBOL(SDLIB_PostMessage);
82782 +EXPORT_SYMBOL(SDLIB_GetMessage);
82783 Index: linux-2.6.24.7/drivers/sdio/stack/Makefile
82784 ===================================================================
82785 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
82786 +++ linux-2.6.24.7/drivers/sdio/stack/Makefile 2008-12-11 22:46:49.000000000 +0100
82787 @@ -0,0 +1 @@
82788 +obj-$(CONFIG_SDIO) += busdriver/ lib/
82789 \ No newline at end of file
82790 Index: linux-2.6.24.7/drivers/sdio/stack/platform/Makefile
82791 ===================================================================
82792 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
82793 +++ linux-2.6.24.7/drivers/sdio/stack/platform/Makefile 2008-12-11 22:46:49.000000000 +0100
82794 @@ -0,0 +1,2 @@
82795 +obj-$(CONFIG_SDIO) += sdio_platform.o
82796 +sdio_platform-objs := sdioplatformdriver.o
82797 \ No newline at end of file
82798 Index: linux-2.6.24.7/drivers/sdio/stack/platform/sdioplatformdriver.c
82799 ===================================================================
82800 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
82801 +++ linux-2.6.24.7/drivers/sdio/stack/platform/sdioplatformdriver.c 2008-12-11 22:46:49.000000000 +0100
82802 @@ -0,0 +1,300 @@
82803 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
82804 +@file: sdioplatformdriver.c
82805 +
82806 +@abstract: Linux implementation module for SDIO pltaform driver
82807 +
82808 +#notes:
82809 +
82810 +@notice: Copyright (c), 2006 Atheros Communications, Inc.
82811 +
82812 +@license: This program is free software; you can redistribute it and/or modify
82813 + it under the terms of the GNU General Public License version 2 as
82814 + published by the Free Software Foundation.
82815 +
82816 +
82817 +
82818 + *
82819 + * This program is free software; you can redistribute it and/or modify
82820 + * it under the terms of the GNU General Public License version 2 as
82821 + * published by the Free Software Foundation;
82822 + *
82823 + * Software distributed under the License is distributed on an "AS
82824 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
82825 + * implied. See the License for the specific language governing
82826 + * rights and limitations under the License.
82827 + *
82828 + * Portions of this code were developed with information supplied from the
82829 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
82830 + *
82831 + * The following conditions apply to the release of the SD simplified specification (�Simplified
82832 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
82833 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
82834 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
82835 + * Specification may require a license from the SD Card Association or other third parties.
82836 + * Disclaimers:
82837 + * The information contained in the Simplified Specification is presented only as a standard
82838 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
82839 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
82840 + * any damages, any infringements of patents or other right of the SD Card Association or any third
82841 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
82842 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
82843 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
82844 + * information, know-how or other confidential information to any third party.
82845 + *
82846 + *
82847 + * The initial developers of the original code are Seung Yi and Paul Lever
82848 + *
82849 + * sdio@atheros.com
82850 + *
82851 + *
82852 +
82853 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
82854 +
82855 +#define DESCRIPTION "SDIO Platform Driver"
82856 +#define AUTHOR "Atheros Communications, Inc."
82857 +
82858 +//??for .h
82859 +
82860 +struct sdioplatform_peripheral {
82861 + struct list_head node;
82862 + struct sdioplatform_controller *controller;
82863 + struct device dev;
82864 +};
82865 +struct sdioplatform_driver {
82866 + struct device_driver drv;
82867 + int (*probe)(struct sdioplatform_peripheral *);
82868 + void (*remove)(struct sdioplatform_peripheral *);
82869 + int (*suspend)(struct sdioplatform_peripheral *, pm_message_t);
82870 + int (*resume)(struct sdioplatform_peripheral *);
82871 +};
82872 +
82873 +
82874 +struct sdioplatform_controller {
82875 + struct device *dev;
82876 +};
82877 +struct sdioplatform_controller_driver {
82878 + struct device_driver drv;
82879 + int (*probe)(struct sdioplatform_controller *);
82880 + void (*remove)(struct sdioplatform_controller *);
82881 + int (*suspend)(struct sdioplatform_controller *, pm_message_t);
82882 + int (*resume)(struct sdioplatform_controller *);
82883 +};
82884 +
82885 +
82886 +
82887 +#define device_to_sdioplatform_peripheral(d) container_of(d, struct sdioplatform_peripheral, dev)
82888 +#define driver_to_sdioplatform_driver(d) container_of(d, struct sdioplatform_driver, drv)
82889 +
82890 +#define device_to_sdioplatform_controller(d) container_of(d, struct sdioplatform_controller, dev)
82891 +#define driver_to_sdioplatform_controller_driver(d) container_of(d, struct sdioplatform_controller_driver, drv)
82892 +
82893 +#define SDIOPLATFORM_ATTR(name, fmt, args...) \
82894 +static ssize_t sdio_##name##_show (struct device *dev, struct device_attribute *attr, char *buf) \
82895 +{ \
82896 + struct sdioplatform_peripheral *peripheral = device_to_sdioplatform_peripheral(dev); \
82897 + return sprintf(buf, fmt, args); \
82898 +}
82899 +
82900 +SDIOPLATFORM_ATTR(bus_id, "%s\n", bus_id);
82901 +#define SDIOPLATFORM_ATTR_RO(name) __ATTR(name, S_IRUGO, sdioplatform_##name##_show, NULL)
82902 +
82903 +static struct device_attribute sdioplatform_dev_attrs[] = {
82904 + SDIOPLATFORM_ATTR_RO(bus_id),
82905 + __ATTR_NULL
82906 +};
82907 +
82908 +static struct bus_type sdioplatform_bus_type = {
82909 + .name = "sdioplatform",
82910 + .dev_attrs = sdioplatform_dev_attrs,
82911 + .match = sdioplatform_bus_match,
82912 + .hotplug = NULL,
82913 + .suspend = sdioplatform_bus_suspend,
82914 + .resume = sdioplatform_bus_resume,
82915 +};
82916 +
82917 +
82918 +/* controller functions */
82919 +static int sdioplatform_controllerdrv_probe(struct device *dev)
82920 +{
82921 + struct sdioplatform_controller_driver *drv = driver_to_sdioplatform_controller_driver(dev->driver);
82922 + struct sdioplatform_controller *controller = device_to_sdioplatform_controller(dev);
82923 +
82924 + return drv->probe(controller);
82925 +}
82926 +
82927 +static int sdioplatform_controllerdrv_remove(struct device *dev)
82928 +{
82929 + struct sdioplatform_controller_driver *drv = driver_to_sdioplatform_controller_driver(dev->driver);
82930 + struct sdioplatform_controller *controller = device_to_sdioplatform_controller(dev);
82931 +
82932 + return drv->remove(controller);
82933 +}
82934 +
82935 +/*
82936 + * sdioplatform_register_controller_driver - register a controller driver
82937 + */
82938 +int sdioplatform_register_controller_driver(struct sdioplatform_controller_driver *drv)
82939 +{
82940 + drv->drv.bus = &sdioplatform_bus_type;
82941 + drv->drv.probe = sdioplatform_controllerdrv_probe;
82942 + drv->drv.remove = sdioplatform_controllerdrv_remove;
82943 + return driver_register(&drv->drv);
82944 +}
82945 +
82946 +/*
82947 + * sdioplatform_unregister_controller_driver - unregister a controller driver
82948 + */
82949 +void sdioplatform_unregister_controller_driver(struct sdioplatform_driver *drv)
82950 +{
82951 + driver_unregister(&drv->drv);
82952 +}
82953 +
82954 +/*
82955 + * sdioplatform_add_controller - register a controller device
82956 + */
82957 +int sdioplatform_add_controller(char *name, struct sdioplatform_controller *dev)
82958 +{
82959 + if (!dev) {
82960 + return -EINVAL;
82961 + }
82962 + strncpy(dev->dev.bus_id, BUS_ID_SIZE, name);
82963 + return device_register(&dev->dev);
82964 +}
82965 +
82966 +/*
82967 + * sdioplatform_remove_controller - unregister a controller device
82968 + */
82969 +int sdioplatform_remove_controller(char *name, struct sdioplatform_controller *dev)
82970 +{
82971 + if (!dev) {
82972 + return -EINVAL;
82973 + }
82974 + return device_unregister(&dev->dev);
82975 +}
82976 +
82977 +/* peripheral functions */
82978 +static int sdioplatform_drv_probe(struct device *dev)
82979 +{
82980 + struct sdioplatform_driver *drv = driver_to_sdioplatform_driver(dev->driver);
82981 + struct sdioplatform_peripheral *peripheral = device_to_sdioplatform_peripheral(dev);
82982 +
82983 + return drv->probe(peripheral);
82984 +}
82985 +
82986 +static int sdioplatform_controllerdrv_remove(struct device *dev)
82987 +{
82988 + struct sdioplatform_controller_driver *drv = driver_to_sdioplatform_controller_driver(dev->driver);
82989 + struct sdioplatform_controller *controller = device_to_sdioplatform_controller(dev);
82990 +
82991 + return drv->remove(controller);
82992 +}
82993 +
82994 +/*
82995 + * sdioplatform_register_driver - register a driver
82996 + */
82997 +int sdioplatform_register_driver(struct sdioplatform_driver *drv)
82998 +{
82999 + drv->drv.bus = &sdioplatform_bus_type;
83000 + drv->drv.probe = sdioplatform_drv_probe;
83001 + drv->drv.remove = sdioplatform_drv_remove;
83002 + return driver_register(&drv->drv);
83003 +}
83004 +
83005 +/*
83006 + * sdioplatform_unregister_driver - unregister a driver
83007 + */
83008 +void sdioplatform_unregister_driver(struct sdioplatform_driver *drv)
83009 +{
83010 + driver_unregister(&drv->drv);
83011 +}
83012 +
83013 +/*
83014 + * sdioplatform_add_peripheral - register a peripheral device
83015 + */
83016 +int sdioplatform_add_peripheral(char *name, struct sdioplatform_peripheral *dev)
83017 +{
83018 + if (!dev) {
83019 + return -EINVAL;
83020 + }
83021 + strncpy(dev->dev.bus_id, BUS_ID_SIZE, name);
83022 + return device_register(&dev->dev);
83023 +}
83024 +
83025 +/*
83026 + * sdioplatform_remove_peripheral - unregister a peripheral device
83027 + */
83028 +int sdioplatform_remove_peripheral(char *name, struct sdioplatform_peripheral *dev)
83029 +{
83030 + if (!dev) {
83031 + return -EINVAL;
83032 + }
83033 + return device_unregister(&dev->dev);
83034 +}
83035 +
83036 +
83037 +
83038 +
83039 +
83040 +static int sdioplatform_bus_match(struct device *dev, struct device_driver *drv)
83041 +{
83042 + /* probes handle the matching */
83043 + return 1;
83044 +}
83045 +
83046 +static int sdioplatform_bus_suspend(struct device *dev, pm_message_t state)
83047 +{
83048 + struct sdioplatform_driver *drv = driver_to_sdioplatform_driver(dev->driver);
83049 + struct sdioplatform_peripheral *peripheral = device_to_sdioplatform_peripheral(dev);
83050 + int ret = 0;
83051 +
83052 + if (peripheral->driver && drv->suspend) {
83053 + ret = drv->suspend(peripheral, state);
83054 + }
83055 + return ret;
83056 +}
83057 +
83058 +static int sdioplatform_bus_resume(struct device *dev)
83059 +{
83060 + struct sdioplatform_driver *drv = driver_to_sdioplatform_driver(dev->driver);
83061 + struct sdioplatform_peripheral *peripheral = device_to_sdioplatform_peripheral(dev);
83062 + int ret = 0;
83063 +
83064 + if (peripheral->driver && drv->resume) {
83065 + ret = drv->resume(card);
83066 + }
83067 + return ret;
83068 +}
83069 +
83070 +/*
83071 + * module init
83072 +*/
83073 +static int __init sdio_platformdriver_init(void) {
83074 + int ret = bus_register(&sdioplatform_bus_type);
83075 + return ret;
83076 +}
83077 +
83078 +/*
83079 + * module cleanup
83080 +*/
83081 +static void __exit sdio_platformdriver_cleanup(void) {
83082 + REL_PRINT(SDDBG_TRACE, ("SDIO unloaded\n"));
83083 + _SDIO_BusDriverCleanup();
83084 +}
83085 +
83086 +MODULE_LICENSE("GPL");
83087 +MODULE_DESCRIPTION(DESCRIPTION);
83088 +MODULE_AUTHOR(AUTHOR);
83089 +
83090 +module_init(sdio_platformdriver_init);
83091 +module_exit(sdio_platformdriver_cleanup);
83092 +EXPORT_SYMBOL(sdioplatform_register_controller_driver);
83093 +EXPORT_SYMBOL(sdioplatform_unregister_controller_driver);
83094 +EXPORT_SYMBOL(sdioplatform_add_controller);
83095 +EXPORT_SYMBOL(sdioplatform_remove_controller);
83096 +EXPORT_SYMBOL(sdioplatform_register_driver);
83097 +EXPORT_SYMBOL(sdioplatform_unregister_driver);
83098 +EXPORT_SYMBOL(sdioplatform_add_peripheral);
83099 +EXPORT_SYMBOL(sdioplatform_remove_peripheral);
83100 +
83101 +
83102 +
83103 Index: linux-2.6.24.7/drivers/serial/s3c2410.c
83104 ===================================================================
83105 --- linux-2.6.24.7.orig/drivers/serial/s3c2410.c 2008-12-11 22:46:07.000000000 +0100
83106 +++ linux-2.6.24.7/drivers/serial/s3c2410.c 2008-12-11 22:46:49.000000000 +0100
83107 @@ -72,6 +72,7 @@
83108 #include <linux/serial.h>
83109 #include <linux/delay.h>
83110 #include <linux/clk.h>
83111 +#include <linux/resume-dependency.h>
83112
83113 #include <asm/io.h>
83114 #include <asm/irq.h>
83115 @@ -80,6 +81,7 @@
83116
83117 #include <asm/plat-s3c/regs-serial.h>
83118 #include <asm/arch/regs-gpio.h>
83119 +#include <asm/arch/regs-clock.h>
83120
83121 /* structures */
83122
83123 @@ -112,6 +114,9 @@ struct s3c24xx_uart_port {
83124 struct clk *clk;
83125 struct clk *baudclk;
83126 struct uart_port port;
83127 +
83128 + struct resume_dependency resume_dependency;
83129 + int is_suspended;
83130 };
83131
83132
83133 @@ -353,7 +358,7 @@ s3c24xx_serial_rx_chars(int irq, void *d
83134 port->icount.rx++;
83135
83136 if (unlikely(uerstat & S3C2410_UERSTAT_ANY)) {
83137 - dbg("rxerr: port ch=0x%02x, rxs=0x%08x\n",
83138 + printk(KERN_DEBUG "rxerr: port ch=0x%02x, rxs=0x%08x\n",
83139 ch, uerstat);
83140
83141 /* check for break */
83142 @@ -382,7 +387,8 @@ s3c24xx_serial_rx_chars(int irq, void *d
83143 if (uart_handle_sysrq_char(port, ch))
83144 goto ignore_char;
83145
83146 - uart_insert_char(port, uerstat, S3C2410_UERSTAT_OVERRUN, ch, flag);
83147 + uart_insert_char(port, uerstat, S3C2410_UERSTAT_OVERRUN, ch,
83148 + flag);
83149
83150 ignore_char:
83151 continue;
83152 @@ -708,10 +714,6 @@ static unsigned int s3c24xx_serial_getcl
83153 int calc_deviation;
83154
83155 for (sptr = res; sptr < resptr; sptr++) {
83156 - printk(KERN_DEBUG
83157 - "found clk %p (%s) quot %d, calc %d\n",
83158 - sptr->clksrc, sptr->clksrc->name,
83159 - sptr->quot, sptr->calc);
83160
83161 calc_deviation = baud - sptr->calc;
83162 if (calc_deviation < 0)
83163 @@ -723,12 +725,8 @@ static unsigned int s3c24xx_serial_getcl
83164 }
83165 }
83166
83167 - printk(KERN_DEBUG "best %p (deviation %d)\n", best, deviation);
83168 }
83169
83170 - printk(KERN_DEBUG "selected clock %p (%s) quot %d, calc %d\n",
83171 - best->clksrc, best->clksrc->name, best->quot, best->calc);
83172 -
83173 /* store results to pass back */
83174
83175 *clksrc = best->clksrc;
83176 @@ -996,6 +994,69 @@ static struct s3c24xx_uart_port s3c24xx_
83177 #endif
83178 };
83179
83180 +static void s3c24xx_serial_force_debug_port_up(void)
83181 +{
83182 + struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[
83183 + CONFIG_DEBUG_S3C_UART];
83184 + struct s3c24xx_uart_clksrc *clksrc = NULL;
83185 + struct clk *clk = NULL;
83186 + unsigned long tmp;
83187 +
83188 + s3c24xx_serial_getclk(&ourport->port, &clksrc, &clk, 115200);
83189 +
83190 + tmp = __raw_readl(S3C2410_CLKCON);
83191 +
83192 + /* re-start uart clocks */
83193 + tmp |= S3C2410_CLKCON_UART0;
83194 + tmp |= S3C2410_CLKCON_UART1;
83195 + tmp |= S3C2410_CLKCON_UART2;
83196 +
83197 + __raw_writel(tmp, S3C2410_CLKCON);
83198 + udelay(10);
83199 +
83200 + s3c24xx_serial_setsource(&ourport->port, clksrc);
83201 +
83202 + if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) {
83203 + clk_disable(ourport->baudclk);
83204 + ourport->baudclk = NULL;
83205 + }
83206 +
83207 + clk_enable(clk);
83208 +
83209 + ourport->clksrc = clksrc;
83210 + ourport->baudclk = clk;
83211 +}
83212 +
83213 +static void s3c2410_printascii(const char *sz)
83214 +{
83215 + struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[
83216 + CONFIG_DEBUG_S3C_UART];
83217 + struct uart_port *port = &ourport->port;
83218 +
83219 + /* 8 N 1 */
83220 + wr_regl(port, S3C2410_ULCON, (rd_regl(port, S3C2410_ULCON)) | 3);
83221 + /* polling mode */
83222 + wr_regl(port, S3C2410_UCON, (rd_regl(port, S3C2410_UCON) & ~0xc0f) | 5);
83223 + /* disable FIFO */
83224 + wr_regl(port, S3C2410_UFCON, (rd_regl(port, S3C2410_UFCON) & ~0x01));
83225 + /* fix baud rate */
83226 + wr_regl(port, S3C2410_UBRDIV, 26);
83227 +
83228 + while (*sz) {
83229 + int timeout = 10000000;
83230 +
83231 + /* spin on it being busy */
83232 + while ((!(rd_regl(port, S3C2410_UTRSTAT) & 2)) && timeout--)
83233 + ;
83234 +
83235 + /* transmit register */
83236 + wr_regl(port, S3C2410_UTXH, *sz);
83237 +
83238 + sz++;
83239 + }
83240 +}
83241 +
83242 +
83243 /* s3c24xx_serial_resetport
83244 *
83245 * wrapper to call the specific reset for this port (reset the fifos
83246 @@ -1093,6 +1154,8 @@ static int s3c24xx_serial_probe(struct p
83247 ourport = &s3c24xx_serial_ports[probe_index];
83248 probe_index++;
83249
83250 + init_resume_dependency_list(&ourport->resume_dependency);
83251 +
83252 dbg("%s: initialising port %p...\n", __FUNCTION__, ourport);
83253
83254 ret = s3c24xx_serial_init_port(ourport, info, dev);
83255 @@ -1126,13 +1189,28 @@ static int s3c24xx_serial_remove(struct
83256 static int s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t state)
83257 {
83258 struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
83259 + struct s3c24xx_uart_port *ourport = to_ourport(port);
83260
83261 if (port)
83262 uart_suspend_port(&s3c24xx_uart_drv, port);
83263
83264 + activate_all_resume_dependencies(&ourport->resume_dependency);
83265 + ourport->is_suspended = 1;
83266 return 0;
83267 }
83268
83269 +void s3c24xx_serial_register_resume_dependency(struct resume_dependency *
83270 + resume_dependency, int uart_index)
83271 +{
83272 + struct s3c24xx_uart_port *ourport = &s3c24xx_serial_ports[uart_index];
83273 +
83274 + register_resume_dependency(&ourport->resume_dependency,
83275 + resume_dependency);
83276 + if (ourport->is_suspended)
83277 + activate_all_resume_dependencies(&ourport->resume_dependency);
83278 +}
83279 +EXPORT_SYMBOL(s3c24xx_serial_register_resume_dependency);
83280 +
83281 static int s3c24xx_serial_resume(struct platform_device *dev)
83282 {
83283 struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);
83284 @@ -1146,6 +1224,9 @@ static int s3c24xx_serial_resume(struct
83285 uart_resume_port(&s3c24xx_uart_drv, port);
83286 }
83287
83288 + ourport->is_suspended = 0;
83289 + callback_all_resume_dependencies(&ourport->resume_dependency);
83290 +
83291 return 0;
83292 }
83293
83294 @@ -1157,6 +1238,11 @@ static int s3c24xx_serial_resume(struct
83295 static int s3c24xx_serial_init(struct platform_driver *drv,
83296 struct s3c24xx_uart_info *info)
83297 {
83298 + /* set up the emergency debug UART functions */
83299 +
83300 + printk_emergency_debug_spew_init = s3c24xx_serial_force_debug_port_up;
83301 + printk_emergency_debug_spew_send_string = s3c2410_printascii;
83302 +
83303 dbg("s3c24xx_serial_init(%p,%p)\n", drv, info);
83304 return platform_driver_register(drv);
83305 }
83306 @@ -1701,6 +1787,13 @@ module_exit(s3c24xx_serial_modexit);
83307 #ifdef CONFIG_SERIAL_S3C2410_CONSOLE
83308
83309 static struct uart_port *cons_uart;
83310 +static int cons_silenced;
83311 +
83312 +void s3c24xx_serial_console_set_silence(int silenced)
83313 +{
83314 + cons_silenced = silenced;
83315 +}
83316 +EXPORT_SYMBOL(s3c24xx_serial_console_set_silence);
83317
83318 static int
83319 s3c24xx_serial_console_txrdy(struct uart_port *port, unsigned int ufcon)
83320 @@ -1725,9 +1818,21 @@ static void
83321 s3c24xx_serial_console_putchar(struct uart_port *port, int ch)
83322 {
83323 unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
83324 + unsigned int umcon = rd_regl(cons_uart, S3C2410_UMCON);
83325 +
83326 + if (cons_silenced)
83327 + return;
83328 +
83329 + /* If auto HW flow control enabled, temporarily turn it off */
83330 + if (umcon & S3C2410_UMCOM_AFC)
83331 + wr_regl(port, S3C2410_UMCON, (umcon & !S3C2410_UMCOM_AFC));
83332 +
83333 while (!s3c24xx_serial_console_txrdy(port, ufcon))
83334 barrier();
83335 wr_regb(cons_uart, S3C2410_UTXH, ch);
83336 +
83337 + if (umcon & S3C2410_UMCOM_AFC)
83338 + wr_regl(port, S3C2410_UMCON, umcon);
83339 }
83340
83341 static void
83342 Index: linux-2.6.24.7/drivers/spi/spi_s3c24xx_gpio.c
83343 ===================================================================
83344 --- linux-2.6.24.7.orig/drivers/spi/spi_s3c24xx_gpio.c 2008-12-11 22:46:07.000000000 +0100
83345 +++ linux-2.6.24.7/drivers/spi/spi_s3c24xx_gpio.c 2008-12-11 22:46:49.000000000 +0100
83346 @@ -91,7 +91,7 @@ static void s3c2410_spigpio_chipselect(s
83347 struct s3c2410_spigpio *sg = spidev_to_sg(dev);
83348
83349 if (sg->info && sg->info->chip_select)
83350 - (sg->info->chip_select)(sg->info, value);
83351 + (sg->info->chip_select)(sg->info, dev->chip_select, value);
83352 }
83353
83354 static int s3c2410_spigpio_probe(struct platform_device *dev)
83355 @@ -113,9 +113,11 @@ static int s3c2410_spigpio_probe(struct
83356
83357 platform_set_drvdata(dev, sp);
83358
83359 - /* copy in the plkatform data */
83360 + /* copy in the platform data */
83361 info = sp->info = dev->dev.platform_data;
83362
83363 + master->num_chipselect = info->num_chipselect;
83364 +
83365 /* setup spi bitbang adaptor */
83366 sp->bitbang.master = spi_master_get(master);
83367 sp->bitbang.master->bus_num = info->bus_num;
83368 @@ -146,12 +148,17 @@ static int s3c2410_spigpio_probe(struct
83369 /* register the chips to go with the board */
83370
83371 for (i = 0; i < sp->info->board_size; i++) {
83372 + struct spi_device *spidev;
83373 +
83374 dev_info(&dev->dev, "registering %p: %s\n",
83375 &sp->info->board_info[i],
83376 sp->info->board_info[i].modalias);
83377
83378 sp->info->board_info[i].controller_data = sp;
83379 - spi_new_device(master, sp->info->board_info + i);
83380 + spidev = spi_new_device(master, sp->info->board_info + i);
83381 + if (spidev)
83382 + spidev->max_speed_hz =
83383 + sp->info->board_info[i].max_speed_hz;
83384 }
83385
83386 return 0;
83387 Index: linux-2.6.24.7/drivers/usb/gadget/ether.c
83388 ===================================================================
83389 --- linux-2.6.24.7.orig/drivers/usb/gadget/ether.c 2008-12-11 22:46:07.000000000 +0100
83390 +++ linux-2.6.24.7/drivers/usb/gadget/ether.c 2008-12-11 22:48:25.000000000 +0100
83391 @@ -134,11 +134,8 @@ struct eth_dev {
83392 * Instead: allocate your own, using normal USB-IF procedures.
83393 */
83394
83395 -/* Thanks to NetChip Technologies for donating this product ID.
83396 - * It's for devices with only CDC Ethernet configurations.
83397 - */
83398 -#define CDC_VENDOR_NUM 0x0525 /* NetChip */
83399 -#define CDC_PRODUCT_NUM 0xa4a1 /* Linux-USB Ethernet Gadget */
83400 +#define CDC_VENDOR_NUM 0x1457 /* First International Computer */
83401 +#define CDC_PRODUCT_NUM 0x5117 /* Linux-USB Ethernet Gadget */
83402
83403 /* For hardware that can't talk CDC, we use the same vendor ID that
83404 * ARM Linux has used for ethernet-over-usb, both with sa1100 and
83405 @@ -159,8 +156,8 @@ struct eth_dev {
83406 * used with CDC Ethernet, Linux 2.4 hosts will need updates to choose
83407 * the non-RNDIS configuration.
83408 */
83409 -#define RNDIS_VENDOR_NUM 0x0525 /* NetChip */
83410 -#define RNDIS_PRODUCT_NUM 0xa4a2 /* Ethernet/RNDIS Gadget */
83411 +#define RNDIS_VENDOR_NUM 0x1457 /* NetChip */
83412 +#define RNDIS_PRODUCT_NUM 0x5122 /* Ethernet/RNDIS Gadget */
83413
83414
83415 /* Some systems will want different product identifers published in the
83416 @@ -464,7 +461,7 @@ eth_config = {
83417 .bConfigurationValue = DEV_CONFIG_VALUE,
83418 .iConfiguration = STRING_CDC,
83419 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
83420 - .bMaxPower = 50,
83421 + .bMaxPower = 250,
83422 };
83423
83424 #ifdef CONFIG_USB_ETH_RNDIS
83425 @@ -478,7 +475,7 @@ rndis_config = {
83426 .bConfigurationValue = DEV_RNDIS_CONFIG_VALUE,
83427 .iConfiguration = STRING_RNDIS,
83428 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
83429 - .bMaxPower = 50,
83430 + .bMaxPower = 250,
83431 };
83432 #endif
83433
83434 Index: linux-2.6.24.7/drivers/usb/gadget/s3c2410_udc.c
83435 ===================================================================
83436 --- linux-2.6.24.7.orig/drivers/usb/gadget/s3c2410_udc.c 2008-12-11 22:46:07.000000000 +0100
83437 +++ linux-2.6.24.7/drivers/usb/gadget/s3c2410_udc.c 2008-12-11 22:46:49.000000000 +0100
83438 @@ -845,6 +845,7 @@ static void s3c2410_udc_handle_ep(struct
83439 u32 ep_csr1;
83440 u32 idx;
83441
83442 +handle_ep_again:
83443 if (likely (!list_empty(&ep->queue)))
83444 req = list_entry(ep->queue.next,
83445 struct s3c2410_request, queue);
83446 @@ -884,6 +885,8 @@ static void s3c2410_udc_handle_ep(struct
83447
83448 if ((ep_csr1 & S3C2410_UDC_OCSR1_PKTRDY) && req) {
83449 s3c2410_udc_read_fifo(ep,req);
83450 + if (s3c2410_udc_fifo_count_out())
83451 + goto handle_ep_again;
83452 }
83453 }
83454 }
83455 Index: linux-2.6.24.7/drivers/usb/host/ohci-s3c2410.c
83456 ===================================================================
83457 --- linux-2.6.24.7.orig/drivers/usb/host/ohci-s3c2410.c 2008-12-11 22:46:07.000000000 +0100
83458 +++ linux-2.6.24.7/drivers/usb/host/ohci-s3c2410.c 2008-12-11 22:46:49.000000000 +0100
83459 @@ -24,6 +24,7 @@
83460
83461 #include <asm/hardware.h>
83462 #include <asm/arch/usb-control.h>
83463 +#include <asm/arch/regs-gpio.h>
83464
83465 #define valid_port(idx) ((idx) == 1 || (idx) == 2)
83466
83467 @@ -308,6 +309,42 @@ static void s3c2410_hcd_oc(struct s3c241
83468 local_irq_restore(flags);
83469 }
83470
83471 +/* switching of USB pads */
83472 +static ssize_t show_usb_mode(struct device *dev, struct device_attribute *attr,
83473 + char *buf)
83474 +{
83475 + if (__raw_readl(S3C24XX_MISCCR) & S3C2410_MISCCR_USBHOST)
83476 + return sprintf(buf, "host\n");
83477 +
83478 + return sprintf(buf, "device\n");
83479 +}
83480 +
83481 +static ssize_t set_usb_mode(struct device *dev, struct device_attribute *attr,
83482 + const char *buf, size_t count)
83483 +{
83484 + if (!strncmp(buf, "host", 4)) {
83485 + printk("s3c2410: changing usb to host\n");
83486 + s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST,
83487 + S3C2410_MISCCR_USBHOST);
83488 + /* FIXME:
83489 + * - call machine-specific disable-pullup function i
83490 + * - enable +Vbus (if hardware supports it)
83491 + */
83492 + s3c2410_gpio_setpin(S3C2410_GPB9, 0);
83493 + } else if (!strncmp(buf, "device", 6)) {
83494 + printk("s3c2410: changing usb to device\n");
83495 + s3c2410_modify_misccr(S3C2410_MISCCR_USBHOST, 0);
83496 + s3c2410_gpio_setpin(S3C2410_GPB9, 1);
83497 + } else {
83498 + printk("s3c2410: unknown mode\n");
83499 + return -EINVAL;
83500 + }
83501 +
83502 + return count;
83503 +}
83504 +
83505 +static DEVICE_ATTR(usb_mode, S_IRUGO | S_IWUSR, show_usb_mode, set_usb_mode);
83506 +
83507 /* may be called without controller electrically present */
83508 /* may be called with controller, bus, and devices active */
83509
83510 @@ -325,6 +362,7 @@ static void s3c2410_hcd_oc(struct s3c241
83511 static void
83512 usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev)
83513 {
83514 + device_remove_file(&dev->dev, &dev_attr_usb_mode);
83515 usb_remove_hcd(hcd);
83516 s3c2410_stop_hc(dev);
83517 iounmap(hcd->regs);
83518 @@ -392,8 +430,15 @@ static int usb_hcd_s3c2410_probe (const
83519 if (retval != 0)
83520 goto err_ioremap;
83521
83522 + retval = device_create_file(&dev->dev, &dev_attr_usb_mode);
83523 + if (retval != 0)
83524 + goto err_hcd;
83525 +
83526 return 0;
83527
83528 + err_hcd:
83529 + usb_remove_hcd(hcd);
83530 +
83531 err_ioremap:
83532 s3c2410_stop_hc(dev);
83533 iounmap(hcd->regs);
83534 Index: linux-2.6.24.7/drivers/video/backlight/gta01_bl.c
83535 ===================================================================
83536 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
83537 +++ linux-2.6.24.7/drivers/video/backlight/gta01_bl.c 2008-12-11 22:46:49.000000000 +0100
83538 @@ -0,0 +1,269 @@
83539 +/*
83540 + * Backlight Driver for FIC GTA01 (Neo1973) GSM Phone
83541 + *
83542 + * Copyright (C) 2006-2007 by Openmoko, Inc.
83543 + * Author: Harald Welte <laforge@openmoko.org>
83544 + * All rights reserved.
83545 + *
83546 + * based on corgi_cl.c, Copyright (c) 2004-2006 Richard Purdie
83547 + *
83548 + * This program is free software; you can redistribute it and/or
83549 + * modify it under the terms of the GNU General Public License as
83550 + * published by the Free Software Foundation, version 2.
83551 + *
83552 + * This program is distributed in the hope that it will be useful,
83553 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
83554 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83555 + * GNU General Public License for more details.
83556 + *
83557 + * You should have received a copy of the GNU General Public License
83558 + * along with this program; if not, write to the Free Software
83559 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
83560 + * MA 02111-1307 USA
83561 + *
83562 + * Javi Roman <javiroman@kernel-labs.org>:
83563 + * implement PWM, instead of simple on/off switching
83564 + *
83565 + */
83566 +
83567 +#include <linux/module.h>
83568 +#include <linux/kernel.h>
83569 +#include <linux/init.h>
83570 +#include <linux/platform_device.h>
83571 +#include <linux/mutex.h>
83572 +#include <linux/fb.h>
83573 +#include <linux/backlight.h>
83574 +#include <linux/clk.h>
83575 +
83576 +#include <asm/arch/hardware.h>
83577 +#include <asm/arch/gta01.h>
83578 +#include <asm/arch/pwm.h>
83579 +
83580 +#include <asm/plat-s3c/regs-timer.h>
83581 +#include <asm/plat-s3c24xx/neo1973.h>
83582 +
83583 +static struct backlight_properties gta01bl_prop;
83584 +static struct backlight_device *gta01_backlight_device;
83585 +static struct gta01bl_machinfo *bl_machinfo;
83586 +
83587 +static unsigned long gta01bl_flags;
83588 +
83589 +struct gta01bl_data {
83590 + int intensity;
83591 + struct mutex mutex;
83592 + struct clk *clk;
83593 + struct s3c2410_pwm pwm;
83594 +};
83595 +
83596 +static struct gta01bl_data gta01bl;
83597 +
83598 +static int gta01bl_defer_resume_backlight;
83599 +
83600 +#define GTA01BL_SUSPENDED 0x01
83601 +#define GTA01BL_BATTLOW 0x02
83602 +
83603 +/* On the GTA01 / Neo1973, we use a 50 or 66MHz PCLK, which gives
83604 + * us a 6.25..8.25MHz DIV8 clock, which is further divided by a
83605 + * prescaler of 4, resulting in a 1.56..2.06MHz tick. This results in a
83606 + * minimum frequency of 24..31Hz. At 400Hz, we need to set the count
83607 + * to something like 3906..5156, providing us a way sufficient resolution
83608 + * for display brightness adjustment. */
83609 +#define GTA01BL_COUNTER 5156
83610 +
83611 +static int gta01bl_send_intensity(struct backlight_device *bd)
83612 +{
83613 + int intensity = bd->props.brightness;
83614 +
83615 + if (bd->props.power != FB_BLANK_UNBLANK)
83616 + intensity = 0;
83617 + if (bd->props.fb_blank != FB_BLANK_UNBLANK)
83618 + intensity = 0;
83619 + if (gta01bl_flags & GTA01BL_SUSPENDED)
83620 + intensity = 0;
83621 + if (gta01bl_flags & GTA01BL_BATTLOW)
83622 + intensity &= bl_machinfo->limit_mask;
83623 +
83624 + mutex_lock(&gta01bl.mutex);
83625 +#ifdef GTA01_BACKLIGHT_ONOFF_ONLY
83626 + if (intensity)
83627 + neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 1);
83628 + else
83629 + neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 0);
83630 +#else
83631 + if (intensity == bd->props.max_brightness) {
83632 + neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 1);
83633 + s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPIO_OUTPUT);
83634 + } else {
83635 + s3c2410_pwm_duty_cycle(intensity & 0xffff, &gta01bl.pwm);
83636 + s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPB0_TOUT0);
83637 + }
83638 +#endif
83639 + mutex_unlock(&gta01bl.mutex);
83640 +
83641 + gta01bl.intensity = intensity;
83642 + return 0;
83643 +}
83644 +
83645 +static int gta01bl_init_hw(void)
83646 +{
83647 + int rc;
83648 +
83649 + rc = s3c2410_pwm_init(&gta01bl.pwm);
83650 + if (rc)
83651 + return rc;
83652 +
83653 + gta01bl.pwm.timerid = PWM0;
83654 + gta01bl.pwm.prescaler = (4 - 1);
83655 + gta01bl.pwm.divider = S3C2410_TCFG1_MUX0_DIV8;
83656 + gta01bl.pwm.counter = GTA01BL_COUNTER;
83657 + gta01bl.pwm.comparer = gta01bl.pwm.counter;
83658 +
83659 + rc = s3c2410_pwm_enable(&gta01bl.pwm);
83660 + if (rc)
83661 + return rc;
83662 +
83663 + s3c2410_pwm_start(&gta01bl.pwm);
83664 +
83665 + gta01bl_prop.max_brightness = gta01bl.pwm.counter;
83666 +
83667 + return 0;
83668 +}
83669 +
83670 +#ifdef CONFIG_PM
83671 +static int gta01bl_suspend(struct platform_device *dev, pm_message_t state)
83672 +{
83673 + gta01bl_flags |= GTA01BL_SUSPENDED;
83674 + gta01bl_send_intensity(gta01_backlight_device);
83675 + neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 0);
83676 + s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPIO_OUTPUT);
83677 + return 0;
83678 +}
83679 +
83680 +void gta01bl_deferred_resume(void)
83681 +{
83682 + mutex_lock(&gta01bl.mutex);
83683 + gta01bl_init_hw();
83684 + mutex_unlock(&gta01bl.mutex);
83685 +
83686 + gta01bl_flags &= ~GTA01BL_SUSPENDED;
83687 + gta01bl_send_intensity(gta01_backlight_device);
83688 +}
83689 +EXPORT_SYMBOL_GPL(gta01bl_deferred_resume);
83690 +
83691 +static int gta01bl_resume(struct platform_device *dev)
83692 +{
83693 + if (!gta01bl_defer_resume_backlight)
83694 + gta01bl_deferred_resume();
83695 + return 0;
83696 +}
83697 +#else
83698 +#define gta01bl_suspend NULL
83699 +#define gta01bl_resume NULL
83700 +#endif
83701 +
83702 +static int gta01bl_get_intensity(struct backlight_device *bd)
83703 +{
83704 + return gta01bl.intensity;
83705 +}
83706 +
83707 +static int gta01bl_set_intensity(struct backlight_device *bd)
83708 +{
83709 + gta01bl_send_intensity(gta01_backlight_device);
83710 + return 0;
83711 +}
83712 +
83713 +/*
83714 + * Called when the battery is low to limit the backlight intensity.
83715 + * If limit==0 clear any limit, otherwise limit the intensity
83716 + */
83717 +void gta01bl_limit_intensity(int limit)
83718 +{
83719 + if (limit)
83720 + gta01bl_flags |= GTA01BL_BATTLOW;
83721 + else
83722 + gta01bl_flags &= ~GTA01BL_BATTLOW;
83723 + gta01bl_send_intensity(gta01_backlight_device);
83724 +}
83725 +EXPORT_SYMBOL_GPL(gta01bl_limit_intensity);
83726 +
83727 +
83728 +static struct backlight_ops gta01bl_ops = {
83729 + .get_brightness = gta01bl_get_intensity,
83730 + .update_status = gta01bl_set_intensity,
83731 +};
83732 +
83733 +static int __init gta01bl_probe(struct platform_device *pdev)
83734 +{
83735 + struct gta01bl_machinfo *machinfo = pdev->dev.platform_data;
83736 + int rc;
83737 +
83738 +#ifdef GTA01_BACKLIGHT_ONOFF_ONLY
83739 + s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPIO_OUTPUT);
83740 + gta01bl_prop.max_brightness = 1;
83741 +#else
83742 + rc = gta01bl_init_hw();
83743 + if (rc < 0)
83744 + return rc;
83745 +#endif
83746 + mutex_init(&gta01bl.mutex);
83747 +
83748 + if (!machinfo->limit_mask)
83749 + machinfo->limit_mask = -1;
83750 +
83751 + gta01bl_defer_resume_backlight = machinfo->defer_resume_backlight;
83752 +
83753 + gta01_backlight_device = backlight_device_register("gta01-bl",
83754 + &pdev->dev, NULL,
83755 + &gta01bl_ops);
83756 + if (IS_ERR(gta01_backlight_device))
83757 + return PTR_ERR(gta01_backlight_device);
83758 +
83759 + gta01bl_prop.power = FB_BLANK_UNBLANK;
83760 + gta01bl_prop.brightness = gta01bl_prop.max_brightness;
83761 + memcpy(&gta01_backlight_device->props,
83762 + &gta01bl_prop, sizeof(gta01bl_prop));
83763 + gta01bl_send_intensity(gta01_backlight_device);
83764 +
83765 + return 0;
83766 +}
83767 +
83768 +static int gta01bl_remove(struct platform_device *dev)
83769 +{
83770 +#ifndef GTA01_BACKLIGHT_ONOFF_ONLY
83771 + s3c2410_pwm_disable(&gta01bl.pwm);
83772 +#endif
83773 + backlight_device_unregister(gta01_backlight_device);
83774 + mutex_destroy(&gta01bl.mutex);
83775 +
83776 + s3c2410_gpio_cfgpin(GTA01_GPIO_BACKLIGHT, S3C2410_GPIO_OUTPUT);
83777 + neo1973_gpb_setpin(GTA01_GPIO_BACKLIGHT, 1);
83778 +
83779 + return 0;
83780 +}
83781 +
83782 +static struct platform_driver gta01bl_driver = {
83783 + .probe = gta01bl_probe,
83784 + .remove = gta01bl_remove,
83785 + .suspend = gta01bl_suspend,
83786 + .resume = gta01bl_resume,
83787 + .driver = {
83788 + .name = "gta01-bl",
83789 + },
83790 +};
83791 +
83792 +static int __init gta01bl_init(void)
83793 +{
83794 + return platform_driver_register(&gta01bl_driver);
83795 +}
83796 +
83797 +static void __exit gta01bl_exit(void)
83798 +{
83799 + platform_driver_unregister(&gta01bl_driver);
83800 +}
83801 +
83802 +module_init(gta01bl_init);
83803 +module_exit(gta01bl_exit);
83804 +
83805 +MODULE_DESCRIPTION("FIC GTA01 (Neo1973) Backlight Driver");
83806 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
83807 +MODULE_LICENSE("GPL");
83808 Index: linux-2.6.24.7/drivers/video/backlight/Kconfig
83809 ===================================================================
83810 --- linux-2.6.24.7.orig/drivers/video/backlight/Kconfig 2008-12-11 22:46:07.000000000 +0100
83811 +++ linux-2.6.24.7/drivers/video/backlight/Kconfig 2008-12-11 22:46:49.000000000 +0100
83812 @@ -67,6 +67,14 @@ config BACKLIGHT_LOCOMO
83813 If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to
83814 enable the LCD/backlight driver.
83815
83816 +config BACKLIGHT_GTA01
83817 + tristate "FIC Neo1973 GTA01 Backlight Driver"
83818 + depends on BACKLIGHT_CLASS_DEVICE && MACH_NEO1973_GTA01
83819 + default y
83820 + help
83821 + If you have a FIC Neo1973 GTA01, say y to enable the backlight driver.
83822 +
83823 +
83824 config BACKLIGHT_HP680
83825 tristate "HP Jornada 680 Backlight Driver"
83826 depends on BACKLIGHT_CLASS_DEVICE && SH_HP6XX
83827 Index: linux-2.6.24.7/drivers/video/backlight/Makefile
83828 ===================================================================
83829 --- linux-2.6.24.7.orig/drivers/video/backlight/Makefile 2008-12-11 22:46:07.000000000 +0100
83830 +++ linux-2.6.24.7/drivers/video/backlight/Makefile 2008-12-11 22:46:49.000000000 +0100
83831 @@ -5,6 +5,7 @@ obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o
83832
83833 obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
83834 obj-$(CONFIG_BACKLIGHT_CORGI) += corgi_bl.o
83835 +obj-$(CONFIG_BACKLIGHT_GTA01) += gta01_bl.o
83836 obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
83837 obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o
83838 obj-$(CONFIG_BACKLIGHT_PROGEAR) += progear_bl.o
83839 Index: linux-2.6.24.7/drivers/video/display/jbt6k74.c
83840 ===================================================================
83841 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
83842 +++ linux-2.6.24.7/drivers/video/display/jbt6k74.c 2008-12-11 22:46:49.000000000 +0100
83843 @@ -0,0 +1,757 @@
83844 +/* Linux kernel driver for the tpo JBT6K74-AS LCM ASIC
83845 + *
83846 + * Copyright (C) 2006-2007 by Openmoko, Inc.
83847 + * Author: Harald Welte <laforge@openmoko.org>,
83848 + * Stefan Schmidt <stefan@openmoko.org>
83849 + * Copyright (C) 2008 by Harald Welte <laforge@openmoko.org>
83850 + * All rights reserved.
83851 + *
83852 + * This program is free software; you can redistribute it and/or
83853 + * modify it under the terms of the GNU General Public License as
83854 + * published by the Free Software Foundation; either version 2 of
83855 + * the License, or (at your option) any later version.
83856 + *
83857 + * This program is distributed in the hope that it will be useful,
83858 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
83859 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
83860 + * GNU General Public License for more details.
83861 + *
83862 + * You should have received a copy of the GNU General Public License
83863 + * along with this program; if not, write to the Free Software
83864 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
83865 + * MA 02111-1307 USA
83866 + *
83867 + */
83868 +
83869 +#include <linux/kernel.h>
83870 +#include <linux/types.h>
83871 +#include <linux/module.h>
83872 +#include <linux/device.h>
83873 +#include <linux/platform_device.h>
83874 +#include <linux/delay.h>
83875 +#include <linux/jbt6k74.h>
83876 +#include <linux/fb.h>
83877 +
83878 +enum jbt_register {
83879 + JBT_REG_SLEEP_IN = 0x10,
83880 + JBT_REG_SLEEP_OUT = 0x11,
83881 +
83882 + JBT_REG_DISPLAY_OFF = 0x28,
83883 + JBT_REG_DISPLAY_ON = 0x29,
83884 +
83885 + JBT_REG_RGB_FORMAT = 0x3a,
83886 + JBT_REG_QUAD_RATE = 0x3b,
83887 +
83888 + JBT_REG_POWER_ON_OFF = 0xb0,
83889 + JBT_REG_BOOSTER_OP = 0xb1,
83890 + JBT_REG_BOOSTER_MODE = 0xb2,
83891 + JBT_REG_BOOSTER_FREQ = 0xb3,
83892 + JBT_REG_OPAMP_SYSCLK = 0xb4,
83893 + JBT_REG_VSC_VOLTAGE = 0xb5,
83894 + JBT_REG_VCOM_VOLTAGE = 0xb6,
83895 + JBT_REG_EXT_DISPL = 0xb7,
83896 + JBT_REG_OUTPUT_CONTROL = 0xb8,
83897 + JBT_REG_DCCLK_DCEV = 0xb9,
83898 + JBT_REG_DISPLAY_MODE1 = 0xba,
83899 + JBT_REG_DISPLAY_MODE2 = 0xbb,
83900 + JBT_REG_DISPLAY_MODE = 0xbc,
83901 + JBT_REG_ASW_SLEW = 0xbd,
83902 + JBT_REG_DUMMY_DISPLAY = 0xbe,
83903 + JBT_REG_DRIVE_SYSTEM = 0xbf,
83904 +
83905 + JBT_REG_SLEEP_OUT_FR_A = 0xc0,
83906 + JBT_REG_SLEEP_OUT_FR_B = 0xc1,
83907 + JBT_REG_SLEEP_OUT_FR_C = 0xc2,
83908 + JBT_REG_SLEEP_IN_LCCNT_D = 0xc3,
83909 + JBT_REG_SLEEP_IN_LCCNT_E = 0xc4,
83910 + JBT_REG_SLEEP_IN_LCCNT_F = 0xc5,
83911 + JBT_REG_SLEEP_IN_LCCNT_G = 0xc6,
83912 +
83913 + JBT_REG_GAMMA1_FINE_1 = 0xc7,
83914 + JBT_REG_GAMMA1_FINE_2 = 0xc8,
83915 + JBT_REG_GAMMA1_INCLINATION = 0xc9,
83916 + JBT_REG_GAMMA1_BLUE_OFFSET = 0xca,
83917 +
83918 + /* VGA */
83919 + JBT_REG_BLANK_CONTROL = 0xcf,
83920 + JBT_REG_BLANK_TH_TV = 0xd0,
83921 + JBT_REG_CKV_ON_OFF = 0xd1,
83922 + JBT_REG_CKV_1_2 = 0xd2,
83923 + JBT_REG_OEV_TIMING = 0xd3,
83924 + JBT_REG_ASW_TIMING_1 = 0xd4,
83925 + JBT_REG_ASW_TIMING_2 = 0xd5,
83926 +
83927 + /* QVGA */
83928 + JBT_REG_BLANK_CONTROL_QVGA = 0xd6,
83929 + JBT_REG_BLANK_TH_TV_QVGA = 0xd7,
83930 + JBT_REG_CKV_ON_OFF_QVGA = 0xd8,
83931 + JBT_REG_CKV_1_2_QVGA = 0xd9,
83932 + JBT_REG_OEV_TIMING_QVGA = 0xde,
83933 + JBT_REG_ASW_TIMING_1_QVGA = 0xdf,
83934 + JBT_REG_ASW_TIMING_2_QVGA = 0xe0,
83935 +
83936 +
83937 + JBT_REG_HCLOCK_VGA = 0xec,
83938 + JBT_REG_HCLOCK_QVGA = 0xed,
83939 +
83940 +};
83941 +
83942 +enum jbt_state {
83943 + JBT_STATE_DEEP_STANDBY,
83944 + JBT_STATE_SLEEP,
83945 + JBT_STATE_NORMAL,
83946 + JBT_STATE_QVGA_NORMAL,
83947 +};
83948 +
83949 +static const char *jbt_state_names[] = {
83950 + [JBT_STATE_DEEP_STANDBY] = "deep-standby",
83951 + [JBT_STATE_SLEEP] = "sleep",
83952 + [JBT_STATE_NORMAL] = "normal",
83953 + [JBT_STATE_QVGA_NORMAL] = "qvga-normal",
83954 +};
83955 +
83956 +struct jbt_info {
83957 + enum jbt_state state, last_state;
83958 + struct spi_device *spi_dev;
83959 + struct mutex lock; /* protects tx_buf and reg_cache */
83960 + struct notifier_block fb_notif;
83961 + u16 tx_buf[8];
83962 + u16 reg_cache[0xEE];
83963 + int have_resumed;
83964 +};
83965 +
83966 +#define JBT_COMMAND 0x000
83967 +#define JBT_DATA 0x100
83968 +
83969 +
83970 +static int jbt_reg_write_nodata(struct jbt_info *jbt, u8 reg)
83971 +{
83972 + int rc;
83973 +
83974 + mutex_lock(&jbt->lock);
83975 +
83976 + jbt->tx_buf[0] = JBT_COMMAND | reg;
83977 + rc = spi_write(jbt->spi_dev, (u8 *)jbt->tx_buf,
83978 + 1*sizeof(u16));
83979 + if (rc == 0)
83980 + jbt->reg_cache[reg] = 0;
83981 + else
83982 + printk(KERN_ERR"jbt_reg_write_nodata spi_write ret %d\n",
83983 + rc);
83984 +
83985 + mutex_unlock(&jbt->lock);
83986 +
83987 + return rc;
83988 +}
83989 +
83990 +
83991 +static int jbt_reg_write(struct jbt_info *jbt, u8 reg, u8 data)
83992 +{
83993 + int rc;
83994 +
83995 + mutex_lock(&jbt->lock);
83996 +
83997 + jbt->tx_buf[0] = JBT_COMMAND | reg;
83998 + jbt->tx_buf[1] = JBT_DATA | data;
83999 + rc = spi_write(jbt->spi_dev, (u8 *)jbt->tx_buf,
84000 + 2*sizeof(u16));
84001 + if (rc == 0)
84002 + jbt->reg_cache[reg] = data;
84003 + else
84004 + printk(KERN_ERR"jbt_reg_write spi_write ret %d\n", rc);
84005 +
84006 + mutex_unlock(&jbt->lock);
84007 +
84008 + return rc;
84009 +}
84010 +
84011 +static int jbt_reg_write16(struct jbt_info *jbt, u8 reg, u16 data)
84012 +{
84013 + int rc;
84014 +
84015 + mutex_lock(&jbt->lock);
84016 +
84017 + jbt->tx_buf[0] = JBT_COMMAND | reg;
84018 + jbt->tx_buf[1] = JBT_DATA | (data >> 8);
84019 + jbt->tx_buf[2] = JBT_DATA | (data & 0xff);
84020 +
84021 + rc = spi_write(jbt->spi_dev, (u8 *)jbt->tx_buf,
84022 + 3*sizeof(u16));
84023 + if (rc == 0)
84024 + jbt->reg_cache[reg] = data;
84025 + else
84026 + printk(KERN_ERR"jbt_reg_write16 spi_write ret %d\n", rc);
84027 +
84028 + mutex_unlock(&jbt->lock);
84029 +
84030 + return rc;
84031 +}
84032 +
84033 +static int jbt_init_regs(struct jbt_info *jbt, int qvga)
84034 +{
84035 + int rc;
84036 +
84037 + dev_dbg(&jbt->spi_dev->dev, "entering %cVGA mode\n", qvga ? 'Q' : ' ');
84038 +
84039 + rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE1, 0x01);
84040 + rc |= jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE2, 0x00);
84041 + rc |= jbt_reg_write(jbt, JBT_REG_RGB_FORMAT, 0x60);
84042 + rc |= jbt_reg_write(jbt, JBT_REG_DRIVE_SYSTEM, 0x10);
84043 + rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_OP, 0x56);
84044 + rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_MODE, 0x33);
84045 + rc |= jbt_reg_write(jbt, JBT_REG_BOOSTER_FREQ, 0x11);
84046 + rc |= jbt_reg_write(jbt, JBT_REG_OPAMP_SYSCLK, 0x02);
84047 + rc |= jbt_reg_write(jbt, JBT_REG_VSC_VOLTAGE, 0x2b);
84048 + rc |= jbt_reg_write(jbt, JBT_REG_VCOM_VOLTAGE, 0x40);
84049 + rc |= jbt_reg_write(jbt, JBT_REG_EXT_DISPL, 0x03);
84050 + rc |= jbt_reg_write(jbt, JBT_REG_DCCLK_DCEV, 0x04);
84051 + /*
84052 + * default of 0x02 in JBT_REG_ASW_SLEW responsible for 72Hz requirement
84053 + * to avoid red / blue flicker
84054 + */
84055 + rc |= jbt_reg_write(jbt, JBT_REG_ASW_SLEW, 0x04);
84056 + rc |= jbt_reg_write(jbt, JBT_REG_DUMMY_DISPLAY, 0x00);
84057 +
84058 + rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_A, 0x11);
84059 + rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_B, 0x11);
84060 + rc |= jbt_reg_write(jbt, JBT_REG_SLEEP_OUT_FR_C, 0x11);
84061 + rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_D, 0x2040);
84062 + rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_E, 0x60c0);
84063 + rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_F, 0x1020);
84064 + rc |= jbt_reg_write16(jbt, JBT_REG_SLEEP_IN_LCCNT_G, 0x60c0);
84065 +
84066 + rc |= jbt_reg_write16(jbt, JBT_REG_GAMMA1_FINE_1, 0x5533);
84067 + rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_FINE_2, 0x00);
84068 + rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_INCLINATION, 0x00);
84069 + rc |= jbt_reg_write(jbt, JBT_REG_GAMMA1_BLUE_OFFSET, 0x00);
84070 +
84071 + if (!qvga) {
84072 + rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_VGA, 0x1f0);
84073 + rc |= jbt_reg_write(jbt, JBT_REG_BLANK_CONTROL, 0x02);
84074 + rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV, 0x0804);
84075 +
84076 + rc |= jbt_reg_write(jbt, JBT_REG_CKV_ON_OFF, 0x01);
84077 + rc |= jbt_reg_write16(jbt, JBT_REG_CKV_1_2, 0x0000);
84078 +
84079 + rc |= jbt_reg_write16(jbt, JBT_REG_OEV_TIMING, 0x0d0e);
84080 + rc |= jbt_reg_write16(jbt, JBT_REG_ASW_TIMING_1, 0x11a4);
84081 + rc |= jbt_reg_write(jbt, JBT_REG_ASW_TIMING_2, 0x0e);
84082 + } else {
84083 + rc |= jbt_reg_write16(jbt, JBT_REG_HCLOCK_QVGA, 0x00ff);
84084 + rc |= jbt_reg_write(jbt, JBT_REG_BLANK_CONTROL_QVGA, 0x02);
84085 + rc |= jbt_reg_write16(jbt, JBT_REG_BLANK_TH_TV_QVGA, 0x0804);
84086 +
84087 + rc |= jbt_reg_write(jbt, JBT_REG_CKV_ON_OFF_QVGA, 0x01);
84088 + rc |= jbt_reg_write16(jbt, JBT_REG_CKV_1_2_QVGA, 0x0008);
84089 +
84090 + rc |= jbt_reg_write16(jbt, JBT_REG_OEV_TIMING_QVGA, 0x050a);
84091 + rc |= jbt_reg_write16(jbt, JBT_REG_ASW_TIMING_1_QVGA, 0x0a19);
84092 + rc |= jbt_reg_write(jbt, JBT_REG_ASW_TIMING_2_QVGA, 0x0a);
84093 + }
84094 +
84095 + return rc ? -EIO : 0;
84096 +}
84097 +
84098 +static int standby_to_sleep(struct jbt_info *jbt)
84099 +{
84100 + int rc;
84101 +
84102 + /* three times command zero */
84103 + rc = jbt_reg_write_nodata(jbt, 0x00);
84104 + mdelay(1);
84105 + rc |= jbt_reg_write_nodata(jbt, 0x00);
84106 + mdelay(1);
84107 + rc |= jbt_reg_write_nodata(jbt, 0x00);
84108 + mdelay(1);
84109 +
84110 + /* deep standby out */
84111 + rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x17);
84112 +
84113 + return rc ? -EIO : 0;
84114 +}
84115 +
84116 +static int sleep_to_normal(struct jbt_info *jbt)
84117 +{
84118 + int rc;
84119 +
84120 + /* RGB I/F on, RAM wirte off, QVGA through, SIGCON enable */
84121 + rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x80);
84122 +
84123 + /* Quad mode off */
84124 + rc |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x00);
84125 +
84126 + /* AVDD on, XVDD on */
84127 + rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x16);
84128 +
84129 + /* Output control */
84130 + rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xfff9);
84131 +
84132 + /* Sleep mode off */
84133 + rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
84134 +
84135 + /* initialize register set */
84136 + rc |= jbt_init_regs(jbt, 0);
84137 +
84138 + /* Turn on display */
84139 + rc |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
84140 +
84141 + return rc ? -EIO : 0;
84142 +}
84143 +
84144 +static int sleep_to_qvga_normal(struct jbt_info *jbt)
84145 +{
84146 + int rc;
84147 +
84148 + /* RGB I/F on, RAM wirte off, QVGA through, SIGCON enable */
84149 + rc = jbt_reg_write(jbt, JBT_REG_DISPLAY_MODE, 0x81);
84150 +
84151 + /* Quad mode on */
84152 + rc |= jbt_reg_write(jbt, JBT_REG_QUAD_RATE, 0x22);
84153 +
84154 + /* AVDD on, XVDD on */
84155 + rc |= jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x16);
84156 +
84157 + /* Output control */
84158 + rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0xfff9);
84159 +
84160 + /* Sleep mode off */
84161 + rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_OUT);
84162 +
84163 + /* initialize register set for qvga*/
84164 + rc |= jbt_init_regs(jbt, 1);
84165 +
84166 + /* Turn on display */
84167 + rc |= jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_ON);
84168 +
84169 + return rc ? -EIO : 0;
84170 +}
84171 +
84172 +static int normal_to_sleep(struct jbt_info *jbt)
84173 +{
84174 + int rc;
84175 +
84176 + rc = jbt_reg_write_nodata(jbt, JBT_REG_DISPLAY_OFF);
84177 + rc |= jbt_reg_write16(jbt, JBT_REG_OUTPUT_CONTROL, 0x8002);
84178 + rc |= jbt_reg_write_nodata(jbt, JBT_REG_SLEEP_IN);
84179 +
84180 + return rc ? -EIO : 0;
84181 +}
84182 +
84183 +static int sleep_to_standby(struct jbt_info *jbt)
84184 +{
84185 + return jbt_reg_write(jbt, JBT_REG_POWER_ON_OFF, 0x00);
84186 +}
84187 +
84188 +/* frontend function */
84189 +int jbt6k74_enter_state(struct jbt_info *jbt, enum jbt_state new_state)
84190 +{
84191 + int rc = -EINVAL;
84192 +
84193 + dev_dbg(&jbt->spi_dev->dev, "entering (old_state=%u, "
84194 + "new_state=%u)\n", jbt->state, new_state);
84195 +
84196 + switch (jbt->state) {
84197 + case JBT_STATE_DEEP_STANDBY:
84198 + switch (new_state) {
84199 + case JBT_STATE_DEEP_STANDBY:
84200 + rc = 0;
84201 + break;
84202 + case JBT_STATE_SLEEP:
84203 + rc = standby_to_sleep(jbt);
84204 + break;
84205 + case JBT_STATE_NORMAL:
84206 + /* first transition into sleep */
84207 + rc = standby_to_sleep(jbt);
84208 + /* then transition into normal */
84209 + rc |= sleep_to_normal(jbt);
84210 + break;
84211 + case JBT_STATE_QVGA_NORMAL:
84212 + /* first transition into sleep */
84213 + rc = standby_to_sleep(jbt);
84214 + /* then transition into normal */
84215 + rc |= sleep_to_qvga_normal(jbt);
84216 + break;
84217 + }
84218 + break;
84219 + case JBT_STATE_SLEEP:
84220 + switch (new_state) {
84221 + case JBT_STATE_SLEEP:
84222 + rc = 0;
84223 + break;
84224 + case JBT_STATE_DEEP_STANDBY:
84225 + rc = sleep_to_standby(jbt);
84226 + break;
84227 + case JBT_STATE_NORMAL:
84228 + rc = sleep_to_normal(jbt);
84229 + break;
84230 + case JBT_STATE_QVGA_NORMAL:
84231 + rc = sleep_to_qvga_normal(jbt);
84232 + break;
84233 + }
84234 + break;
84235 + case JBT_STATE_NORMAL:
84236 + switch (new_state) {
84237 + case JBT_STATE_NORMAL:
84238 + rc = 0;
84239 + break;
84240 + case JBT_STATE_DEEP_STANDBY:
84241 + /* first transition into sleep */
84242 + rc = normal_to_sleep(jbt);
84243 + /* then transition into deep standby */
84244 + rc |= sleep_to_standby(jbt);
84245 + break;
84246 + case JBT_STATE_SLEEP:
84247 + rc = normal_to_sleep(jbt);
84248 + break;
84249 + case JBT_STATE_QVGA_NORMAL:
84250 + /* first transition into sleep */
84251 + rc = normal_to_sleep(jbt);
84252 + /* second transition into deep standby */
84253 + rc |= sleep_to_standby(jbt);
84254 + /* third transition into sleep */
84255 + rc |= standby_to_sleep(jbt);
84256 + /* fourth transition into normal */
84257 + rc |= sleep_to_qvga_normal(jbt);
84258 + break;
84259 + }
84260 + break;
84261 + case JBT_STATE_QVGA_NORMAL:
84262 + switch (new_state) {
84263 + case JBT_STATE_QVGA_NORMAL:
84264 + rc = 0;
84265 + break;
84266 + case JBT_STATE_DEEP_STANDBY:
84267 + /* first transition into sleep */
84268 + rc = normal_to_sleep(jbt);
84269 + /* then transition into deep standby */
84270 + rc |= sleep_to_standby(jbt);
84271 + break;
84272 + case JBT_STATE_SLEEP:
84273 + rc = normal_to_sleep(jbt);
84274 + break;
84275 + case JBT_STATE_NORMAL:
84276 + /* first transition into sleep */
84277 + rc = normal_to_sleep(jbt);
84278 + /* second transition into deep standby */
84279 + rc |= sleep_to_standby(jbt);
84280 + /* third transition into sleep */
84281 + rc |= standby_to_sleep(jbt);
84282 + /* fourth transition into normal */
84283 + rc |= sleep_to_normal(jbt);
84284 + break;
84285 + }
84286 + break;
84287 + }
84288 +
84289 + if (rc == 0)
84290 + jbt->state = new_state;
84291 +
84292 + return rc;
84293 +}
84294 +EXPORT_SYMBOL_GPL(jbt6k74_enter_state);
84295 +
84296 +static ssize_t state_read(struct device *dev, struct device_attribute *attr,
84297 + char *buf)
84298 +{
84299 + struct jbt_info *jbt = dev_get_drvdata(dev);
84300 +
84301 + if (jbt->state >= ARRAY_SIZE(jbt_state_names))
84302 + return -EIO;
84303 +
84304 + return sprintf(buf, "%s\n", jbt_state_names[jbt->state]);
84305 +}
84306 +
84307 +static ssize_t state_write(struct device *dev, struct device_attribute *attr,
84308 + const char *buf, size_t count)
84309 +{
84310 + struct jbt_info *jbt = dev_get_drvdata(dev);
84311 + int i, rc;
84312 +
84313 + for (i = 0; i < ARRAY_SIZE(jbt_state_names); i++) {
84314 + if (!strncmp(buf, jbt_state_names[i],
84315 + strlen(jbt_state_names[i]))) {
84316 + rc = jbt6k74_enter_state(jbt, i);
84317 + if (rc)
84318 + return rc;
84319 + return count;
84320 + }
84321 + }
84322 +
84323 + return -EINVAL;
84324 +}
84325 +
84326 +static DEVICE_ATTR(state, 0644, state_read, state_write);
84327 +
84328 +static int reg_by_string(const char *name)
84329 +{
84330 + if (!strcmp(name, "gamma_fine1"))
84331 + return JBT_REG_GAMMA1_FINE_1;
84332 + else if (!strcmp(name, "gamma_fine2"))
84333 + return JBT_REG_GAMMA1_FINE_2;
84334 + else if (!strcmp(name, "gamma_inclination"))
84335 + return JBT_REG_GAMMA1_INCLINATION;
84336 + else
84337 + return JBT_REG_GAMMA1_BLUE_OFFSET;
84338 +}
84339 +
84340 +static ssize_t gamma_read(struct device *dev, struct device_attribute *attr,
84341 + char *buf)
84342 +{
84343 + struct jbt_info *jbt = dev_get_drvdata(dev);
84344 + int reg = reg_by_string(attr->attr.name);
84345 + u16 val;
84346 +
84347 + mutex_lock(&jbt->lock);
84348 + val = jbt->reg_cache[reg];
84349 + mutex_unlock(&jbt->lock);
84350 +
84351 + return sprintf(buf, "0x%04x\n", val);
84352 +}
84353 +
84354 +static ssize_t gamma_write(struct device *dev, struct device_attribute *attr,
84355 + const char *buf, size_t count)
84356 +{
84357 + struct jbt_info *jbt = dev_get_drvdata(dev);
84358 + int reg = reg_by_string(attr->attr.name);
84359 + unsigned long val = simple_strtoul(buf, NULL, 10);
84360 +
84361 + dev_info(dev, "**** jbt6k74 writing gama %lu\n", val & 0xff);
84362 +
84363 + jbt_reg_write(jbt, reg, val & 0xff);
84364 +
84365 + return count;
84366 +}
84367 +
84368 +static DEVICE_ATTR(gamma_fine1, 0644, gamma_read, gamma_write);
84369 +static DEVICE_ATTR(gamma_fine2, 0644, gamma_read, gamma_write);
84370 +static DEVICE_ATTR(gamma_inclination, 0644, gamma_read, gamma_write);
84371 +static DEVICE_ATTR(gamma_blue_offset, 0644, gamma_read, gamma_write);
84372 +
84373 +static struct attribute *jbt_sysfs_entries[] = {
84374 + &dev_attr_state.attr,
84375 + &dev_attr_gamma_fine1.attr,
84376 + &dev_attr_gamma_fine2.attr,
84377 + &dev_attr_gamma_inclination.attr,
84378 + &dev_attr_gamma_blue_offset.attr,
84379 + NULL,
84380 +};
84381 +
84382 +static struct attribute_group jbt_attr_group = {
84383 + .name = NULL,
84384 + .attrs = jbt_sysfs_entries,
84385 +};
84386 +
84387 +static int fb_notifier_callback(struct notifier_block *self,
84388 + unsigned long event, void *data)
84389 +{
84390 + struct jbt_info *jbt;
84391 + struct fb_event *evdata = data;
84392 + int fb_blank;
84393 +
84394 + if (event != FB_EVENT_BLANK && event != FB_EVENT_CONBLANK)
84395 + return 0;
84396 +
84397 + fb_blank = *(int *)evdata->data;
84398 + jbt = container_of(self, struct jbt_info, fb_notif);
84399 +
84400 + switch (fb_blank) {
84401 + case FB_BLANK_UNBLANK:
84402 + dev_info(&jbt->spi_dev->dev, "**** jbt6k74 unblank\n");
84403 + jbt6k74_enter_state(jbt, JBT_STATE_NORMAL);
84404 + break;
84405 + case FB_BLANK_NORMAL:
84406 + dev_info(&jbt->spi_dev->dev, "**** jbt6k74 normal\n");
84407 + break;
84408 + case FB_BLANK_VSYNC_SUSPEND:
84409 + dev_info(&jbt->spi_dev->dev, "**** jbt6k74 vsync suspend\n");
84410 + break;
84411 + case FB_BLANK_HSYNC_SUSPEND:
84412 + dev_info(&jbt->spi_dev->dev, "**** jbt6k74 hsync suspend\n");
84413 + /* FIXME: we disable SLEEP since it would result in
84414 + * a visible artefact (white screen) before the backlight
84415 + * is dimmed to a dark enough level */
84416 + /* jbt6k74_enter_state(jbt, JBT_STATE_SLEEP); */
84417 + break;
84418 + case FB_BLANK_POWERDOWN:
84419 + dev_info(&jbt->spi_dev->dev, "**** jbt6k74 powerdown\n");
84420 + /* FIXME: deep standby causes WSOD on certain devices. We use
84421 + * sleep as workaround */
84422 + jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
84423 + break;
84424 + }
84425 +
84426 + return 0;
84427 +}
84428 +
84429 +/* linux device model infrastructure */
84430 +
84431 +static int __devinit jbt_probe(struct spi_device *spi)
84432 +{
84433 + int rc;
84434 + struct jbt_info *jbt;
84435 +
84436 + /* the controller doesn't have a MISO pin; we can't do detection */
84437 +
84438 + spi->mode = SPI_CPOL | SPI_CPHA;
84439 + spi->bits_per_word = 9;
84440 +
84441 + rc = spi_setup(spi);
84442 + if (rc < 0) {
84443 + dev_err(&spi->dev,
84444 + "error during spi_setup of jbt6k74 driver\n");
84445 + return rc;
84446 + }
84447 +
84448 + jbt = kzalloc(sizeof(*jbt), GFP_KERNEL);
84449 + if (!jbt)
84450 + return -ENOMEM;
84451 +
84452 + jbt->spi_dev = spi;
84453 + jbt->state = JBT_STATE_DEEP_STANDBY;
84454 + mutex_init(&jbt->lock);
84455 +
84456 + dev_set_drvdata(&spi->dev, jbt);
84457 +
84458 + rc = jbt6k74_enter_state(jbt, JBT_STATE_NORMAL);
84459 + if (rc < 0) {
84460 + dev_err(&spi->dev, "cannot enter NORMAL state\n");
84461 + goto err_free_drvdata;
84462 + }
84463 +
84464 + rc = sysfs_create_group(&spi->dev.kobj, &jbt_attr_group);
84465 + if (rc < 0) {
84466 + dev_err(&spi->dev, "cannot create sysfs group\n");
84467 + goto err_standby;
84468 + }
84469 +
84470 + jbt->fb_notif.notifier_call = fb_notifier_callback;
84471 + rc = fb_register_client(&jbt->fb_notif);
84472 + if (rc < 0) {
84473 + dev_err(&spi->dev, "cannot register notifier\n");
84474 + goto err_sysfs;
84475 + }
84476 +
84477 + return 0;
84478 +
84479 +err_sysfs:
84480 + sysfs_remove_group(&spi->dev.kobj, &jbt_attr_group);
84481 +err_standby:
84482 + jbt6k74_enter_state(jbt, JBT_STATE_DEEP_STANDBY);
84483 +err_free_drvdata:
84484 + dev_set_drvdata(&spi->dev, NULL);
84485 + kfree(jbt);
84486 +
84487 + return rc;
84488 +}
84489 +
84490 +static int __devexit jbt_remove(struct spi_device *spi)
84491 +{
84492 + struct jbt_info *jbt = dev_get_drvdata(&spi->dev);
84493 +
84494 + /* We don't want to switch off the display in case the user
84495 + * accidentially onloads the module (whose use count normally is 0) */
84496 +
84497 + fb_unregister_client(&jbt->fb_notif);
84498 + sysfs_remove_group(&spi->dev.kobj, &jbt_attr_group);
84499 + dev_set_drvdata(&spi->dev, NULL);
84500 + kfree(jbt);
84501 +
84502 + return 0;
84503 +}
84504 +
84505 +#ifdef CONFIG_PM
84506 +static int jbt_suspend(struct spi_device *spi, pm_message_t state)
84507 +{
84508 + struct jbt_info *jbt = dev_get_drvdata(&spi->dev);
84509 + struct jbt6k74_platform_data *jbt6k74_pdata = spi->dev.platform_data;
84510 +
84511 + dev_info(&spi->dev, "**** jbt6k74 suspend start\n");
84512 +
84513 + /* platform can register resume dependencies here, if any */
84514 + if (jbt6k74_pdata->suspending)
84515 + (jbt6k74_pdata->suspending)(0, spi);
84516 +
84517 + /* Save mode for resume */
84518 + jbt->last_state = jbt->state;
84519 + /* FIXME: deep standby causes WSOD on certain devices. We use
84520 + * sleep as workaround */
84521 + jbt6k74_enter_state(jbt, JBT_STATE_SLEEP);
84522 +
84523 + jbt->have_resumed = 0;
84524 +
84525 + dev_info(&spi->dev, "**** jbt6k74 suspend end\n");
84526 +
84527 + return 0;
84528 +}
84529 +
84530 +int jbt6k74_resume(struct spi_device *spi)
84531 +{
84532 + struct jbt_info *jbt = dev_get_drvdata(&spi->dev);
84533 + struct jbt6k74_platform_data *jbt6k74_pdata = spi->dev.platform_data;
84534 +
84535 + dev_info(&spi->dev, "**** jbt6k74 resume start\n");
84536 + if (jbt6k74_pdata->all_dependencies_resumed)
84537 + if (!(jbt6k74_pdata->all_dependencies_resumed)(0))
84538 + return 0;
84539 +
84540 + /* we can get called twice with all dependencies resumed if our core
84541 + * resume callback is last of all. Protect against doing anything twice
84542 + */
84543 + if (jbt->have_resumed) {
84544 + dev_info(&spi->dev, "**** jbt6k74 already resumed\n");
84545 + return 0;
84546 + }
84547 +
84548 + jbt->have_resumed |= 1;
84549 +
84550 + switch (jbt->last_state) {
84551 + case JBT_STATE_QVGA_NORMAL:
84552 + jbt6k74_enter_state(jbt, JBT_STATE_QVGA_NORMAL);
84553 + break;
84554 + default:
84555 + jbt6k74_enter_state(jbt, JBT_STATE_NORMAL);
84556 + break;
84557 + }
84558 +
84559 + if (jbt6k74_pdata->resuming)
84560 + (jbt6k74_pdata->resuming)(0);
84561 +
84562 + dev_info(&spi->dev, "**** jbt6k74 resume end\n");
84563 +
84564 + return 0;
84565 +}
84566 +EXPORT_SYMBOL_GPL(jbt6k74_resume);
84567 +
84568 +#else
84569 +#define jbt_suspend NULL
84570 +#define jbt_resume NULL
84571 +#endif
84572 +
84573 +static struct spi_driver jbt6k74_driver = {
84574 + .driver = {
84575 + .name = "jbt6k74",
84576 + .owner = THIS_MODULE,
84577 + },
84578 +
84579 + .probe = jbt_probe,
84580 + .remove = __devexit_p(jbt_remove),
84581 + .suspend = jbt_suspend,
84582 + .resume = jbt6k74_resume,
84583 +};
84584 +
84585 +static int __init jbt_init(void)
84586 +{
84587 + return spi_register_driver(&jbt6k74_driver);
84588 +}
84589 +
84590 +static void __exit jbt_exit(void)
84591 +{
84592 + spi_unregister_driver(&jbt6k74_driver);
84593 +}
84594 +
84595 +MODULE_DESCRIPTION("SPI driver for tpo JBT6K74-AS LCM control interface");
84596 +MODULE_AUTHOR("Harald Welte <laforge@openmoko.org>");
84597 +MODULE_LICENSE("GPL");
84598 +
84599 +module_init(jbt_init);
84600 +module_exit(jbt_exit);
84601 Index: linux-2.6.24.7/drivers/video/display/Kconfig
84602 ===================================================================
84603 --- linux-2.6.24.7.orig/drivers/video/display/Kconfig 2008-12-11 22:46:07.000000000 +0100
84604 +++ linux-2.6.24.7/drivers/video/display/Kconfig 2008-12-11 22:46:49.000000000 +0100
84605 @@ -21,4 +21,15 @@ config DISPLAY_SUPPORT
84606 comment "Display hardware drivers"
84607 depends on DISPLAY_SUPPORT
84608
84609 +config DISPLAY_JBT6K74
84610 + tristate "TPO JBT6K74-AS TFT display ASIC control interface"
84611 + depends on SPI_MASTER && SYSFS
84612 + help
84613 + SPI driver for the control interface of TFT panels containing
84614 + the TPO JBT6K74-AS controller ASIC, such as the TPO TD028TTEC1
84615 + TFT diplay module used in the FIC/Openmoko Neo1973 GSM phones.
84616 +
84617 + The control interface is required for display operation, as it
84618 + controls power management, display timing and gamma calibration.
84619 +
84620 endmenu
84621 Index: linux-2.6.24.7/drivers/video/display/Makefile
84622 ===================================================================
84623 --- linux-2.6.24.7.orig/drivers/video/display/Makefile 2008-12-11 22:46:07.000000000 +0100
84624 +++ linux-2.6.24.7/drivers/video/display/Makefile 2008-12-11 22:46:49.000000000 +0100
84625 @@ -3,4 +3,5 @@
84626 display-objs := display-sysfs.o
84627
84628 obj-$(CONFIG_DISPLAY_SUPPORT) += display.o
84629 +obj-$(CONFIG_DISPLAY_JBT6K74) += jbt6k74.o
84630
84631 Index: linux-2.6.24.7/drivers/video/logo/Kconfig
84632 ===================================================================
84633 --- linux-2.6.24.7.orig/drivers/video/logo/Kconfig 2008-12-11 22:46:07.000000000 +0100
84634 +++ linux-2.6.24.7/drivers/video/logo/Kconfig 2008-12-11 22:46:49.000000000 +0100
84635 @@ -67,6 +67,11 @@ config LOGO_SUPERH_CLUT224
84636 depends on SUPERH
84637 default y
84638
84639 +config LOGO_OPENMOKO_CLUT224
84640 + bool "224-color Openmoko Linux logo"
84641 + depends on MACH_NEO1973_GTA01 || MACH_NEO1973_GTA02
84642 + default y
84643 +
84644 config LOGO_M32R_CLUT224
84645 bool "224-color M32R Linux logo"
84646 depends on M32R
84647 Index: linux-2.6.24.7/drivers/video/logo/logo.c
84648 ===================================================================
84649 --- linux-2.6.24.7.orig/drivers/video/logo/logo.c 2008-12-11 22:46:07.000000000 +0100
84650 +++ linux-2.6.24.7/drivers/video/logo/logo.c 2008-12-11 22:46:49.000000000 +0100
84651 @@ -33,6 +33,7 @@ extern const struct linux_logo logo_supe
84652 extern const struct linux_logo logo_superh_vga16;
84653 extern const struct linux_logo logo_superh_clut224;
84654 extern const struct linux_logo logo_m32r_clut224;
84655 +extern const struct linux_logo logo_openmoko_clut224;
84656
84657 static int nologo;
84658 module_param(nologo, bool, 0);
84659 @@ -105,6 +106,10 @@ const struct linux_logo * __init_refok f
84660 /* M32R Linux logo */
84661 logo = &logo_m32r_clut224;
84662 #endif
84663 +#ifdef CONFIG_LOGO_OPENMOKO_CLUT224
84664 + /* Openmoko Linux logo */
84665 + logo = &logo_openmoko_clut224;
84666 +#endif
84667 }
84668 return logo;
84669 }
84670 Index: linux-2.6.24.7/drivers/video/logo/logo_openmoko_clut224.ppm
84671 ===================================================================
84672 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
84673 +++ linux-2.6.24.7/drivers/video/logo/logo_openmoko_clut224.ppm 2008-12-11 22:46:49.000000000 +0100
84674 @@ -0,0 +1,40003 @@
84675 +P3
84676 +480 500
84677 +255
84678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
84999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
85999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
86999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
87999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
88999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
89999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
90999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
91999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
92999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
93999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
94999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
95999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96475 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
96476 +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 1
96477 +3 3 1 3 3 1 3 3 1 3 3 1 3 3 1 3 3 1
96478 +3 3 1 3 3 1 3 3 1 3 3 1 3 3 1 2 2 2
96479 +2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
96480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96555 +0 0 0 1 1 1 2 2 2 3 3 1 4 3 1 4 3 1
96556 +5 4 1 5 4 1 5 4 1 5 4 1 5 4 1 7 5 2
96557 +7 5 2 7 5 2 7 5 2 7 5 2 7 5 2 7 5 2
96558 +7 5 2 7 5 2 7 5 2 7 5 2 5 4 1 5 4 1
96559 +5 4 1 5 4 1 5 4 1 4 3 1 4 3 1 3 3 1
96560 +3 3 1 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0
96561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
96635 +3 3 1 4 3 1 5 4 1 7 5 2 7 5 2 9 7 3
96636 +9 7 3 9 7 3 10 9 3 10 9 3 11 9 3 11 9 3
96637 +10 9 3 13 11 4 11 9 3 13 11 4 13 11 4 13 11 4
96638 +13 11 4 11 9 3 13 11 4 11 9 3 11 9 3 11 9 3
96639 +10 9 3 9 7 3 9 7 3 9 7 3 7 5 2 7 5 2
96640 +7 5 2 5 4 1 5 4 1 4 3 1 3 3 1 3 3 1
96641 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
96642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96714 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 1 5 4 1
96715 +7 5 2 9 7 3 10 9 3 11 9 3 13 11 4 14 11 4
96716 +15 13 4 15 13 4 15 13 4 16 14 4 18 15 5 18 15 5
96717 +18 15 5 18 15 5 18 15 5 18 15 5 18 15 5 18 15 5
96718 +18 15 5 18 15 5 18 15 5 18 15 5 18 15 5 16 14 4
96719 +16 14 4 15 13 4 15 13 4 14 11 4 13 11 4 13 11 4
96720 +11 9 3 10 9 3 9 7 3 9 7 3 7 5 2 7 5 2
96721 +5 4 1 5 4 1 3 3 1 3 3 1 1 1 1 1 1 1
96722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96794 +0 0 0 0 0 0 2 2 2 4 3 1 7 5 2 9 7 3
96795 +11 9 3 13 11 4 15 13 4 16 14 4 18 15 5 18 15 5
96796 +20 17 5 22 17 5 23 19 6 23 19 6 24 21 6 24 21 6
96797 +24 21 6 25 20 6 25 20 6 25 20 6 25 20 6 25 20 6
96798 +25 20 6 25 20 6 25 20 6 24 21 6 24 21 6 23 19 6
96799 +23 19 6 23 19 6 22 17 5 20 17 5 18 15 5 18 15 5
96800 +18 15 5 16 14 4 15 13 4 14 11 4 13 11 4 13 11 4
96801 +10 9 3 9 7 3 7 5 2 7 5 2 5 4 1 4 3 1
96802 +3 3 1 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
96803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96874 +0 0 0 3 3 1 5 4 1 7 5 2 10 9 3 13 11 4
96875 +16 14 4 18 15 5 22 17 5 23 19 6 24 21 6 25 20 6
96876 +27 23 7 29 24 7 29 24 7 29 24 7 31 27 8 31 27 8
96877 +31 27 8 31 27 8 31 27 8 31 27 8 31 27 8 31 27 8
96878 +31 27 8 31 27 8 31 27 8 31 27 8 31 27 8 31 27 8
96879 +29 24 7 29 24 7 27 23 7 27 23 7 25 20 6 25 20 6
96880 +24 21 6 23 19 6 22 17 5 20 17 5 18 15 5 18 15 5
96881 +16 14 4 15 13 4 13 11 4 11 9 3 10 9 3 9 7 3
96882 +7 5 2 5 4 1 4 3 1 3 3 1 1 1 1 1 1 1
96883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96954 +3 3 1 5 4 1 9 7 3 13 11 4 15 13 4 18 15 5
96955 +22 17 5 24 21 6 27 23 7 29 24 7 31 27 8 31 27 8
96956 +31 27 8 37 31 10 37 31 10 37 31 10 37 31 10 37 31 10
96957 +37 31 10 37 31 10 37 31 10 37 31 10 37 31 10 41 32 10
96958 +37 31 10 37 31 10 37 31 10 37 31 10 37 31 10 37 31 10
96959 +37 31 10 37 31 10 37 31 10 37 31 10 31 27 8 31 27 8
96960 +31 27 8 29 24 7 29 24 7 27 23 7 25 20 6 24 21 6
96961 +23 19 6 20 17 5 18 15 5 18 15 5 15 13 4 14 11 4
96962 +13 11 4 10 9 3 9 7 3 7 5 2 5 4 1 4 3 1
96963 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
96964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97033 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 1
97034 +5 4 1 9 7 3 13 11 4 16 14 4 20 17 5 24 21 6
97035 +27 23 7 31 27 8 31 27 8 37 31 10 37 31 10 37 31 10
97036 +44 35 11 41 32 10 44 35 11 44 35 11 47 39 13 44 35 11
97037 +47 39 13 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
97038 +47 39 13 47 39 13 47 39 13 47 39 13 44 35 11 44 35 11
97039 +41 32 10 44 35 11 37 31 10 41 32 10 37 31 10 37 31 10
97040 +37 31 10 37 31 10 37 31 10 31 27 8 31 27 8 31 27 8
97041 +29 24 7 27 23 7 25 20 6 23 19 6 22 17 5 18 15 5
97042 +18 15 5 15 13 4 14 11 4 13 11 4 10 9 3 7 5 2
97043 +5 4 1 4 3 1 3 3 1 1 1 1 0 0 0 0 0 0
97044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97113 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 1 5 4 1
97114 +9 7 3 14 11 4 18 15 5 22 17 5 25 20 6 29 24 7
97115 +31 27 8 37 31 10 37 31 10 44 35 11 47 39 13 47 39 13
97116 +47 39 13 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
97117 +56 48 15 47 39 13 47 39 13 47 39 13 56 48 15 47 39 13
97118 +47 39 13 47 39 13 47 39 13 56 48 15 47 39 13 47 39 13
97119 +47 39 13 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
97120 +47 39 13 44 35 11 41 32 10 44 35 11 37 31 10 37 31 10
97121 +37 31 10 37 31 10 31 27 8 29 24 7 27 23 7 25 20 6
97122 +24 21 6 22 17 5 18 15 5 18 15 5 15 13 4 13 11 4
97123 +11 9 3 9 7 3 7 5 2 5 4 1 3 3 1 1 1 1
97124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97193 +0 0 0 0 0 0 0 0 0 3 3 1 5 4 1 9 7 3
97194 +14 11 4 18 15 5 23 19 6 27 23 7 31 27 8 37 31 10
97195 +37 31 10 44 35 11 47 39 13 47 39 13 47 39 13 56 48 15
97196 +47 39 13 57 50 17 57 50 17 57 50 17 56 48 15 57 50 17
97197 +56 48 15 57 50 17 57 50 17 57 50 17 56 48 15 57 50 17
97198 +57 50 17 57 50 17 57 50 17 56 48 15 57 50 17 57 50 17
97199 +56 48 15 56 48 15 47 39 13 56 48 15 47 39 13 47 39 13
97200 +47 39 13 47 39 13 47 39 13 47 39 13 47 39 13 44 35 11
97201 +44 35 11 37 31 10 37 31 10 37 31 10 37 31 10 31 27 8
97202 +31 27 8 27 23 7 25 20 6 23 19 6 22 17 5 18 15 5
97203 +16 14 4 14 11 4 13 11 4 9 7 3 7 5 2 5 4 1
97204 +3 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
97205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97273 +0 0 0 0 0 0 3 3 1 5 4 1 9 7 3 13 11 4
97274 +18 15 5 23 19 6 27 23 7 31 27 8 37 31 10 37 31 10
97275 +47 39 13 47 39 13 47 39 13 56 48 15 56 48 15 57 50 17
97276 +57 50 17 57 50 17 56 48 15 57 50 17 56 48 15 57 50 17
97277 +56 48 15 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
97278 +57 50 17 57 50 17 57 50 17 57 50 17 56 48 15 56 48 15
97279 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
97280 +57 50 17 57 50 17 47 39 13 56 48 15 47 39 13 47 39 13
97281 +47 39 13 47 39 13 47 39 13 44 35 11 44 35 11 37 31 10
97282 +37 31 10 37 31 10 31 27 8 29 24 7 27 23 7 25 20 6
97283 +23 19 6 18 15 5 18 15 5 15 13 4 13 11 4 10 9 3
97284 +7 5 2 5 4 1 3 3 1 1 1 1 0 0 0 0 0 0
97285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97353 +0 0 0 2 2 2 5 4 1 9 7 3 13 11 4 18 15 5
97354 +23 19 6 27 23 7 31 27 8 37 31 10 37 31 10 47 39 13
97355 +47 39 13 47 39 13 57 50 17 57 50 17 57 50 17 57 50 17
97356 +57 50 17 57 50 17 57 50 17 56 48 15 57 50 17 57 50 17
97357 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
97358 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
97359 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
97360 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 56 48 15
97361 +56 48 15 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
97362 +44 35 11 37 31 10 37 31 10 37 31 10 31 27 8 31 27 8
97363 +29 24 7 25 20 6 23 19 6 20 17 5 18 15 5 15 13 4
97364 +13 11 4 9 7 3 7 5 2 5 4 1 3 3 1 1 1 1
97365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97433 +1 1 1 4 3 1 7 5 2 13 11 4 16 14 4 22 17 5
97434 +27 23 7 31 27 8 37 31 10 37 31 10 47 39 13 47 39 13
97435 +57 50 16 70 58 37 71 64 51 100 76 42 66 66 66 114 84 45
97436 +138 129 110 140 134 120 163 154 123 176 168 138 185 178 149 192 187 164
97437 +200 196 176 216 206 146 200 196 176 227 222 178 227 222 178 227 222 178
97438 +227 221 169 224 217 160 185 178 149 224 212 126 185 178 149 163 154 123
97439 +150 141 118 149 122 79 142 111 68 100 76 42 70 58 37 57 50 17
97440 +57 50 17 56 48 15 57 50 17 57 50 17 57 50 17 57 50 17
97441 +56 48 15 57 50 17 57 50 17 56 48 15 56 48 15 47 39 13
97442 +47 39 13 47 39 13 47 39 13 44 35 11 37 31 10 37 31 10
97443 +37 31 10 31 27 8 29 24 7 25 20 6 23 19 6 20 17 5
97444 +18 15 5 15 13 4 13 11 4 9 7 3 7 5 2 4 3 1
97445 +2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97513 +3 3 1 7 5 2 11 9 3 15 13 4 20 17 5 25 20 6
97514 +31 27 8 37 31 10 44 40 33 71 64 51 135 101 60 138 129 110
97515 +138 129 110 138 129 110 140 134 120 140 134 120 163 154 123 150 141 118
97516 +150 141 118 140 134 120 138 129 110 138 129 110 138 129 110 138 129 110
97517 +138 129 110 138 129 110 138 129 110 138 129 110 138 129 110 150 141 118
97518 +150 141 118 176 168 138 176 168 138 185 178 149 216 206 146 227 221 169
97519 +227 221 169 227 220 160 227 221 169 227 219 152 226 218 148 216 206 146
97520 +176 168 138 149 122 79 142 111 68 68 60 43 57 50 16 57 50 17
97521 +57 50 17 57 50 17 57 50 17 56 48 15 56 48 15 57 50 17
97522 +56 48 15 47 39 13 47 39 13 47 39 13 47 39 13 44 35 11
97523 +37 31 10 37 31 10 37 31 10 31 27 8 29 24 7 25 20 6
97524 +23 19 6 20 17 5 18 15 5 14 11 4 11 9 3 9 7 3
97525 +5 4 1 3 3 1 1 1 1 0 0 0 0 0 0 0 0 0
97526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2
97593 +5 4 1 9 7 3 14 11 4 20 17 5 33 28 19 71 64 51
97594 +66 66 66 138 129 110 138 129 110 140 134 120 138 129 110 138 129 110
97595 +138 129 110 140 134 120 138 129 110 140 134 120 176 168 138 192 187 164
97596 +192 187 164 185 178 149 150 141 118 138 129 110 138 129 110 138 129 110
97597 +138 129 110 138 129 110 138 129 110 138 129 110 138 129 110 138 129 110
97598 +138 129 110 138 129 110 138 129 110 138 129 110 138 129 110 138 129 110
97599 +150 141 118 163 154 123 185 178 149 224 217 160 228 223 179 227 221 169
97600 +227 219 152 227 219 152 226 218 148 226 218 148 224 212 126 163 154 123
97601 +142 111 68 70 58 37 57 50 17 57 50 17 57 50 17 57 50 17
97602 +57 50 17 57 50 17 57 50 17 47 39 13 56 48 15 47 39 13
97603 +47 39 13 47 39 13 44 35 11 37 31 10 37 31 10 31 27 8
97604 +29 24 7 25 20 6 23 19 6 18 15 5 16 14 4 13 11 4
97605 +10 9 3 7 5 2 5 4 1 3 3 1 1 1 1 0 0 0
97606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97672 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 1
97673 +7 5 2 20 20 20 63 58 50 135 101 60 140 134 120 138 129 110
97674 +140 134 120 138 129 110 138 129 110 140 134 120 138 129 110 140 134 120
97675 +138 129 110 138 129 110 163 154 123 229 226 192 229 226 192 229 226 192
97676 +229 225 190 229 225 190 229 226 192 200 196 176 163 154 123 138 129 110
97677 +138 129 110 135 101 60 138 129 110 66 66 66 138 129 110 138 129 110
97678 +135 101 60 138 129 110 66 66 66 138 129 110 135 101 60 138 129 110
97679 +135 101 60 138 129 110 138 129 110 135 101 60 138 129 110 150 141 118
97680 +192 187 164 227 221 169 227 221 169 227 220 160 227 219 152 226 218 148
97681 +226 217 139 226 218 148 176 168 138 149 122 79 75 62 40 57 50 16
97682 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 47 39 13
97683 +57 50 17 47 39 13 47 39 13 47 39 13 37 31 10 37 31 10
97684 +37 31 10 31 27 8 29 24 7 25 20 6 22 17 5 18 15 5
97685 +15 13 4 13 11 4 9 7 3 5 4 1 3 3 1 1 1 1
97686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97752 +0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 52 52 52
97753 +66 66 66 138 129 110 138 129 110 138 129 110 138 129 110 138 129 110
97754 +138 129 110 138 129 110 138 129 110 138 129 110 138 129 110 138 129 110
97755 +138 129 110 192 187 164 229 226 192 229 226 192 229 225 190 229 225 190
97756 +229 226 192 229 224 185 229 226 192 229 226 192 229 226 192 138 129 110
97757 +138 129 110 138 129 110 138 129 110 138 129 110 138 129 110 138 129 110
97758 +66 66 66 138 129 110 138 129 110 138 129 110 138 129 110 66 66 66
97759 +138 129 110 66 66 66 138 129 110 66 66 66 138 129 110 135 101 60
97760 +138 129 110 142 111 68 150 141 118 176 168 138 227 221 169 227 221 169
97761 +227 220 160 226 218 148 227 218 146 227 218 146 226 217 137 176 168 138
97762 +149 122 79 70 58 37 57 50 17 57 50 17 57 50 17 57 50 17
97763 +56 48 15 57 50 17 47 39 13 47 39 13 47 39 13 47 39 13
97764 +41 32 10 37 31 10 37 31 10 31 27 8 27 23 7 24 21 6
97765 +20 17 5 16 14 4 14 11 4 10 9 3 7 5 2 5 4 1
97766 +2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97832 +0 0 0 0 0 0 17 17 17 66 66 66 138 129 110 138 129 110
97833 +138 129 110 138 129 110 138 129 110 138 129 110 138 129 110 138 129 110
97834 +138 129 110 138 129 110 140 134 120 138 129 110 138 129 110 138 129 110
97835 +185 178 149 229 226 196 229 226 192 229 226 192 229 225 190 229 225 190
97836 +229 226 192 229 226 192 229 225 190 229 226 192 200 196 176 138 129 110
97837 +138 129 110 66 66 66 138 129 110 138 129 110 66 66 66 138 129 110
97838 +138 129 110 135 101 60 66 66 66 138 129 110 66 66 66 140 134 120
97839 +138 129 110 138 129 110 66 66 66 138 129 110 138 129 110 66 66 66
97840 +138 129 110 66 66 66 138 129 110 114 84 45 138 129 110 138 129 110
97841 +192 187 164 227 221 169 227 221 169 227 219 152 227 219 152 227 217 139
97842 +226 217 139 226 217 139 163 154 123 110 81 38 57 50 17 57 50 17
97843 +57 50 17 56 48 15 57 50 17 56 48 15 47 39 13 47 39 13
97844 +47 39 13 47 39 13 37 31 10 37 31 10 31 27 8 29 24 7
97845 +25 20 6 23 19 6 18 15 5 15 13 4 13 11 4 9 7 3
97846 +5 4 1 3 3 1 1 1 1 0 0 0 0 0 0 0 0 0
97847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97912 +24 24 24 66 66 66 138 129 110 138 129 110 140 134 120 66 66 66
97913 +138 129 110 140 134 120 66 66 66 140 134 120 66 66 66 138 129 110
97914 +138 129 110 138 129 110 138 129 110 138 129 110 140 134 120 163 154 123
97915 +229 226 196 229 226 192 229 226 192 229 226 192 229 226 192 229 225 190
97916 +229 226 192 229 225 190 229 226 192 229 226 192 176 168 138 138 129 110
97917 +138 129 110 140 134 120 66 66 66 138 129 110 138 129 110 138 129 110
97918 +66 66 66 138 129 110 138 129 110 135 101 60 138 129 110 138 129 110
97919 +66 66 66 135 101 60 138 129 110 66 66 66 138 129 110 66 66 66
97920 +138 129 110 135 101 60 138 129 110 66 66 66 138 129 110 66 66 66
97921 +135 101 60 149 122 79 176 168 138 227 221 169 227 221 169 227 220 160
97922 +227 219 152 227 218 146 226 217 139 226 217 137 185 178 149 135 101 60
97923 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
97924 +47 39 13 47 39 13 47 39 13 44 35 11 37 31 10 37 31 10
97925 +31 27 8 27 23 7 24 21 6 20 17 5 16 14 4 13 11 4
97926 +9 7 3 7 5 2 4 3 1 1 1 1 0 0 0 0 0 0
97927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
97991 +0 0 0 0 0 0 0 0 0 0 0 0 25 25 25 66 66 66
97992 +138 129 110 138 129 110 66 66 66 140 134 120 66 66 66 140 134 120
97993 +140 134 120 66 66 66 140 134 120 140 134 120 140 134 120 140 134 120
97994 +138 129 110 138 129 110 138 129 110 138 129 110 138 129 110 200 196 176
97995 +230 227 202 229 226 192 229 226 192 229 226 192 229 226 192 229 226 192
97996 +229 226 192 229 226 192 229 226 192 229 226 192 150 141 118 138 129 110
97997 +66 66 66 138 129 110 138 129 110 135 101 60 66 66 66 138 129 110
97998 +138 129 110 66 66 66 138 129 110 66 66 66 138 129 110 66 66 66
97999 +138 129 110 66 66 66 138 129 110 135 101 60 138 129 110 66 66 66
98000 +138 129 110 66 66 66 138 129 110 100 76 42 138 129 110 114 84 45
98001 +138 129 110 66 66 66 142 111 68 135 101 60 163 154 123 224 217 160
98002 +227 221 169 227 220 160 227 219 152 227 218 146 226 217 139 227 218 146
98003 +216 206 146 135 101 60 57 50 17 57 50 17 57 50 17 57 50 17
98004 +57 50 17 56 48 15 47 39 13 47 39 13 47 39 13 37 31 10
98005 +37 31 10 31 27 8 29 24 7 25 20 6 23 19 6 18 15 5
98006 +14 11 4 10 9 3 7 5 2 4 3 1 2 2 2 0 0 0
98007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98071 +0 0 0 1 1 1 17 17 17 66 66 66 138 129 110 138 129 110
98072 +140 134 120 66 66 66 138 129 110 140 134 120 140 134 120 66 66 66
98073 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
98074 +66 66 66 138 129 110 138 129 110 138 129 110 185 178 149 230 227 197
98075 +229 226 196 229 226 192 229 226 192 229 226 192 229 226 192 229 226 192
98076 +229 226 192 229 226 192 229 226 192 229 226 192 138 129 110 138 129 110
98077 +138 129 110 138 129 110 66 66 66 138 129 110 138 129 110 66 66 66
98078 +138 129 110 66 66 66 138 129 110 66 66 66 138 129 110 66 66 66
98079 +138 129 110 66 66 66 138 129 110 66 66 66 66 66 66 138 129 110
98080 +66 66 66 142 111 68 66 66 66 138 129 110 66 66 66 138 129 110
98081 +66 66 66 138 129 110 66 66 66 138 129 110 66 66 66 135 101 60
98082 +163 154 123 224 217 160 227 221 169 227 219 152 227 219 152 226 218 148
98083 +226 218 148 226 217 139 216 206 146 135 101 60 57 50 17 57 50 17
98084 +56 48 15 56 48 15 56 48 15 56 48 15 47 39 13 47 39 13
98085 +44 35 11 37 31 10 37 31 10 31 27 8 27 23 7 23 19 6
98086 +18 15 5 15 13 4 11 9 3 9 7 3 5 4 1 2 2 2
98087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98151 +6 6 6 65 65 65 138 129 110 138 129 110 66 66 66 140 134 120
98152 +66 66 66 140 134 120 140 134 120 66 66 66 140 134 120 140 134 120
98153 +66 66 66 140 134 120 66 66 66 140 134 120 138 129 110 138 129 110
98154 +140 134 120 140 134 120 138 129 110 138 129 110 200 196 176 230 228 209
98155 +229 226 192 229 226 192 229 226 196 229 226 196 229 226 196 229 226 196
98156 +229 226 192 229 226 192 229 226 192 229 224 185 138 129 110 114 84 45
98157 +138 129 110 135 101 60 138 129 110 66 66 66 138 129 110 66 66 66
98158 +138 129 110 66 66 66 138 129 110 66 66 66 66 66 66 138 129 110
98159 +66 66 66 142 111 68 66 66 66 138 129 110 114 84 45 66 66 66
98160 +138 129 110 66 66 66 142 111 68 66 66 66 135 101 60 66 66 66
98161 +142 111 68 66 66 66 135 101 60 66 66 66 142 111 68 66 66 66
98162 +135 101 60 66 66 66 176 168 138 227 220 160 227 221 169 226 218 148
98163 +226 218 148 226 218 148 226 217 139 226 218 148 185 178 149 110 81 38
98164 +57 50 17 57 50 17 57 50 17 47 39 13 57 50 17 47 39 13
98165 +47 39 13 47 39 13 37 31 10 37 31 10 31 27 8 29 24 7
98166 +24 21 6 20 17 5 16 14 4 13 11 4 9 7 3 5 4 1
98167 +3 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
98168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98230 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 47 47 47
98231 +66 66 66 140 134 120 66 66 66 140 134 120 140 134 120 66 66 66
98232 +140 134 120 140 134 120 66 66 66 140 134 120 140 134 120 66 66 66
98233 +140 134 120 140 134 120 140 134 120 138 129 110 140 134 120 66 66 66
98234 +138 129 110 138 129 110 138 129 110 176 168 138 230 227 199 229 226 196
98235 +229 226 192 229 226 196 229 226 196 229 226 192 229 226 196 229 226 192
98236 +229 226 196 229 226 192 229 226 196 227 222 178 66 66 66 138 129 110
98237 +138 129 110 66 66 66 138 129 110 138 129 110 66 66 66 138 129 110
98238 +66 66 66 114 84 45 66 66 66 138 129 110 66 66 66 135 101 60
98239 +66 66 66 66 66 66 138 129 110 66 66 66 66 66 66 138 129 110
98240 +66 66 66 114 84 45 66 66 66 138 129 110 66 66 66 142 111 68
98241 +66 66 66 138 129 110 66 66 66 142 111 68 66 66 66 138 129 110
98242 +66 66 66 142 111 68 66 66 66 142 111 68 185 178 149 227 221 169
98243 +227 220 160 227 219 152 226 218 148 227 218 146 226 217 137 226 217 137
98244 +163 154 123 75 62 40 57 50 17 57 50 17 57 50 17 56 48 15
98245 +56 48 15 47 39 13 47 39 13 44 35 11 37 31 10 37 31 10
98246 +29 24 7 25 20 6 22 17 5 18 15 5 13 11 4 9 7 3
98247 +5 4 1 3 3 1 1 1 1 0 0 0 0 0 0 0 0 0
98248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98310 +0 0 0 0 0 0 0 0 0 9 9 9 66 66 66 138 129 110
98311 +138 129 110 138 129 110 138 129 110 66 66 66 140 134 120 140 134 120
98312 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98313 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 140 134 120
98314 +138 129 110 66 66 66 140 134 120 200 196 176 230 228 209 229 226 192
98315 +229 226 196 229 226 196 229 226 196 229 226 196 230 227 197 230 227 197
98316 +230 227 197 229 226 196 229 226 196 192 187 164 138 129 110 138 129 110
98317 +66 66 66 138 129 110 66 66 66 138 129 110 66 66 66 138 129 110
98318 +66 66 66 138 129 110 66 66 66 66 66 66 66 66 66 138 129 110
98319 +66 66 66 66 66 66 66 66 66 114 84 45 66 66 66 66 66 66
98320 +138 129 110 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
98321 +100 76 42 66 66 66 100 76 42 66 66 66 100 76 42 66 66 66
98322 +114 84 45 66 66 66 135 101 60 66 66 66 114 84 45 138 129 110
98323 +216 206 146 227 221 169 227 219 152 227 219 152 226 218 148 227 218 146
98324 +226 217 137 226 217 137 142 111 68 57 50 17 57 50 17 57 50 17
98325 +56 48 15 47 39 13 47 39 13 47 39 13 44 35 11 37 31 10
98326 +37 31 10 31 27 8 27 23 7 23 19 6 16 14 4 14 11 4
98327 +10 9 3 7 5 2 4 3 1 1 1 1 0 0 0 0 0 0
98328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98390 +0 0 0 1 1 1 24 24 24 138 129 110 140 134 120 66 66 66
98391 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
98392 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 140 134 120
98393 +66 66 66 140 134 120 140 134 120 140 134 120 138 129 110 138 129 110
98394 +138 129 110 140 134 120 163 154 123 230 227 197 229 226 196 230 227 197
98395 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 229 226 192
98396 +230 227 197 230 227 197 230 227 197 176 168 138 138 129 110 66 66 66
98397 +138 129 110 114 84 45 138 129 110 66 66 66 138 129 110 66 66 66
98398 +66 66 66 66 66 66 138 129 110 66 66 66 66 66 66 66 66 66
98399 +66 66 66 138 129 110 66 66 66 66 66 66 66 66 66 57 50 17
98400 +35 34 31 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
98401 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
98402 +57 50 16 57 50 17 57 50 17 57 50 17 57 50 17 70 58 37
98403 +75 62 40 163 154 123 227 221 169 227 219 152 227 219 152 226 218 148
98404 +226 218 148 226 218 148 226 217 137 176 168 138 75 62 40 57 50 17
98405 +57 50 17 57 50 17 57 50 17 47 39 13 47 39 13 47 39 13
98406 +37 31 10 37 31 10 31 27 8 27 23 7 23 19 6 18 15 5
98407 +14 11 4 10 9 3 7 5 2 4 3 1 1 1 1 0 0 0
98408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98470 +3 3 3 65 65 65 138 129 110 66 66 66 140 134 120 138 129 110
98471 +66 66 66 140 134 120 140 134 120 66 66 66 140 134 120 140 134 120
98472 +66 66 66 140 134 120 140 134 120 66 66 66 140 134 120 66 66 66
98473 +140 134 120 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98474 +138 129 110 138 129 110 176 168 138 230 228 209 229 226 196 230 227 197
98475 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
98476 +230 227 197 230 227 197 230 227 197 176 168 138 138 129 110 135 101 60
98477 +138 129 110 66 66 66 138 129 110 66 66 66 114 84 45 66 66 66
98478 +138 129 110 66 66 66 66 66 66 66 66 66 66 66 66 63 58 50
98479 +35 34 31 24 21 6 24 21 6 31 27 8 31 27 8 31 27 8
98480 +31 27 8 31 27 8 31 27 8 31 27 8 31 27 8 31 27 8
98481 +31 27 8 31 27 8 47 39 13 47 39 13 57 50 16 57 50 16
98482 +57 50 16 57 50 16 57 50 17 57 50 17 57 50 17 57 50 16
98483 +57 50 16 57 50 16 135 101 60 216 206 146 227 219 152 227 219 152
98484 +227 219 152 226 218 148 227 218 146 226 217 137 226 217 137 135 101 60
98485 +57 50 17 57 50 17 57 50 17 57 50 17 47 39 13 47 39 13
98486 +47 39 13 37 31 10 37 31 10 31 27 8 27 23 7 23 19 6
98487 +18 15 5 15 13 4 10 9 3 7 5 2 4 3 1 1 1 1
98488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98549 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 17 17 17
98550 +66 66 66 138 129 110 140 134 120 66 66 66 140 134 120 66 66 66
98551 +140 134 120 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98552 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98553 +140 134 120 66 66 66 138 129 110 138 129 110 140 134 120 140 134 120
98554 +66 66 66 138 129 110 200 196 176 229 226 196 230 227 197 230 227 197
98555 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
98556 +230 227 197 230 227 197 230 227 197 150 141 118 138 129 110 66 66 66
98557 +138 129 110 66 66 66 135 101 60 66 66 66 138 129 110 66 66 66
98558 +66 66 66 52 52 52 35 34 31 24 21 6 24 21 6 16 14 4
98559 +16 14 4 16 14 4 16 14 4 16 14 4 16 14 4 16 14 4
98560 +20 17 5 24 21 6 24 21 6 24 21 6 31 27 8 31 27 8
98561 +31 27 8 37 31 10 31 27 8 37 31 10 31 27 8 47 39 13
98562 +35 34 31 57 50 16 57 50 16 57 50 17 57 50 16 57 50 17
98563 +57 50 16 57 50 16 57 50 16 90 68 33 176 168 138 227 219 152
98564 +227 219 152 227 219 152 226 218 148 227 218 146 226 218 148 226 217 137
98565 +163 154 123 57 50 17 57 50 17 57 50 17 57 50 17 56 48 15
98566 +47 39 13 47 39 13 41 32 10 37 31 10 31 27 8 29 24 7
98567 +24 21 6 18 15 5 15 13 4 11 9 3 7 5 2 4 3 1
98568 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98629 +0 0 0 0 0 0 0 0 0 0 0 0 27 27 27 138 129 110
98630 +138 129 110 66 66 66 140 134 120 140 134 120 66 66 66 140 134 120
98631 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98632 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98633 +66 66 66 140 134 120 138 129 110 66 66 66 140 134 120 138 129 110
98634 +138 129 110 140 134 120 230 227 201 230 227 199 230 227 197 230 227 197
98635 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
98636 +230 227 197 230 227 197 230 227 197 163 154 123 138 129 110 66 66 66
98637 +138 129 110 66 66 66 138 129 110 66 66 66 66 66 66 57 50 16
98638 +31 27 8 24 21 6 16 14 4 15 13 4 10 9 3 10 9 3
98639 +10 9 3 10 9 3 10 9 3 10 9 3 10 9 3 15 13 4
98640 +16 14 4 16 14 4 16 14 4 16 14 4 24 21 6 24 21 6
98641 +31 27 8 31 27 8 31 27 8 31 27 8 35 34 31 37 31 10
98642 +47 39 13 47 39 13 47 39 13 57 50 16 57 50 16 57 50 16
98643 +57 50 17 57 50 16 57 50 16 57 50 16 57 50 16 163 154 123
98644 +226 217 139 227 219 152 227 219 152 226 218 148 226 218 148 227 218 146
98645 +226 217 137 224 212 126 75 62 40 57 50 16 57 50 17 56 48 15
98646 +47 39 13 56 48 15 47 39 13 37 31 10 37 31 10 31 27 8
98647 +29 24 7 24 21 6 18 15 5 15 13 4 10 9 3 7 5 2
98648 +4 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
98649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98709 +0 0 0 0 0 0 1 1 1 52 52 52 66 66 66 138 129 110
98710 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98711 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98712 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98713 +140 134 120 66 66 66 138 129 110 138 129 110 138 129 110 66 66 66
98714 +138 129 110 163 154 123 230 227 197 230 227 197 230 227 197 230 227 197
98715 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
98716 +230 227 197 230 227 197 229 226 196 138 129 110 138 129 110 114 84 45
98717 +138 129 110 100 76 42 58 54 45 47 39 13 31 27 8 24 21 6
98718 +16 14 4 10 9 3 10 9 3 6 5 1 3 3 1 3 3 1
98719 +3 3 1 3 3 1 6 5 1 6 5 1 6 5 1 6 5 1
98720 +10 9 3 10 9 3 10 9 3 16 14 4 16 14 4 16 14 4
98721 +24 21 6 24 21 6 31 27 8 31 27 8 31 27 8 37 31 10
98722 +31 27 8 37 31 10 47 39 13 37 31 10 57 50 16 57 50 16
98723 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
98724 +142 111 68 227 219 152 227 219 152 227 219 152 226 218 148 226 218 148
98725 +226 218 148 216 206 146 224 214 136 114 84 45 57 50 17 57 50 17
98726 +57 50 17 57 50 17 47 39 13 47 39 13 44 35 11 37 31 10
98727 +31 27 8 29 24 7 24 21 6 18 15 5 15 13 4 10 9 3
98728 +7 5 2 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0
98729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98789 +0 0 0 0 0 0 52 52 52 138 129 110 138 129 110 66 66 66
98790 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
98791 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
98792 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
98793 +140 134 120 140 134 120 66 66 66 138 129 110 138 129 110 138 129 110
98794 +138 129 110 185 178 149 230 228 209 229 226 196 230 227 197 230 227 197
98795 +230 227 199 230 227 199 230 227 199 230 227 199 230 227 199 230 227 199
98796 +230 227 199 230 227 199 229 226 196 138 129 110 66 66 66 66 66 66
98797 +57 50 17 57 50 16 47 39 13 31 27 8 31 27 8 24 21 6
98798 +24 21 6 15 13 4 6 5 1 3 3 1 3 3 1 1 1 1
98799 +1 1 1 1 1 1 1 1 1 3 3 1 3 3 1 3 3 1
98800 +3 3 1 6 5 1 6 5 1 10 9 3 10 9 3 15 13 4
98801 +16 14 4 16 14 4 24 21 6 24 21 6 31 27 8 31 27 8
98802 +31 27 8 31 27 8 37 31 10 47 39 13 35 34 31 47 39 13
98803 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
98804 +57 50 16 100 76 42 226 218 148 227 219 152 227 219 152 226 218 148
98805 +226 218 148 227 218 146 226 218 148 226 217 139 142 111 68 57 50 17
98806 +57 50 17 56 48 15 56 48 15 47 39 13 47 39 13 47 39 13
98807 +37 31 10 31 27 8 29 24 7 24 21 6 18 15 5 14 11 4
98808 +9 7 3 5 4 1 3 3 1 0 0 0 0 0 0 0 0 0
98809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
98869 +4 4 4 66 66 66 66 66 66 140 134 120 66 66 66 140 134 120
98870 +66 66 66 140 134 120 140 134 120 66 66 66 140 134 120 66 66 66
98871 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
98872 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98873 +66 66 66 138 129 110 140 134 120 66 66 66 138 129 110 66 66 66
98874 +138 129 110 200 196 176 230 227 199 230 227 199 230 227 199 230 227 199
98875 +230 227 199 230 227 199 230 227 199 230 227 199 230 227 201 230 227 199
98876 +230 227 199 230 227 197 229 226 192 138 129 110 75 62 40 57 50 16
98877 +57 50 16 57 50 16 37 31 10 37 31 10 24 21 6 24 21 6
98878 +15 13 4 10 9 3 3 3 1 1 1 1 0 0 0 0 0 0
98879 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
98880 +1 1 1 3 3 1 3 3 1 6 5 1 6 5 1 10 9 3
98881 +10 9 3 16 14 4 16 14 4 20 17 5 24 21 6 24 21 6
98882 +31 27 8 31 27 8 31 27 8 37 31 10 37 31 10 47 39 13
98883 +47 39 13 47 39 13 57 50 16 57 50 16 57 50 16 57 50 16
98884 +57 50 17 57 50 17 75 62 40 216 206 146 227 219 152 227 219 152
98885 +226 218 148 226 218 148 226 218 148 226 218 148 226 217 137 138 129 110
98886 +57 50 17 57 50 17 57 50 17 57 50 17 47 39 13 47 39 13
98887 +47 39 13 37 31 10 31 27 8 27 23 7 23 19 6 18 15 5
98888 +14 11 4 9 7 3 5 4 1 2 2 2 0 0 0 0 0 0
98889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98949 +65 65 65 138 129 110 138 129 110 66 66 66 140 134 120 140 134 120
98950 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
98951 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
98952 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 140 134 120
98953 +66 66 66 140 134 120 66 66 66 140 134 120 138 129 110 138 129 110
98954 +138 129 110 229 226 192 230 227 199 230 227 199 230 227 201 230 227 199
98955 +230 227 201 230 227 201 230 227 201 230 227 201 230 227 201 230 227 201
98956 +230 227 201 229 226 196 229 226 192 71 64 51 57 50 16 57 50 16
98957 +57 50 16 37 31 10 37 31 10 31 27 8 31 27 8 24 21 6
98958 +16 14 4 10 9 3 6 5 1 3 3 1 0 0 0 0 0 0
98959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98960 +0 0 0 1 1 1 1 1 1 1 1 1 3 3 1 3 3 1
98961 +6 5 1 10 9 3 10 9 3 15 13 4 16 14 4 16 14 4
98962 +24 21 6 24 21 6 31 27 8 31 27 8 31 27 8 37 31 10
98963 +47 39 13 47 39 13 47 39 13 57 50 16 57 50 16 57 50 16
98964 +57 50 17 57 50 17 57 50 17 75 62 40 216 206 146 226 218 148
98965 +227 219 152 226 218 148 226 218 148 227 218 146 226 217 139 226 217 137
98966 +163 154 123 57 50 16 57 50 16 57 50 16 56 48 15 47 39 13
98967 +47 39 13 44 35 11 37 31 10 31 27 8 27 23 7 23 19 6
98968 +18 15 5 13 11 4 9 7 3 5 4 1 2 2 2 0 0 0
98969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
98999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99028 +0 0 0 0 0 0 0 0 0 1 1 1 5 5 5 66 66 66
99029 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
99030 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
99031 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
99032 +66 66 66 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
99033 +140 134 120 66 66 66 138 129 110 138 129 110 138 129 110 66 66 66
99034 +140 134 120 229 226 196 230 227 201 230 227 201 230 227 201 230 227 201
99035 +230 227 201 230 227 201 230 227 199 230 227 201 230 227 201 230 227 197
99036 +229 226 192 229 226 192 228 223 179 100 76 42 57 50 16 57 50 16
99037 +57 50 16 57 50 16 47 39 13 31 27 8 31 27 8 16 14 4
99038 +15 13 4 8 7 4 3 3 1 0 0 0 0 0 0 0 0 0
99039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99040 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 3 3 1
99041 +3 3 1 6 5 1 6 5 1 10 9 3 10 9 3 16 14 4
99042 +16 14 4 24 21 6 24 21 6 31 27 8 31 27 8 31 27 8
99043 +37 31 10 37 31 10 47 39 13 47 39 13 47 39 13 57 50 16
99044 +57 50 16 57 50 17 57 50 16 57 50 16 57 50 17 216 206 146
99045 +227 219 152 227 219 152 227 219 152 226 218 148 227 218 146 227 217 139
99046 +224 212 126 163 154 123 57 50 17 57 50 17 57 50 17 57 50 17
99047 +47 39 13 47 39 13 44 35 11 37 31 10 31 27 8 27 23 7
99048 +23 19 6 18 15 5 13 11 4 7 5 2 4 3 1 1 1 1
99049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99108 +0 0 0 0 0 0 0 0 0 0 0 0 65 65 65 138 129 110
99109 +138 129 110 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
99110 +140 134 120 66 66 66 140 134 120 66 66 66 66 66 66 140 134 120
99111 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 66 66 66
99112 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
99113 +140 134 120 138 129 110 66 66 66 138 129 110 66 66 66 138 129 110
99114 +176 168 138 229 226 192 230 227 201 230 227 201 230 227 201 230 227 201
99115 +230 227 201 230 227 201 230 227 201 230 227 199 229 226 192 229 226 192
99116 +229 226 192 229 226 192 229 226 192 71 64 51 57 50 16 57 50 16
99117 +47 39 13 35 34 31 31 27 8 37 31 10 31 27 8 20 17 5
99118 +16 14 4 10 9 3 3 3 1 1 1 1 0 0 0 0 0 0
99119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99120 +0 0 0 1 1 1 1 1 1 3 3 1 1 1 1 3 3 1
99121 +3 3 1 3 3 1 3 3 1 6 5 1 10 9 3 10 9 3
99122 +10 9 3 16 14 4 16 14 4 24 21 6 24 21 6 31 27 8
99123 +31 27 8 37 31 10 37 31 10 47 39 13 47 39 13 57 50 16
99124 +57 50 16 57 50 16 57 50 17 57 50 16 57 50 17 75 61 38
99125 +216 206 146 226 218 148 227 219 152 227 219 152 227 218 146 227 218 146
99126 +227 218 146 226 217 137 163 154 123 71 53 16 57 50 16 57 50 17
99127 +56 48 15 47 39 13 47 39 13 37 31 10 37 31 10 31 27 8
99128 +24 21 6 22 17 5 16 14 4 11 9 3 7 5 2 3 3 1
99129 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99188 +0 0 0 0 0 0 1 1 1 65 65 65 66 66 66 138 129 110
99189 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
99190 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99191 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99192 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 140 134 120
99193 +66 66 66 138 129 110 66 66 66 138 129 110 142 111 68 138 129 110
99194 +185 178 149 230 227 201 230 227 201 230 227 201 230 227 202 230 227 202
99195 +230 227 202 230 227 202 230 227 197 229 226 192 229 226 192 229 226 192
99196 +229 226 192 229 226 192 229 226 192 100 76 42 57 50 16 57 50 16
99197 +57 50 16 57 50 16 47 39 13 31 27 8 24 21 6 20 17 5
99198 +15 13 4 8 7 4 5 4 1 0 0 0 0 0 0 0 0 0
99199 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2
99200 +3 3 1 4 3 1 5 4 1 5 4 1 5 4 1 5 4 1
99201 +5 4 1 6 5 1 6 5 1 5 5 5 6 5 1 10 9 3
99202 +10 9 3 10 9 3 16 14 4 16 14 4 24 21 6 24 21 6
99203 +31 27 8 37 31 10 37 31 10 37 31 10 47 39 13 47 39 13
99204 +56 48 15 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
99205 +70 58 37 216 206 146 227 219 152 227 219 152 227 219 152 227 218 146
99206 +227 218 146 226 217 137 226 217 137 163 154 123 57 50 17 57 50 17
99207 +57 50 17 57 50 17 47 39 13 47 39 13 37 31 10 37 31 10
99208 +31 27 8 25 20 6 20 17 5 15 13 4 10 9 3 5 4 1
99209 +3 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99268 +0 0 0 0 0 0 43 43 43 138 129 110 66 66 66 140 134 120
99269 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 66 66 66
99270 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
99271 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
99272 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99273 +138 129 110 66 66 66 138 129 110 138 129 110 66 66 66 138 129 110
99274 +185 178 149 230 227 201 230 227 202 230 227 202 230 227 202 230 227 202
99275 +230 227 201 230 227 197 229 226 192 229 226 192 229 226 192 229 226 192
99276 +229 226 192 229 226 192 229 226 192 100 76 42 57 50 17 57 50 16
99277 +47 39 13 37 31 10 37 31 10 31 27 8 31 27 8 20 17 5
99278 +15 13 4 6 6 6 3 3 1 1 1 1 0 0 0 0 0 0
99279 +0 0 0 1 1 1 2 2 2 3 3 1 5 4 1 5 4 1
99280 +7 5 2 9 7 3 11 9 3 11 9 3 11 9 3 14 11 4
99281 +14 11 4 13 11 4 13 11 4 10 9 3 15 13 4 10 9 3
99282 +10 9 3 15 13 4 16 14 4 16 14 4 14 14 14 24 21 6
99283 +24 21 6 31 27 8 31 27 8 37 31 10 47 39 13 47 39 13
99284 +47 39 13 57 50 16 57 50 16 57 50 17 57 50 16 57 50 16
99285 +57 50 16 90 68 33 226 218 148 227 219 152 227 219 152 227 218 146
99286 +227 218 146 227 218 146 227 217 139 226 217 137 163 154 123 56 48 15
99287 +57 50 16 56 48 15 56 48 15 47 39 13 47 39 13 37 31 10
99288 +37 31 10 27 23 7 24 21 6 18 15 5 14 11 4 9 7 3
99289 +5 4 1 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
99290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99348 +2 2 2 22 22 22 138 129 110 66 66 66 140 134 120 66 66 66
99349 +140 134 120 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
99350 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
99351 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 140 134 120
99352 +66 66 66 66 66 66 66 66 66 140 134 120 66 66 66 138 129 110
99353 +66 66 66 138 129 110 66 66 66 138 129 110 66 66 66 138 129 110
99354 +200 196 176 230 227 202 230 227 201 230 228 209 230 227 202 230 227 197
99355 +229 226 192 229 226 192 229 226 192 229 226 192 229 226 192 230 227 197
99356 +229 226 192 229 226 192 229 226 192 66 66 66 57 50 16 57 50 16
99357 +57 50 16 47 39 13 47 39 13 31 27 8 31 27 8 16 14 4
99358 +15 13 4 10 9 3 5 4 1 0 0 0 0 0 0 0 0 0
99359 +2 2 2 3 3 1 5 4 1 7 5 2 11 9 3 14 11 4
99360 +14 11 4 15 13 4 18 15 5 18 15 5 18 15 5 20 17 5
99361 +20 17 5 20 17 5 20 17 5 20 17 5 18 15 5 18 15 5
99362 +16 14 4 16 14 4 16 14 4 20 17 5 16 14 4 24 21 6
99363 +24 21 6 31 27 8 31 27 8 37 31 10 37 31 10 47 39 13
99364 +47 39 13 56 48 15 57 50 16 57 50 16 57 50 16 71 53 16
99365 +57 50 17 57 50 17 114 84 45 227 219 152 227 219 152 227 219 152
99366 +227 219 152 227 218 146 227 217 139 226 217 137 226 217 137 149 122 79
99367 +57 50 17 57 50 17 56 48 15 56 48 15 47 39 13 47 39 13
99368 +37 31 10 31 27 8 27 23 7 23 19 6 18 15 5 13 11 4
99369 +9 7 3 4 3 1 1 1 1 0 0 0 0 0 0 0 0 0
99370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99428 +16 16 16 66 66 66 138 129 110 66 66 66 140 134 120 66 66 66
99429 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
99430 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99431 +140 134 120 66 66 66 66 66 66 66 66 66 140 134 120 66 66 66
99432 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99433 +138 129 110 66 66 66 138 129 110 135 101 60 138 129 110 66 66 66
99434 +230 227 197 230 228 209 230 227 201 230 227 201 230 227 197 229 226 192
99435 +229 226 192 230 227 197 229 226 192 230 227 197 229 226 192 230 227 197
99436 +230 227 197 230 227 197 230 227 197 100 76 42 57 50 16 57 50 16
99437 +47 39 13 35 34 31 37 31 10 31 27 8 31 27 8 16 14 4
99438 +16 14 4 6 6 6 3 3 1 1 1 1 1 1 1 4 3 1
99439 +5 4 1 9 7 3 11 9 3 14 11 4 17 13 4 18 15 5
99440 +22 17 5 23 19 6 25 20 6 27 23 7 27 23 7 29 24 7
99441 +29 24 7 29 24 7 29 24 7 27 23 7 27 23 7 24 21 6
99442 +24 21 6 24 21 6 20 17 5 20 17 5 24 21 6 20 17 5
99443 +24 21 6 24 21 6 31 27 8 31 27 8 37 31 10 37 31 10
99444 +47 39 13 47 39 13 56 48 15 57 50 16 57 50 17 57 50 17
99445 +71 53 16 57 50 17 57 50 17 149 122 79 227 219 152 227 219 152
99446 +227 219 152 227 219 152 227 218 146 227 218 146 226 217 137 226 217 137
99447 +135 101 60 57 50 17 57 50 17 56 48 15 47 39 13 47 39 13
99448 +44 35 11 37 31 10 31 27 8 27 23 7 22 17 5 16 14 4
99449 +11 9 3 7 5 2 3 3 1 0 0 0 0 0 0 0 0 0
99450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99507 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 9 9 9
99508 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 140 134 120
99509 +66 66 66 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
99510 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
99511 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 66 66 66
99512 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 138 129 110
99513 +66 66 66 138 129 110 66 66 66 138 129 110 114 84 45 138 129 110
99514 +230 227 201 230 227 202 230 227 201 230 227 197 229 226 192 230 227 197
99515 +230 227 197 229 226 192 230 227 197 230 227 197 230 227 197 230 227 197
99516 +230 227 197 230 227 197 230 228 209 100 76 42 57 50 16 57 50 16
99517 +57 50 16 57 50 16 47 39 13 31 27 8 31 27 8 20 17 5
99518 +15 13 4 10 9 3 5 4 1 5 4 1 5 4 1 9 7 3
99519 +13 11 4 15 13 4 18 15 5 22 17 5 25 20 6 27 23 7
99520 +29 24 7 31 27 8 35 26 8 35 26 8 38 29 9 38 29 9
99521 +38 29 9 38 29 9 37 31 10 38 29 9 35 26 8 31 27 8
99522 +31 27 8 29 24 7 27 23 7 24 21 6 24 21 6 24 21 6
99523 +24 21 6 24 21 6 27 23 7 31 27 8 31 27 8 37 31 10
99524 +37 31 10 47 39 13 47 39 13 57 50 16 57 50 17 71 53 16
99525 +57 50 17 71 53 16 57 50 16 57 50 16 163 154 123 227 219 152
99526 +227 219 152 227 219 152 227 218 146 227 218 146 227 218 146 227 218 146
99527 +226 217 137 100 76 42 57 50 17 57 50 17 57 50 17 47 39 13
99528 +47 39 13 37 31 10 37 31 10 31 27 8 25 20 6 18 15 5
99529 +15 13 4 10 9 3 5 4 1 2 2 2 0 0 0 0 0 0
99530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65 65 65
99588 +138 129 110 66 66 66 138 129 110 66 66 66 66 66 66 140 134 120
99589 +66 66 66 140 134 120 66 66 66 66 66 66 66 66 66 140 134 120
99590 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 140 134 120
99591 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99592 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
99593 +138 129 110 66 66 66 138 129 110 66 66 66 138 129 110 138 129 110
99594 +229 226 192 230 227 201 230 227 197 229 226 192 230 227 197 230 227 197
99595 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
99596 +230 227 197 230 227 197 230 227 197 114 84 45 58 54 45 57 50 16
99597 +47 39 13 37 31 10 37 31 10 31 27 8 31 27 8 20 17 5
99598 +16 14 4 10 9 3 8 7 4 9 7 3 11 9 3 15 13 4
99599 +18 15 5 23 19 6 25 20 6 29 24 7 31 27 8 35 26 8
99600 +38 29 9 41 32 10 41 32 10 44 35 11 44 35 11 44 35 11
99601 +44 35 11 44 35 11 44 35 11 44 35 11 43 33 10 43 33 10
99602 +41 32 10 38 29 9 37 31 10 31 27 8 29 24 7 27 23 7
99603 +27 23 7 31 27 8 27 23 7 31 27 8 31 27 8 37 31 10
99604 +44 35 11 47 39 13 47 39 13 56 48 15 57 50 16 57 50 17
99605 +71 53 16 71 53 16 71 53 16 57 50 16 80 59 18 185 178 149
99606 +227 218 146 227 219 152 227 219 152 227 218 146 227 218 146 227 218 146
99607 +226 217 139 224 212 126 75 62 40 57 50 16 57 50 17 57 50 17
99608 +56 48 15 47 39 13 37 31 10 37 31 10 27 23 7 23 19 6
99609 +18 15 5 13 11 4 9 7 3 4 3 1 1 1 1 0 0 0
99610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99667 +0 0 0 0 0 0 0 0 0 2 2 2 42 42 42 66 66 66
99668 +138 129 110 66 66 66 66 66 66 140 134 120 66 66 66 140 134 120
99669 +66 66 66 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
99670 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99671 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
99672 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
99673 +66 66 66 138 129 110 114 84 45 149 122 79 66 66 66 138 129 110
99674 +230 227 197 229 226 192 230 227 197 230 227 197 230 227 197 230 227 197
99675 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
99676 +230 227 197 230 227 197 230 228 209 135 101 60 57 50 16 57 50 16
99677 +47 39 13 57 50 16 47 39 13 31 27 8 31 27 8 24 21 6
99678 +16 14 4 15 13 4 13 11 4 15 13 4 18 15 5 22 17 5
99679 +25 20 6 29 24 7 31 27 8 35 26 8 41 32 10 44 35 11
99680 +46 36 11 47 39 13 47 39 13 55 43 14 51 40 13 55 43 14
99681 +55 43 14 55 43 14 51 40 13 55 43 14 51 40 13 51 40 13
99682 +46 36 11 46 36 11 43 33 10 41 32 10 38 29 9 35 26 8
99683 +29 24 7 31 27 8 29 24 7 31 27 8 31 27 8 31 27 8
99684 +37 31 10 37 31 10 47 39 13 47 39 13 57 50 16 57 50 17
99685 +57 50 17 71 53 16 57 50 17 71 53 16 71 53 16 90 68 33
99686 +226 217 139 227 219 152 227 219 152 226 218 148 227 218 146 226 218 148
99687 +226 217 139 226 217 137 176 168 138 71 53 16 57 50 17 57 50 17
99688 +56 48 15 47 39 13 47 39 13 37 31 10 37 31 10 27 23 7
99689 +22 17 5 16 14 4 11 9 3 7 5 2 3 3 1 0 0 0
99690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99747 +0 0 0 0 0 0 0 0 0 11 11 11 66 66 66 138 129 110
99748 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99749 +66 66 66 140 134 120 66 66 66 66 66 66 66 66 66 66 66 66
99750 +140 134 120 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
99751 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
99752 +66 66 66 140 134 120 66 66 66 140 134 120 66 66 66 138 129 110
99753 +66 66 66 142 111 68 66 66 66 138 129 110 66 66 66 150 141 118
99754 +229 226 192 229 226 192 230 227 197 230 227 197 230 227 197 230 227 197
99755 +230 227 197 230 227 197 230 227 199 230 227 199 230 227 199 230 227 199
99756 +230 227 201 230 227 201 230 227 201 138 129 110 37 31 10 57 50 16
99757 +57 50 16 47 39 13 37 31 10 37 31 10 31 27 8 24 21 6
99758 +24 21 6 16 14 4 18 15 5 18 15 5 23 17 5 28 21 6
99759 +35 26 8 38 29 9 41 32 10 44 35 11 47 39 13 51 40 13
99760 +55 43 14 55 44 14 58 46 15 56 48 15 59 49 15 59 49 15
99761 +59 49 15 59 49 15 59 49 15 59 49 15 58 46 15 58 46 15
99762 +55 43 14 51 40 13 51 40 13 50 37 12 44 35 11 41 32 10
99763 +38 29 9 35 25 8 35 25 8 35 25 8 35 25 8 35 25 8
99764 +38 29 9 41 32 10 44 35 11 51 40 13 51 40 13 57 50 16
99765 +57 50 17 71 53 16 80 59 18 57 50 17 80 59 18 57 50 16
99766 +142 111 68 227 219 152 227 219 152 227 219 152 226 218 148 227 218 146
99767 +227 218 146 226 217 137 226 217 137 149 122 79 80 59 18 57 50 17
99768 +57 50 17 57 50 17 47 39 13 47 39 13 37 31 10 31 27 8
99769 +25 20 6 18 15 5 14 11 4 9 7 3 5 4 1 2 2 2
99770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99827 +0 0 0 1 1 1 3 3 3 66 66 66 138 129 110 66 66 66
99828 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
99829 +140 134 120 66 66 66 66 66 66 66 66 66 140 134 120 66 66 66
99830 +66 66 66 66 66 66 140 134 120 66 66 66 140 134 120 66 66 66
99831 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
99832 +66 66 66 66 66 66 66 66 66 66 66 66 138 129 110 66 66 66
99833 +66 66 66 138 129 110 66 66 66 135 101 60 75 62 40 138 129 110
99834 +229 226 192 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
99835 +230 227 199 230 227 199 230 227 201 230 227 201 230 227 201 230 227 201
99836 +230 227 201 230 227 201 227 222 178 138 129 110 57 50 16 57 50 16
99837 +57 50 16 57 50 16 47 39 13 37 31 10 31 27 8 27 23 7
99838 +27 23 7 25 20 6 23 17 5 28 21 6 29 24 7 35 26 8
99839 +37 31 10 43 33 10 46 36 11 51 40 13 55 44 14 55 44 14
99840 +59 49 15 57 50 17 67 48 15 59 49 15 71 53 16 71 53 16
99841 +71 53 16 71 53 16 71 53 16 71 53 16 67 48 15 59 49 15
99842 +67 48 15 58 46 15 58 46 15 55 43 14 51 40 13 50 37 12
99843 +44 35 11 41 32 10 38 27 8 38 27 8 35 25 8 35 25 8
99844 +38 27 8 38 29 9 43 33 10 50 37 12 51 40 13 59 49 15
99845 +57 50 16 57 50 17 80 59 18 57 50 17 80 59 18 71 53 16
99846 +71 53 16 163 154 123 227 219 152 227 219 152 227 219 152 227 218 146
99847 +227 218 146 227 218 146 226 217 137 226 217 137 114 84 45 57 50 17
99848 +71 53 16 57 50 17 56 48 15 47 39 13 47 39 13 37 31 10
99849 +29 24 7 23 19 6 18 15 5 13 11 4 7 5 2 4 3 1
99850 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99907 +0 0 0 0 0 0 41 41 41 66 66 66 66 66 66 138 129 110
99908 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
99909 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 66 66 66
99910 +140 134 120 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
99911 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 66 66 66
99912 +140 134 120 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
99913 +66 66 66 142 111 68 66 66 66 71 64 51 57 50 16 150 141 118
99914 +228 223 179 230 227 197 230 227 197 230 227 199 230 227 199 230 227 199
99915 +230 227 201 230 227 201 230 227 201 230 227 201 230 227 202 230 227 202
99916 +230 227 202 230 227 202 230 227 202 138 129 110 47 39 13 57 50 16
99917 +57 50 16 47 39 13 47 39 13 47 39 13 31 27 8 31 27 8
99918 +31 27 8 29 24 7 31 27 8 35 25 8 38 29 9 43 33 10
99919 +46 36 11 51 40 13 55 43 14 58 46 15 59 49 15 67 48 15
99920 +71 53 16 71 53 16 71 53 16 71 53 16 80 59 18 71 53 16
99921 +71 53 16 80 59 18 71 53 16 71 53 16 71 53 16 71 53 16
99922 +71 53 16 71 53 16 59 49 15 59 49 15 58 46 15 55 43 14
99923 +50 37 12 46 36 11 43 33 10 38 27 8 38 27 8 38 27 8
99924 +38 27 8 41 32 10 38 29 9 46 36 11 51 40 13 55 43 14
99925 +59 49 15 57 50 16 71 53 16 80 59 18 57 50 17 80 59 18
99926 +80 59 18 90 68 33 224 214 136 227 220 160 227 219 152 227 219 152
99927 +227 218 146 227 218 146 227 218 146 226 217 139 224 212 126 75 61 38
99928 +71 53 16 57 50 17 57 50 17 55 44 14 47 39 13 44 35 11
99929 +37 31 10 24 21 6 20 17 5 15 13 4 10 9 3 5 4 1
99930 +2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
99987 +1 1 1 5 5 5 138 129 110 66 66 66 140 134 120 66 66 66
99988 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 66 66 66
99989 +140 134 120 66 66 66 66 66 66 66 66 66 140 134 120 66 66 66
99990 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 140 134 120
99991 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
99992 +66 66 66 66 66 66 66 66 66 138 129 110 66 66 66 114 84 45
99993 +66 66 66 142 111 68 71 64 51 57 50 16 57 50 16 150 141 118
99994 +230 227 197 230 227 199 230 227 199 230 227 201 230 227 201 230 227 201
99995 +230 227 201 230 227 202 230 227 202 230 227 202 230 227 202 230 227 202
99996 +230 227 202 230 228 209 229 226 192 138 129 110 57 50 16 57 50 16
99997 +57 50 16 57 50 16 47 39 13 37 31 10 44 35 11 37 31 10
99998 +37 31 10 35 26 8 38 29 9 38 29 9 41 32 10 46 36 11
99999 +51 40 13 55 44 14 59 49 15 59 49 15 71 53 16 71 53 16
100000 +80 59 18 71 53 16 80 59 18 71 53 16 80 59 18 70 58 37
100001 +71 53 16 80 59 18 70 58 37 80 59 18 80 59 18 80 59 18
100002 +71 53 16 79 57 18 71 53 16 71 53 16 67 48 15 59 45 14
100003 +59 45 14 51 40 13 50 37 12 49 31 9 38 29 9 48 30 8
100004 +38 27 8 48 30 8 38 29 9 43 33 10 46 36 11 51 40 13
100005 +59 49 15 57 50 16 57 50 17 71 53 16 80 59 18 57 50 17
100006 +80 59 18 57 50 17 142 111 68 227 219 152 227 219 152 227 219 152
100007 +227 218 146 227 218 146 227 218 146 226 217 139 224 212 126 163 154 123
100008 +71 53 16 71 53 16 59 49 15 57 50 16 55 44 14 47 39 13
100009 +44 35 11 29 24 7 24 21 6 18 15 5 13 11 4 9 7 3
100010 +4 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
100011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100067 +0 0 0 52 52 52 66 66 66 138 129 110 66 66 66 66 66 66
100068 +140 134 120 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
100069 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 66 66 66
100070 +66 66 66 140 134 120 66 66 66 66 66 66 66 66 66 66 66 66
100071 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100072 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
100073 +66 66 66 71 64 51 57 50 16 57 50 16 57 50 16 163 154 123
100074 +229 226 192 230 227 201 230 227 201 230 227 201 230 227 201 230 227 202
100075 +230 227 202 230 227 202 230 227 202 231 228 207 230 227 204 230 227 204
100076 +230 228 209 230 227 202 230 228 209 150 141 118 57 50 16 57 50 16
100077 +57 50 16 57 50 16 47 39 13 47 39 13 47 39 13 37 31 10
100078 +44 35 11 43 33 10 43 33 10 44 35 11 50 37 12 55 43 14
100079 +58 46 15 59 49 15 71 53 16 71 53 16 80 59 18 71 53 16
100080 +70 58 37 80 59 18 90 68 33 138 129 110 163 154 123 200 196 176
100081 +192 187 164 200 196 176 185 178 149 163 154 123 135 101 60 70 58 37
100082 +80 59 18 80 59 18 80 59 18 71 53 16 71 53 16 71 53 16
100083 +59 49 15 60 42 13 51 40 13 50 37 12 43 33 10 41 32 10
100084 +38 27 8 38 27 8 38 27 8 48 30 8 46 36 11 50 37 12
100085 +55 43 14 59 49 15 71 53 16 57 50 17 80 59 18 80 59 18
100086 +80 59 18 80 59 18 57 50 17 185 178 149 227 218 146 227 219 152
100087 +227 219 152 227 218 146 227 218 146 227 218 146 226 217 137 226 217 137
100088 +118 85 44 71 53 16 71 53 16 57 50 17 57 50 16 51 40 13
100089 +47 39 13 37 31 10 27 23 7 22 17 5 16 14 4 11 9 3
100090 +5 4 1 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
100091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100146 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2
100147 +14 14 14 138 129 110 66 66 66 66 66 66 140 134 120 66 66 66
100148 +66 66 66 140 134 120 66 66 66 66 66 66 66 66 66 66 66 66
100149 +140 134 120 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100150 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100151 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100152 +66 66 66 66 66 66 66 66 66 138 129 110 114 84 45 66 66 66
100153 +71 64 51 57 50 16 57 50 16 57 50 16 57 50 16 176 168 138
100154 +230 227 199 230 227 201 230 227 201 230 227 202 230 227 202 230 227 202
100155 +230 227 202 231 228 207 230 227 204 230 227 205 230 227 204 230 228 209
100156 +230 227 202 230 228 209 230 227 199 176 168 138 57 50 16 57 50 16
100157 +57 50 16 57 50 16 47 39 13 56 48 15 47 39 13 47 39 13
100158 +47 39 13 46 36 11 50 37 12 50 37 12 55 43 14 59 49 15
100159 +59 49 15 71 53 16 71 53 16 71 53 16 80 59 18 71 53 16
100160 +100 76 42 163 154 123 229 226 196 230 227 197 230 227 197 230 227 197
100161 +229 226 192 229 226 192 229 226 192 229 226 192 229 226 196 224 217 160
100162 +138 129 110 80 59 18 80 59 18 80 59 18 80 59 18 71 53 16
100163 +71 53 16 67 48 15 59 45 14 57 41 13 50 37 12 49 31 9
100164 +48 30 8 38 27 8 48 30 8 41 32 10 48 30 8 50 37 12
100165 +51 40 13 59 49 15 57 50 16 80 59 18 57 50 17 80 59 18
100166 +70 58 37 80 59 18 80 59 18 107 78 37 226 218 148 227 219 152
100167 +227 219 152 227 219 152 227 218 146 227 218 146 226 217 137 226 217 137
100168 +224 212 126 80 59 18 71 53 16 71 53 16 59 49 15 56 48 15
100169 +51 40 13 44 35 11 31 27 8 25 20 6 18 15 5 14 11 4
100170 +9 7 3 4 3 1 1 1 1 0 0 0 0 0 0 0 0 0
100171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
100227 +66 66 66 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
100228 +66 66 66 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
100229 +66 66 66 66 66 66 140 134 120 66 66 66 66 66 66 140 134 120
100230 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100231 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100232 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100233 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 176 168 138
100234 +229 226 196 230 227 202 230 227 202 230 227 202 230 228 209 230 227 202
100235 +231 228 207 230 227 204 231 228 207 230 228 209 230 227 205 230 227 205
100236 +230 228 209 230 228 209 230 228 209 176 168 138 57 50 16 80 59 18
100237 +57 50 17 57 50 16 57 50 16 56 48 15 47 39 13 55 44 14
100238 +51 40 13 51 40 13 51 40 13 55 43 14 58 46 15 59 49 15
100239 +71 53 16 79 57 18 80 59 18 70 58 37 80 59 18 138 129 110
100240 +229 226 192 230 227 202 230 227 202 230 227 202 230 227 201 230 227 199
100241 +230 227 199 230 227 197 230 227 197 230 227 197 229 226 196 229 226 196
100242 +229 226 192 192 187 164 100 76 42 80 59 18 80 59 18 80 59 18
100243 +79 57 18 71 53 16 67 48 15 60 42 13 57 41 13 50 37 12
100244 +49 31 9 48 30 8 41 32 10 38 27 8 48 30 8 49 31 9
100245 +51 40 13 60 42 13 59 49 15 59 49 15 80 59 18 71 53 16
100246 +80 59 18 80 59 18 80 59 18 80 59 18 163 154 123 227 218 146
100247 +227 219 152 227 219 152 227 218 146 227 218 146 227 218 146 226 217 137
100248 +226 217 137 149 122 79 80 59 18 57 50 17 71 53 16 57 50 17
100249 +55 44 14 47 39 13 37 31 10 27 23 7 23 19 6 16 14 4
100250 +11 9 3 7 5 2 2 2 2 0 0 0 0 0 0 0 0 0
100251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100306 +0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 35 35 35
100307 +66 66 66 140 134 120 66 66 66 66 66 66 66 66 66 140 134 120
100308 +66 66 66 140 134 120 66 66 66 66 66 66 66 66 66 140 134 120
100309 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100310 +66 66 66 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
100311 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100312 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 57 50 16
100313 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 176 168 138
100314 +230 227 202 230 227 201 230 228 209 230 227 204 230 227 204 230 227 205
100315 +230 227 205 231 228 207 230 227 204 231 228 207 230 228 209 230 228 209
100316 +230 227 204 230 228 209 230 228 209 192 187 164 57 50 17 71 53 16
100317 +57 50 17 57 50 17 57 50 16 56 48 15 56 48 15 55 44 14
100318 +58 46 15 59 45 14 58 46 15 59 49 15 67 48 15 71 53 16
100319 +71 53 16 80 59 18 80 59 18 80 59 18 150 141 118 229 226 196
100320 +230 227 202 230 227 204 230 227 204 230 227 202 230 227 202 230 227 201
100321 +230 227 201 230 227 201 230 227 199 230 227 199 229 226 196 229 226 196
100322 +230 227 197 230 227 197 227 222 178 114 84 45 90 65 21 80 59 18
100323 +80 59 18 79 57 18 71 53 16 67 48 15 60 42 13 57 41 13
100324 +49 31 9 48 30 8 48 30 8 48 30 8 48 30 8 49 31 9
100325 +50 37 12 60 42 13 59 49 15 57 50 16 71 53 16 57 50 16
100326 +80 59 18 80 59 18 80 59 18 80 59 18 96 71 33 226 218 148
100327 +227 219 152 227 219 152 227 218 146 227 218 146 227 218 146 226 217 139
100328 +226 217 137 226 217 137 90 68 33 80 59 18 71 53 16 59 49 15
100329 +58 46 15 55 43 14 44 35 11 31 27 8 25 20 6 18 15 5
100330 +14 11 4 9 7 3 4 3 1 1 1 1 0 0 0 0 0 0
100331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 66 66 66
100387 +66 66 66 66 66 66 138 129 110 66 66 66 66 66 66 66 66 66
100388 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100389 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100390 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100391 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100392 +66 66 66 66 66 66 138 129 110 65 65 65 57 50 16 37 31 10
100393 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 185 178 149
100394 +230 228 209 230 227 201 230 228 209 230 227 202 230 228 209 230 228 209
100395 +230 228 209 231 228 207 230 228 209 231 228 207 230 228 209 231 228 207
100396 +230 228 209 230 228 209 230 228 209 200 196 176 80 59 18 57 50 17
100397 +80 59 18 57 50 17 71 53 16 57 50 16 59 49 15 67 48 15
100398 +59 49 15 67 48 15 59 49 15 69 49 15 71 53 16 71 53 16
100399 +80 59 18 80 59 18 80 59 18 138 129 110 230 227 199 230 228 209
100400 +230 228 209 230 227 204 230 227 204 230 227 204 230 227 202 230 227 202
100401 +230 227 202 230 227 201 230 227 201 230 227 199 230 227 199 230 227 197
100402 +230 227 197 230 227 197 229 226 196 227 222 178 100 76 42 80 59 18
100403 +90 65 21 80 59 18 71 53 16 71 53 16 67 48 15 60 42 13
100404 +58 38 12 49 31 9 49 31 9 48 30 8 43 33 10 48 30 8
100405 +50 37 12 58 38 12 60 42 13 67 48 15 71 53 16 80 59 18
100406 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 149 122 79
100407 +227 220 160 227 219 152 227 219 152 227 218 146 227 218 146 227 218 146
100408 +226 217 137 226 217 137 163 154 123 80 59 18 71 53 16 71 53 16
100409 +57 50 17 59 49 15 51 40 13 37 31 10 27 23 7 23 19 6
100410 +16 14 4 11 9 3 5 4 1 2 2 2 0 0 0 0 0 0
100411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100466 +0 0 0 0 0 0 0 0 0 1 1 1 7 7 7 66 66 66
100467 +66 66 66 66 66 66 66 66 66 66 66 66 140 134 120 66 66 66
100468 +66 66 66 140 134 120 66 66 66 66 66 66 140 134 120 66 66 66
100469 +66 66 66 66 66 66 66 66 66 140 134 120 66 66 66 66 66 66
100470 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100471 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100472 +66 66 66 66 66 66 65 65 65 37 31 10 31 27 8 47 39 13
100473 +37 31 10 57 50 16 57 50 16 57 50 16 57 50 16 185 178 149
100474 +230 227 202 230 227 202 230 228 209 230 227 204 230 228 209 231 228 207
100475 +231 228 207 231 228 207 230 228 209 231 228 207 230 228 209 230 228 209
100476 +230 228 209 230 228 209 230 228 209 229 226 192 57 50 17 80 59 18
100477 +71 53 16 71 53 16 57 50 17 71 53 16 67 48 15 67 48 15
100478 +67 48 15 67 48 15 71 53 16 71 53 16 71 53 16 80 59 18
100479 +80 59 18 75 61 38 114 84 45 230 227 202 231 228 207 230 228 209
100480 +230 227 204 230 228 209 230 227 205 230 227 205 230 227 202 231 228 207
100481 +230 227 202 230 227 202 230 227 201 230 227 201 230 227 199 230 227 199
100482 +230 227 197 230 227 197 230 227 197 230 227 197 192 187 164 90 68 33
100483 +90 65 21 80 59 18 80 59 18 78 55 17 71 51 16 67 48 15
100484 +60 42 13 57 34 10 49 31 9 48 30 8 48 30 8 48 30 8
100485 +49 31 9 57 34 10 60 42 13 59 49 15 71 53 16 57 50 16
100486 +80 59 18 80 59 18 80 59 18 80 59 18 90 65 21 96 71 33
100487 +227 219 152 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
100488 +226 217 139 226 217 137 224 212 126 110 81 38 71 53 16 80 59 18
100489 +71 53 16 59 49 15 55 43 14 37 31 10 31 27 8 25 20 6
100490 +18 15 5 13 11 4 9 7 3 4 3 1 1 1 1 0 0 0
100491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100546 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 4 4 4
100547 +12 12 12 26 26 26 42 42 42 65 65 65 66 66 66 66 66 66
100548 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100549 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100550 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100551 +66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65
100552 +66 66 66 66 66 66 35 35 35 31 27 8 31 27 8 47 39 13
100553 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 185 178 149
100554 +230 228 209 230 228 209 230 227 202 230 228 209 230 228 209 230 227 204
100555 +230 228 209 231 228 207 231 229 212 231 228 207 231 229 212 231 229 212
100556 +230 228 209 231 229 212 230 228 209 230 228 209 71 53 16 80 59 18
100557 +57 50 17 80 59 18 71 53 16 71 53 16 71 53 16 71 53 16
100558 +71 53 16 71 53 16 71 53 16 79 57 18 80 59 18 80 59 18
100559 +90 65 21 80 59 18 200 196 176 230 228 209 230 228 209 231 228 207
100560 +231 228 207 230 228 209 230 227 205 231 228 207 230 227 205 230 227 204
100561 +230 227 204 230 227 202 230 227 202 230 227 201 230 227 201 230 227 201
100562 +230 227 199 230 227 197 230 227 197 230 227 197 230 227 197 149 122 79
100563 +90 65 21 90 65 21 80 59 18 80 59 18 71 53 16 69 49 15
100564 +60 42 13 58 38 12 57 34 10 49 31 9 48 30 8 48 30 8
100565 +49 31 9 57 34 10 58 38 12 60 42 13 67 48 15 71 53 16
100566 +80 59 18 80 59 18 80 59 18 90 68 33 80 59 18 80 59 18
100567 +163 154 123 226 217 139 227 219 152 227 219 152 227 218 146 227 218 146
100568 +227 218 146 226 217 137 226 217 137 163 154 123 80 59 18 80 59 18
100569 +71 53 16 71 53 16 58 46 15 47 39 13 37 31 10 27 23 7
100570 +22 17 5 15 13 4 10 9 3 5 4 1 2 2 2 0 0 0
100571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100626 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 4 4 4
100627 +6 6 6 10 10 10 13 13 13 18 18 18 26 26 26 50 50 50
100628 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100629 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100630 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100631 +66 66 66 65 65 65 65 65 65 52 52 52 52 52 52 65 65 65
100632 +52 52 52 45 45 45 19 19 19 31 27 8 31 27 8 47 39 13
100633 +37 31 10 57 50 16 57 50 16 57 50 16 57 50 16 185 178 149
100634 +230 227 202 230 228 209 230 228 209 230 228 209 230 228 209 230 228 209
100635 +230 228 209 231 228 207 231 229 212 230 228 209 231 229 212 230 228 209
100636 +231 229 212 231 229 212 231 229 212 231 229 212 75 62 40 80 59 18
100637 +80 59 18 80 59 18 71 53 16 80 59 18 71 53 16 71 53 16
100638 +71 53 16 80 59 18 71 53 16 80 59 18 80 59 18 80 59 18
100639 +80 59 18 142 111 68 230 228 209 230 228 209 230 228 209 230 228 209
100640 +230 228 209 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
100641 +231 228 207 230 227 204 230 227 202 230 227 202 230 227 201 230 227 201
100642 +230 227 201 230 227 199 230 227 197 229 226 196 229 226 196 227 222 178
100643 +91 66 24 90 65 21 90 65 21 80 59 18 79 57 18 71 51 16
100644 +68 47 15 60 42 13 58 38 12 49 31 9 48 30 8 48 30 8
100645 +48 30 8 50 37 12 58 38 12 59 45 14 59 49 15 71 53 16
100646 +71 53 16 80 59 18 80 59 18 80 59 18 90 65 21 80 59 18
100647 +97 69 27 227 219 152 227 219 152 227 219 152 227 219 152 227 218 146
100648 +227 218 146 226 217 137 226 217 137 226 217 137 110 81 38 80 59 18
100649 +71 53 16 71 53 16 59 49 15 51 40 13 37 31 10 31 27 8
100650 +24 21 6 18 15 5 13 11 4 7 5 2 3 3 1 0 0 0
100651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
100707 +2 2 2 4 4 4 6 6 6 8 8 8 11 11 11 16 16 16
100708 +22 22 22 30 30 30 52 52 52 66 66 66 66 66 66 66 66 66
100709 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100710 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
100711 +65 65 65 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
100712 +52 52 52 19 19 19 24 21 6 31 27 8 37 31 10 47 39 13
100713 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 17 185 178 149
100714 +230 228 209 230 228 209 230 228 209 230 227 204 230 228 209 230 228 209
100715 +231 229 212 231 229 212 231 229 212 230 228 210 231 229 212 231 229 212
100716 +231 229 212 231 229 212 231 229 212 231 229 212 100 76 42 75 61 38
100717 +80 59 18 71 53 16 80 59 18 71 53 16 80 59 18 80 59 18
100718 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 90 68 33
100719 +80 59 18 176 168 138 230 228 210 231 229 212 230 228 209 230 228 209
100720 +230 228 209 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
100721 +230 227 204 230 227 205 230 227 204 230 227 202 230 227 202 230 227 201
100722 +230 227 201 230 227 199 230 227 199 230 227 197 229 226 196 229 226 196
100723 +135 101 60 90 65 21 90 65 21 90 65 21 79 57 18 78 55 17
100724 +69 49 15 68 47 15 62 38 11 56 33 8 49 31 9 48 30 8
100725 +49 31 9 56 33 8 57 34 10 60 42 13 68 47 15 71 53 16
100726 +71 53 16 80 59 18 80 59 18 90 65 21 90 65 21 90 65 21
100727 +80 59 18 163 154 123 227 219 152 227 219 152 227 219 152 227 218 146
100728 +227 218 146 227 218 146 226 217 137 226 217 137 163 154 123 90 65 21
100729 +80 59 18 71 53 16 71 53 16 59 49 15 41 32 10 31 27 8
100730 +27 23 7 20 17 5 15 13 4 9 7 3 5 4 1 1 1 1
100731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
100787 +2 2 2 2 2 2 4 4 4 6 6 6 8 8 8 11 11 11
100788 +14 14 14 20 20 20 26 26 26 33 33 33 50 50 50 66 66 66
100789 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
100790 +66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 52 52 52
100791 +52 52 52 65 65 65 52 52 52 52 52 52 52 52 52 52 52 52
100792 +24 24 24 14 14 14 24 21 6 31 27 8 31 27 8 47 39 13
100793 +35 34 31 47 39 13 57 50 16 57 50 17 57 50 17 176 168 138
100794 +230 228 209 230 228 209 230 228 209 230 228 209 231 229 212 230 228 209
100795 +231 229 212 230 228 210 231 229 212 231 229 212 231 229 212 231 229 214
100796 +231 229 214 231 229 214 231 229 212 231 230 220 142 111 68 80 59 18
100797 +80 59 18 80 59 18 80 59 18 80 59 18 75 61 38 80 59 18
100798 +80 59 18 80 59 18 80 59 18 91 66 24 80 59 18 90 65 21
100799 +80 59 18 229 226 196 231 229 212 231 229 212 231 229 212 231 229 212
100800 +231 229 212 230 228 209 231 228 207 230 228 209 231 228 207 231 228 207
100801 +231 228 207 231 228 207 230 227 205 230 227 204 230 227 202 230 227 202
100802 +230 227 201 230 227 201 230 227 199 230 227 199 229 226 196 229 226 196
100803 +163 154 123 91 66 24 90 65 21 90 65 21 80 59 18 79 57 18
100804 +75 50 15 68 47 15 62 38 11 57 34 10 56 33 8 48 30 8
100805 +49 31 9 49 31 9 58 38 12 62 38 11 68 47 15 71 53 16
100806 +71 53 16 80 59 18 80 59 18 80 59 18 90 65 21 90 65 21
100807 +90 65 21 134 96 54 227 219 152 227 219 152 227 219 152 227 218 146
100808 +227 218 146 227 218 146 226 217 137 226 217 137 224 212 126 110 81 38
100809 +80 59 18 80 59 18 71 53 16 67 48 15 47 39 13 37 31 10
100810 +29 24 7 23 19 6 18 15 5 13 11 4 7 5 2 3 3 1
100811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100867 +1 1 1 1 1 1 1 1 1 2 2 2 3 3 3 5 5 5
100868 +6 6 6 9 9 9 12 12 12 16 16 16 20 20 20 27 27 27
100869 +35 35 35 52 52 52 66 66 66 66 66 66 66 66 66 66 66 66
100870 +66 66 66 65 65 65 65 65 65 52 52 52 52 52 52 52 52 52
100871 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 37 37 37
100872 +14 14 14 11 11 11 24 21 6 31 27 8 37 31 10 47 39 13
100873 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 17 176 168 138
100874 +230 228 209 230 228 209 230 228 209 230 228 209 231 229 212 231 229 212
100875 +231 229 212 231 229 212 231 229 214 231 229 214 231 229 214 231 229 214
100876 +231 229 214 231 229 214 231 229 214 231 229 214 138 129 110 57 50 16
100877 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
100878 +80 59 18 90 68 33 80 59 18 90 65 21 90 65 21 90 65 21
100879 +100 76 42 230 228 210 230 228 210 231 229 212 231 229 212 230 228 209
100880 +231 229 212 230 228 209 230 228 209 230 228 209 231 228 207 231 228 207
100881 +231 228 207 231 228 207 231 228 207 230 227 205 230 227 204 230 227 202
100882 +230 227 202 230 227 201 230 227 201 230 227 199 229 226 196 229 226 196
100883 +185 178 149 90 65 21 91 66 24 91 66 24 90 65 21 80 59 18
100884 +75 50 15 68 47 15 68 47 15 57 34 10 56 33 8 48 30 8
100885 +56 33 8 56 33 8 57 34 10 62 38 11 60 42 13 69 49 15
100886 +71 53 16 80 59 18 80 59 18 90 65 21 90 65 21 90 65 21
100887 +90 65 21 90 65 21 216 206 146 226 218 148 227 219 152 226 218 148
100888 +227 218 146 227 218 146 227 217 139 226 217 137 226 217 137 163 154 123
100889 +80 59 18 80 59 18 80 59 18 71 53 16 56 48 15 37 31 10
100890 +31 27 8 25 20 6 18 15 5 14 11 4 9 7 3 4 3 1
100891 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100947 +0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 3 3 3
100948 +4 4 4 6 6 6 7 7 7 10 10 10 13 13 13 18 18 18
100949 +22 22 22 30 30 30 37 37 37 47 47 47 65 65 65 65 65 65
100950 +65 65 65 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
100951 +52 52 52 52 52 52 50 50 50 50 50 50 47 47 47 12 12 12
100952 +9 9 9 16 14 4 24 21 6 31 27 8 31 27 8 47 39 13
100953 +37 31 10 57 50 16 57 50 16 57 50 17 57 50 17 176 168 138
100954 +230 228 209 230 228 209 230 228 209 231 229 212 231 229 212 231 229 212
100955 +231 229 212 231 229 212 231 229 214 231 229 214 231 229 214 231 229 214
100956 +231 229 214 231 229 214 231 229 214 230 228 209 138 129 110 80 59 18
100957 +90 65 21 80 59 18 80 59 18 80 59 18 90 65 21 80 59 18
100958 +90 65 21 80 59 18 90 65 21 91 66 24 80 59 18 90 68 33
100959 +114 84 45 231 229 214 231 229 214 231 229 214 231 229 212 231 229 212
100960 +230 228 210 231 229 212 230 228 210 230 228 209 230 228 209 231 228 207
100961 +231 228 207 231 228 207 230 227 205 231 228 207 230 227 205 230 227 204
100962 +230 227 202 230 227 202 230 227 201 230 227 201 230 227 199 230 227 201
100963 +216 206 146 97 69 27 97 69 27 90 65 21 90 63 20 80 59 18
100964 +78 55 17 75 50 15 68 47 15 62 38 11 57 34 10 56 33 8
100965 +48 30 8 56 33 8 57 34 10 62 38 11 62 38 11 69 49 15
100966 +71 53 16 80 59 18 80 59 18 80 59 18 90 65 21 90 65 21
100967 +90 65 21 80 59 18 149 122 79 227 219 152 227 219 152 227 219 152
100968 +227 218 146 227 218 146 227 218 146 226 217 137 224 212 126 224 212 126
100969 +90 65 21 80 59 18 80 59 18 71 53 16 57 50 17 37 31 10
100970 +37 31 10 27 23 7 22 17 5 15 13 4 10 9 3 5 4 1
100971 +2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
100999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101027 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
101028 +2 2 2 2 2 2 3 3 3 4 4 4 6 6 6 8 8 8
101029 +10 10 10 13 13 13 17 17 17 21 21 21 26 26 26 35 35 35
101030 +50 50 50 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
101031 +52 52 52 49 49 49 47 47 47 46 46 46 28 28 28 11 11 11
101032 +8 8 8 11 11 11 24 21 6 31 27 8 31 27 8 47 39 13
101033 +57 50 16 57 50 16 57 50 16 57 50 17 57 50 17 163 154 123
101034 +231 230 220 230 228 209 231 229 212 231 229 212 231 229 212 231 229 214
101035 +231 229 214 231 229 214 231 229 214 231 229 214 231 229 214 231 229 217
101036 +231 229 217 231 229 217 231 230 220 231 229 214 163 154 123 80 59 18
101037 +80 59 18 90 68 33 80 59 18 91 66 24 80 59 18 90 68 33
101038 +90 65 21 90 65 21 90 65 21 90 65 21 91 66 24 90 65 21
101039 +135 101 60 231 230 220 231 229 214 231 229 214 231 229 214 231 229 214
101040 +231 229 212 231 229 212 230 228 210 230 228 210 230 228 210 230 228 209
101041 +231 228 207 231 228 207 231 228 207 231 228 207 230 227 205 230 227 205
101042 +230 227 204 230 227 202 230 227 202 230 227 201 230 227 201 230 227 199
101043 +200 196 176 97 69 27 97 69 27 90 65 21 90 65 21 90 63 20
101044 +78 55 17 75 50 15 68 47 15 62 38 11 62 38 11 56 33 8
101045 +48 30 8 56 33 8 56 33 8 62 38 11 62 38 11 68 47 15
101046 +75 50 15 78 55 17 80 59 18 90 65 21 90 65 21 90 65 21
101047 +90 65 21 90 65 21 107 78 37 226 218 148 227 219 152 227 219 152
101048 +227 218 146 227 218 146 227 218 146 226 217 137 226 217 137 226 217 137
101049 +142 111 68 80 59 18 80 59 18 80 59 18 71 53 16 47 39 13
101050 +37 31 10 29 24 7 24 21 6 18 15 5 13 11 4 7 5 2
101051 +3 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
101108 +1 1 1 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
101109 +7 7 7 8 8 8 10 10 10 13 13 13 17 17 17 24 24 24
101110 +30 30 30 42 42 42 52 52 52 52 52 52 52 52 52 49 49 49
101111 +47 47 47 46 46 46 45 45 45 38 38 38 9 9 9 5 5 5
101112 +7 7 7 16 14 4 24 21 6 31 27 8 37 31 10 35 34 31
101113 +47 39 13 57 50 16 57 50 17 57 50 17 57 50 17 150 141 118
101114 +230 228 210 230 228 210 231 229 212 231 229 212 231 229 214 231 229 214
101115 +231 229 214 231 229 214 231 229 214 231 229 217 231 229 217 231 229 217
101116 +231 230 220 231 229 214 231 230 220 231 230 220 185 178 149 80 59 18
101117 +90 65 21 80 59 18 90 65 21 90 65 21 90 65 21 90 65 21
101118 +90 65 21 90 65 21 91 66 24 90 65 21 91 66 24 91 66 24
101119 +100 76 42 231 229 214 231 229 214 231 229 214 231 229 214 231 229 214
101120 +231 229 214 231 229 212 231 229 212 231 229 212 230 228 210 230 228 210
101121 +230 228 209 231 228 207 231 228 207 231 228 207 230 227 205 230 227 205
101122 +230 227 204 230 227 204 230 227 202 230 227 201 230 227 202 229 226 196
101123 +216 206 146 90 65 21 104 73 28 104 73 28 90 63 20 90 63 20
101124 +78 55 17 75 50 15 75 50 15 62 38 11 62 38 11 56 33 8
101125 +56 33 8 56 33 8 56 33 8 62 38 11 62 38 11 68 47 15
101126 +75 50 15 71 53 16 80 59 18 80 59 18 90 65 21 90 65 21
101127 +91 66 24 90 65 21 90 65 21 176 168 138 227 220 160 227 219 152
101128 +227 219 152 227 218 146 227 218 146 226 217 139 226 217 137 224 212 126
101129 +224 212 126 90 65 21 80 59 18 80 59 18 79 57 18 47 39 13
101130 +37 31 10 31 27 8 25 20 6 18 15 5 14 11 4 9 7 3
101131 +4 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
101132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101188 +0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2
101189 +3 3 3 4 4 4 5 5 5 6 6 6 8 8 8 10 10 10
101190 +14 14 14 18 18 18 25 25 25 37 37 37 47 47 47 47 47 47
101191 +46 46 46 45 45 45 43 43 43 22 22 22 11 11 11 6 6 6
101192 +7 7 7 16 14 4 24 21 6 31 27 8 31 27 8 47 39 13
101193 +57 50 16 57 50 16 57 50 16 57 50 17 70 58 37 150 141 118
101194 +231 229 212 231 229 212 231 229 214 231 229 214 231 229 214 231 229 214
101195 +231 229 214 231 229 214 231 229 217 231 229 217 231 229 217 231 229 217
101196 +231 229 217 231 229 217 231 229 217 231 230 220 200 196 176 80 59 18
101197 +90 65 21 90 68 33 80 59 18 91 66 24 90 65 21 90 65 21
101198 +90 65 21 90 65 21 91 66 24 91 66 24 91 66 24 91 66 24
101199 +96 71 33 230 228 209 231 230 220 231 229 214 231 229 214 231 229 214
101200 +231 229 214 231 229 214 231 229 212 231 229 212 231 229 212 230 228 210
101201 +230 228 210 230 228 209 231 228 207 231 228 207 231 228 207 230 227 205
101202 +230 227 205 230 227 204 230 227 202 230 227 202 230 227 201 230 227 201
101203 +176 168 138 97 69 27 104 73 28 90 65 21 90 65 21 90 63 20
101204 +80 59 18 75 50 15 75 50 15 62 38 11 62 38 11 57 34 10
101205 +56 33 8 56 33 8 56 33 8 57 34 10 62 38 11 68 47 15
101206 +75 50 15 75 50 15 80 59 18 90 65 21 90 65 21 90 65 21
101207 +91 66 24 97 69 27 90 65 21 156 118 66 227 219 152 227 219 152
101208 +227 219 152 227 218 146 227 218 146 227 218 146 226 217 137 226 217 137
101209 +224 212 126 100 74 37 90 65 21 80 59 18 80 59 18 56 48 15
101210 +44 35 11 37 31 10 29 24 7 23 19 6 15 13 4 10 9 3
101211 +5 4 1 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0
101212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101268 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
101269 +1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 7 7 7
101270 +9 9 9 12 12 12 17 17 17 22 22 22 32 32 32 41 41 41
101271 +45 45 45 43 43 43 35 35 35 9 9 9 5 5 5 3 3 3
101272 +10 9 3 15 13 4 24 21 6 31 27 8 37 31 10 47 39 13
101273 +57 50 16 57 50 16 57 50 16 71 53 16 57 50 16 150 141 118
101274 +231 229 212 231 229 212 231 229 214 231 229 214 231 229 214 231 229 214
101275 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
101276 +231 229 217 231 230 220 231 230 220 231 229 217 229 226 192 91 66 24
101277 +80 59 18 90 65 21 90 65 21 90 65 21 90 65 21 91 66 24
101278 +91 66 24 91 66 24 91 66 24 91 66 24 91 66 24 97 69 27
101279 +91 66 24 192 187 164 231 229 217 231 229 217 231 229 217 231 229 214
101280 +231 229 214 231 229 214 231 229 214 231 229 212 231 229 212 231 229 212
101281 +230 228 210 230 228 209 230 228 209 231 228 207 231 228 207 231 228 207
101282 +230 227 205 230 227 205 230 227 204 230 227 202 230 227 202 230 227 197
101283 +149 122 79 104 73 28 104 73 28 104 73 28 90 63 20 90 63 20
101284 +90 63 20 75 50 15 75 50 15 75 50 15 62 38 11 62 38 11
101285 +56 33 8 56 33 8 56 33 8 62 38 11 62 38 11 62 38 11
101286 +75 50 15 78 55 17 80 59 18 80 59 18 90 65 21 90 65 21
101287 +90 65 21 104 73 28 90 65 21 110 81 38 227 219 152 227 219 152
101288 +227 219 152 227 218 146 227 218 146 227 218 146 226 217 137 226 217 137
101289 +226 217 137 149 122 79 90 65 21 80 59 18 80 59 18 57 50 17
101290 +44 35 11 37 31 10 31 27 8 24 21 6 18 15 5 13 11 4
101291 +7 5 2 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0
101292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101349 +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 3 3
101350 +4 4 4 5 5 5 8 8 8 10 10 10 14 14 14 18 18 18
101351 +25 25 25 41 41 41 21 21 21 10 10 10 5 5 5 4 4 4
101352 +6 6 6 15 13 4 24 21 6 31 27 8 37 31 10 47 39 13
101353 +57 50 16 57 50 16 57 50 17 80 59 18 57 50 16 138 129 110
101354 +230 227 202 231 229 214 231 229 214 231 229 214 231 229 214 231 229 217
101355 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 230 220
101356 +231 229 217 231 230 220 231 230 220 231 230 220 230 228 210 75 61 38
101357 +90 65 21 90 65 21 90 65 21 91 66 24 90 65 21 91 66 24
101358 +90 65 21 91 66 24 91 66 24 104 73 28 90 65 21 104 73 28
101359 +90 65 21 150 141 118 231 229 212 231 229 214 231 229 217 231 229 217
101360 +231 229 214 231 229 214 231 229 214 231 229 214 231 229 212 231 229 212
101361 +231 229 212 230 228 210 230 228 209 231 228 207 231 228 207 231 228 207
101362 +230 227 205 230 227 205 230 227 205 230 227 204 230 227 202 229 226 196
101363 +110 81 38 104 73 28 104 73 28 90 65 21 90 65 21 90 63 20
101364 +90 63 20 75 50 15 75 50 15 75 50 15 62 38 11 62 38 11
101365 +56 33 8 56 33 8 57 34 10 62 38 11 62 38 11 75 50 15
101366 +68 47 15 75 50 15 78 55 17 90 63 20 90 65 21 90 65 21
101367 +97 69 27 97 69 27 90 65 21 104 73 28 224 212 126 226 218 148
101368 +227 219 152 227 219 152 227 218 146 227 218 146 226 217 139 226 217 137
101369 +226 217 137 224 212 126 80 59 18 90 65 21 80 59 18 71 53 16
101370 +47 39 13 37 31 10 31 27 8 25 20 6 18 15 5 14 11 4
101371 +9 7 3 4 3 1 1 1 1 0 0 0 0 0 0 0 0 0
101372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101429 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2
101430 +2 2 2 4 4 4 5 5 5 7 7 7 8 8 8 11 11 11
101431 +13 13 13 13 13 13 8 8 8 4 4 4 1 1 1 3 3 3
101432 +10 9 3 16 14 4 24 21 6 31 27 8 37 31 10 47 39 13
101433 +57 50 16 57 50 17 57 50 17 57 50 16 57 50 16 149 122 79
101434 +231 229 212 231 229 214 231 229 214 231 229 214 231 229 217 231 229 217
101435 +231 229 217 231 229 217 231 229 217 231 230 220 231 229 217 231 230 220
101436 +231 230 220 231 230 220 231 230 220 231 230 220 231 230 220 110 81 38
101437 +90 65 21 90 65 21 91 66 24 90 65 21 90 65 21 90 65 21
101438 +91 66 24 90 65 21 90 65 21 104 73 28 90 65 21 104 73 28
101439 +104 73 28 104 73 28 229 226 196 231 229 217 231 229 217 231 229 217
101440 +231 229 217 231 229 214 231 229 214 231 229 214 231 229 214 231 229 212
101441 +231 229 212 231 229 212 230 228 210 230 228 209 231 228 207 231 228 207
101442 +231 228 207 230 227 205 230 227 205 230 227 204 229 226 196 176 168 138
101443 +104 73 28 104 73 28 104 73 28 104 73 28 90 63 20 90 63 20
101444 +90 63 20 75 50 15 75 50 15 75 50 15 62 38 11 62 38 11
101445 +62 38 11 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
101446 +75 50 15 75 50 15 78 55 17 90 63 20 90 65 21 90 65 21
101447 +90 65 21 104 73 28 104 73 28 91 66 24 149 122 79 227 219 152
101448 +227 219 152 227 219 152 227 218 146 227 218 146 227 218 146 226 217 137
101449 +226 217 137 224 212 126 110 81 38 91 66 24 80 59 18 80 59 18
101450 +47 39 13 37 31 10 37 31 10 27 23 7 22 17 5 15 13 4
101451 +10 9 3 5 4 1 1 1 1 0 0 0 0 0 0 0 0 0
101452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
101510 +1 1 1 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
101511 +6 6 6 6 6 6 5 5 5 3 3 3 2 2 2 3 3 3
101512 +10 9 3 16 14 4 24 21 6 31 27 8 37 31 10 47 39 13
101513 +57 50 16 57 50 16 80 59 18 80 59 18 80 59 18 135 101 60
101514 +231 230 220 231 229 214 231 229 214 231 229 217 231 229 217 231 229 217
101515 +231 229 217 231 229 217 231 229 217 231 230 220 231 230 220 231 230 220
101516 +231 230 220 231 230 220 231 230 220 200 196 176 176 168 138 100 76 42
101517 +91 66 24 91 66 24 90 65 21 91 66 24 90 65 21 91 66 24
101518 +90 65 21 97 69 27 90 65 21 104 73 28 90 65 21 104 73 28
101519 +90 65 21 104 73 28 150 141 118 230 228 210 231 229 217 231 229 217
101520 +231 229 217 231 229 217 231 229 214 231 229 214 231 229 214 231 229 214
101521 +231 229 212 230 228 210 231 229 212 230 228 210 230 228 209 231 228 207
101522 +231 228 207 231 228 207 230 227 205 230 227 205 229 226 196 117 83 35
101523 +104 73 28 104 73 28 104 73 28 104 73 28 90 63 20 90 63 20
101524 +90 63 20 75 50 15 75 50 15 75 50 15 62 38 11 62 38 11
101525 +62 38 11 62 38 11 62 38 11 62 38 11 62 38 11 75 50 15
101526 +75 50 15 75 50 15 90 63 20 90 63 20 90 63 20 90 65 21
101527 +104 73 28 90 65 21 104 73 28 97 69 27 135 101 60 227 220 160
101528 +227 219 152 227 219 152 227 218 146 227 218 146 227 218 146 226 217 137
101529 +226 217 137 226 217 137 149 122 79 90 65 21 91 66 24 80 59 18
101530 +47 39 13 47 39 13 37 31 10 29 24 7 24 21 6 16 14 4
101531 +11 9 3 5 4 1 2 2 2 0 0 0 0 0 0 0 0 0
101532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101590 +0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
101591 +3 3 3 2 2 2 2 2 2 1 1 1 1 1 1 5 4 1
101592 +10 9 3 18 15 5 24 21 6 31 27 8 47 39 13 47 39 13
101593 +57 50 16 57 50 17 57 50 17 57 50 17 80 59 18 66 66 66
101594 +231 229 214 231 229 214 231 229 217 231 229 217 231 229 217 231 229 217
101595 +231 230 220 231 230 220 231 230 220 231 230 220 200 196 176 176 168 138
101596 +138 129 110 135 101 60 91 66 24 91 66 24 91 66 24 91 66 24
101597 +91 66 24 91 66 24 90 65 21 90 65 21 90 65 21 90 65 21
101598 +90 65 21 90 65 21 90 65 21 104 73 28 90 65 21 104 73 28
101599 +104 73 28 104 73 28 104 73 28 192 187 164 231 229 217 231 229 217
101600 +231 229 217 231 229 217 231 229 217 231 229 214 231 229 214 231 229 214
101601 +231 229 214 231 229 212 231 229 212 230 228 210 230 228 209 231 228 207
101602 +231 228 207 231 228 207 231 228 207 231 228 207 149 122 79 104 73 28
101603 +104 73 28 104 73 28 104 73 28 104 73 28 90 63 20 90 63 20
101604 +75 50 15 90 63 20 75 50 15 62 38 11 75 50 15 62 38 11
101605 +62 38 11 62 38 11 62 38 11 62 38 11 62 38 11 75 50 15
101606 +75 50 15 78 55 17 78 55 17 90 63 20 90 65 21 104 73 28
101607 +90 65 21 104 73 28 90 65 21 104 73 28 104 73 28 226 218 148
101608 +227 219 152 227 219 152 227 219 152 227 218 146 227 218 146 226 217 137
101609 +226 217 137 224 212 126 224 212 126 91 66 24 90 65 21 90 65 21
101610 +57 50 17 47 39 13 37 31 10 31 27 8 25 20 6 18 15 5
101611 +13 11 4 7 5 2 3 3 1 0 0 0 0 0 0 0 0 0
101612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101670 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
101671 +1 1 1 1 1 1 1 1 1 0 0 0 3 3 1 5 4 1
101672 +13 11 4 18 15 5 27 23 7 31 27 8 37 31 10 47 39 13
101673 +57 50 16 57 50 17 80 59 18 80 59 18 80 59 18 100 76 42
101674 +231 230 220 231 230 220 231 229 214 231 230 220 231 229 217 229 226 196
101675 +185 178 149 150 141 118 135 101 60 90 68 33 90 65 21 91 66 24
101676 +90 65 21 90 65 21 90 65 21 91 66 24 91 66 24 91 66 24
101677 +90 65 21 90 65 21 90 65 21 90 65 21 90 65 21 90 65 21
101678 +90 65 21 90 65 21 90 65 21 90 65 21 104 73 28 104 73 28
101679 +104 73 28 104 73 28 104 73 28 117 83 35 200 196 176 231 229 217
101680 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 214 231 229 214
101681 +231 229 214 231 229 212 230 228 210 231 229 212 230 228 210 230 228 209
101682 +231 228 207 231 228 207 231 228 207 163 154 123 117 83 35 104 73 28
101683 +117 83 35 104 73 28 104 73 28 90 63 20 104 73 28 90 63 20
101684 +90 63 20 75 50 15 75 50 15 75 50 15 62 38 11 62 38 11
101685 +62 38 11 62 38 11 75 50 15 62 38 11 75 50 15 75 50 15
101686 +75 50 15 90 63 20 90 63 20 90 63 20 90 63 20 90 65 21
101687 +104 73 28 104 73 28 104 73 28 104 73 28 90 65 21 224 212 126
101688 +226 218 148 227 219 152 226 218 148 227 218 146 227 218 146 226 217 139
101689 +226 217 137 224 212 126 224 212 126 90 65 21 90 65 21 90 65 21
101690 +57 50 16 47 39 13 37 31 10 31 27 8 27 23 7 20 17 5
101691 +14 11 4 9 7 3 4 3 1 1 1 1 0 0 0 0 0 0
101692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101751 +0 0 0 0 0 0 0 0 0 1 0 0 2 1 0 7 5 2
101752 +14 11 4 20 17 5 27 23 7 31 27 8 47 39 13 47 39 13
101753 +57 50 16 57 50 17 80 59 18 57 50 17 80 59 18 90 68 33
101754 +231 230 220 200 196 176 163 154 123 138 129 110 100 76 42 80 59 18
101755 +80 59 18 80 59 18 80 59 18 90 65 21 90 65 21 90 65 21
101756 +90 65 21 90 65 21 91 66 24 91 66 24 91 66 24 90 65 21
101757 +90 65 21 90 65 21 90 65 21 90 65 21 90 65 21 90 65 21
101758 +90 65 21 90 65 21 90 65 21 104 73 28 90 65 21 90 65 21
101759 +104 73 28 104 73 28 104 73 28 104 73 28 117 83 35 192 187 164
101760 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 214 231 229 214
101761 +231 229 214 231 229 214 231 229 212 231 229 212 230 228 210 230 228 209
101762 +231 228 207 231 228 207 149 122 79 104 73 28 104 73 28 117 83 35
101763 +104 73 28 104 73 28 104 73 28 104 73 28 90 63 20 90 63 20
101764 +90 63 20 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
101765 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 90 63 20
101766 +75 50 15 90 63 20 90 63 20 90 63 20 104 73 28 90 65 21
101767 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 150 141 118
101768 +224 217 160 227 219 152 227 219 152 227 218 146 227 218 146 226 217 139
101769 +226 217 137 226 217 137 224 212 126 143 106 60 91 66 24 90 65 21
101770 +57 50 17 47 39 13 44 35 11 37 31 10 29 24 7 22 17 5
101771 +15 13 4 10 9 3 5 4 1 1 1 1 0 0 0 0 0 0
101772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101831 +0 0 0 0 0 0 1 0 0 2 1 0 4 3 1 7 5 2
101832 +14 11 4 18 15 5 28 21 6 31 27 8 44 35 11 47 39 13
101833 +57 50 16 57 50 16 71 53 16 80 59 18 80 59 18 80 59 18
101834 +90 68 33 80 59 18 80 59 18 80 59 18 80 59 18 90 65 21
101835 +90 65 21 90 65 21 91 66 24 90 65 21 90 65 21 90 65 21
101836 +90 65 21 91 66 24 90 65 21 90 65 21 90 65 21 90 65 21
101837 +90 65 21 90 65 21 80 59 18 80 59 18 80 59 18 90 65 21
101838 +80 59 18 90 65 21 90 65 21 90 65 21 90 65 21 104 73 28
101839 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
101840 +163 154 123 229 226 196 231 229 217 231 229 217 231 229 217 231 229 214
101841 +231 229 214 231 229 214 231 229 212 231 229 212 230 228 210 230 228 210
101842 +200 196 176 146 109 61 117 83 35 117 83 35 117 83 35 104 73 28
101843 +104 73 28 104 73 28 104 73 28 90 63 20 90 63 20 90 63 20
101844 +90 63 20 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
101845 +75 50 15 75 50 15 75 50 15 75 50 15 90 63 20 75 50 15
101846 +90 63 20 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
101847 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 154 108 49
101848 +227 218 146 227 219 152 227 219 152 227 218 146 227 218 146 227 218 146
101849 +226 217 139 226 217 137 224 212 126 149 122 79 104 73 28 90 65 21
101850 +71 53 16 47 39 13 47 39 13 31 27 8 31 27 8 23 19 6
101851 +16 14 4 11 9 3 5 4 1 2 2 2 0 0 0 0 0 0
101852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101911 +0 0 0 0 0 0 2 1 0 4 3 1 5 4 1 9 7 3
101912 +14 11 4 18 15 5 28 21 6 35 26 8 43 33 10 47 39 13
101913 +57 50 16 57 50 16 80 59 18 57 50 17 80 59 18 70 58 37
101914 +80 59 18 80 59 18 90 65 21 80 59 18 90 65 21 80 59 18
101915 +90 65 21 80 59 18 90 65 21 80 59 18 90 65 21 90 65 21
101916 +90 65 21 90 65 21 90 65 21 90 65 21 90 65 21 90 65 21
101917 +90 65 21 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
101918 +80 59 18 90 63 20 90 65 21 90 65 21 90 65 21 90 65 21
101919 +104 73 28 104 73 28 104 73 28 104 73 28 117 83 35 104 73 28
101920 +104 73 28 117 83 35 150 141 118 192 187 164 231 229 214 231 229 217
101921 +231 229 214 231 229 214 230 228 210 229 225 190 185 178 149 154 114 62
101922 +117 83 35 117 83 35 104 73 28 117 83 35 117 83 35 117 83 35
101923 +104 73 28 104 73 28 104 73 28 104 73 28 90 63 20 90 63 20
101924 +90 63 20 90 63 20 90 63 20 90 63 20 75 50 15 75 50 15
101925 +75 50 15 90 63 20 75 50 15 90 63 20 90 63 20 90 63 20
101926 +90 63 20 90 63 20 90 63 20 104 73 28 104 73 28 104 73 28
101927 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 134 96 54
101928 +227 220 160 227 219 152 227 219 152 227 218 146 227 218 146 227 218 146
101929 +226 217 137 226 217 137 224 212 126 224 212 126 104 73 28 91 66 24
101930 +80 59 18 47 39 13 47 39 13 37 31 10 31 27 8 24 21 6
101931 +18 15 5 13 11 4 7 5 2 3 3 1 0 0 0 0 0 0
101932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
101991 +0 0 0 2 1 0 3 3 1 4 3 1 7 5 2 9 7 3
101992 +14 11 4 22 17 5 26 19 6 35 25 8 41 32 10 50 37 12
101993 +55 43 14 57 50 16 57 50 17 80 59 18 80 59 18 80 59 18
101994 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
101995 +80 59 18 90 65 21 80 59 18 90 65 21 80 59 18 80 59 18
101996 +80 59 18 90 65 21 80 59 18 90 65 21 80 59 18 80 59 18
101997 +80 59 18 80 59 18 80 59 18 78 55 17 78 55 17 80 59 18
101998 +80 59 18 80 59 18 80 59 18 90 63 20 90 63 20 90 65 21
101999 +104 73 28 104 73 28 104 73 28 117 83 35 104 73 28 117 83 35
102000 +104 73 28 117 83 35 117 83 35 117 83 35 104 73 28 144 102 51
102001 +142 111 68 143 106 60 134 96 54 104 73 28 117 83 35 104 73 28
102002 +117 83 35 117 83 35 117 83 35 117 83 35 104 73 28 104 73 28
102003 +104 73 28 104 73 28 104 73 28 104 73 28 90 63 20 90 63 20
102004 +90 63 20 90 63 20 75 50 15 90 63 20 90 63 20 90 63 20
102005 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
102006 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
102007 +104 73 28 117 83 35 104 73 28 104 73 28 104 73 28 104 73 28
102008 +227 218 146 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
102009 +227 217 139 226 217 137 224 212 126 224 212 126 90 65 21 90 65 21
102010 +80 59 18 57 50 16 47 39 13 37 31 10 31 27 8 24 21 6
102011 +18 15 5 13 11 4 7 5 2 4 3 1 0 0 0 0 0 0
102012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102071 +1 0 0 3 3 1 4 3 1 5 4 1 7 5 2 11 9 3
102072 +14 11 4 18 15 5 26 19 6 29 24 7 38 29 9 44 35 11
102073 +55 43 14 57 50 16 57 50 16 80 59 18 57 50 17 80 59 18
102074 +80 59 18 80 59 18 80 59 18 80 59 18 90 65 21 80 59 18
102075 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
102076 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
102077 +78 55 17 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
102078 +75 50 15 75 50 15 78 55 17 90 63 20 90 63 20 90 65 21
102079 +90 65 21 104 73 28 104 73 28 104 73 28 117 83 35 104 73 28
102080 +117 83 35 104 73 28 117 83 35 104 73 28 117 83 35 117 83 35
102081 +117 83 35 104 73 28 117 83 35 117 83 35 117 83 35 131 88 37
102082 +104 73 28 117 83 35 117 83 35 104 73 28 131 88 37 104 73 28
102083 +131 88 37 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
102084 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
102085 +90 63 20 90 63 20 104 73 28 90 63 20 104 73 28 104 73 28
102086 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
102087 +117 83 35 104 73 28 117 83 35 104 73 28 117 83 35 104 73 28
102088 +226 217 139 227 219 152 227 219 152 227 218 146 227 218 146 227 218 146
102089 +226 217 137 226 217 137 226 217 137 224 212 126 132 90 43 97 69 27
102090 +80 59 18 47 39 13 47 39 13 37 31 10 37 31 10 27 23 7
102091 +20 17 5 14 11 4 9 7 3 4 3 1 1 1 1 0 0 0
102092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
102151 +2 1 0 4 3 1 5 4 1 7 5 2 7 5 2 9 7 3
102152 +17 13 4 17 13 4 30 16 4 29 24 7 38 27 8 43 33 10
102153 +51 40 13 55 44 14 59 49 15 57 50 16 80 59 18 71 53 16
102154 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
102155 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
102156 +80 59 18 78 55 17 78 55 17 75 50 15 75 50 15 75 50 15
102157 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
102158 +75 50 15 75 50 15 75 50 15 90 63 20 90 63 20 90 63 20
102159 +90 63 20 104 73 28 104 73 28 104 73 28 104 73 28 117 83 35
102160 +117 83 35 117 83 35 117 83 35 117 83 35 117 83 35 104 73 28
102161 +117 83 35 117 83 35 117 83 35 117 83 35 104 73 28 131 88 37
102162 +117 83 35 117 83 35 117 83 35 117 83 35 104 73 28 117 83 35
102163 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 90 63 20
102164 +104 73 28 104 73 28 90 63 20 104 73 28 104 73 28 104 73 28
102165 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
102166 +104 73 28 131 88 37 104 73 28 131 88 37 104 73 28 117 83 35
102167 +117 83 35 104 73 28 117 83 35 104 73 28 143 100 47 224 212 126
102168 +216 206 146 227 220 160 227 219 152 227 219 152 227 218 146 227 218 146
102169 +227 217 139 226 217 137 226 217 137 224 212 126 156 118 66 90 65 21
102170 +90 65 21 57 50 16 47 39 13 37 31 10 37 31 10 27 23 7
102171 +20 17 5 15 13 4 9 7 3 5 4 1 1 1 1 0 0 0
102172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0
102231 +4 3 1 5 4 1 7 5 2 7 5 2 11 9 3 11 9 3
102232 +11 9 3 23 17 5 23 17 5 36 23 7 38 27 8 38 29 9
102233 +50 37 12 51 40 13 59 49 15 57 50 16 57 50 16 71 53 16
102234 +57 50 16 71 53 16 57 50 17 71 53 16 71 53 16 71 53 16
102235 +71 53 16 71 53 16 71 53 16 71 53 16 75 50 15 75 50 15
102236 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
102237 +75 50 15 75 50 15 62 38 11 75 50 15 62 38 11 62 38 11
102238 +75 50 15 75 50 15 75 50 15 75 50 15 90 63 20 90 63 20
102239 +90 63 20 90 63 20 104 73 28 104 73 28 104 73 28 104 73 28
102240 +104 73 28 117 83 35 104 73 28 117 83 35 117 83 35 117 83 35
102241 +117 83 35 131 88 37 117 83 35 117 83 35 131 88 37 117 83 35
102242 +117 83 35 117 83 35 131 88 37 104 73 28 131 88 37 104 73 28
102243 +131 88 37 104 73 28 131 88 37 104 73 28 104 73 28 104 73 28
102244 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
102245 +90 63 20 143 92 37 90 63 20 143 92 37 104 73 28 143 92 37
102246 +104 73 28 131 88 37 104 73 28 104 73 28 117 83 35 117 83 35
102247 +104 73 28 117 83 35 131 88 37 224 212 126 227 219 152 226 218 148
102248 +227 219 152 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
102249 +227 217 139 226 217 137 226 217 137 226 217 137 149 122 79 104 73 28
102250 +80 59 18 57 50 17 47 39 13 44 35 11 37 31 10 29 24 7
102251 +23 19 6 16 14 4 10 9 3 5 4 1 2 2 2 0 0 0
102252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102310 +0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 3 3 1
102311 +4 3 1 7 5 2 7 5 2 11 9 3 11 9 3 11 9 3
102312 +14 11 4 17 13 4 30 16 4 30 16 4 36 23 7 38 27 8
102313 +48 30 8 50 37 12 58 38 12 59 45 14 59 49 15 59 49 15
102314 +71 53 16 71 53 16 71 53 16 71 53 16 71 53 16 71 53 16
102315 +69 49 15 69 49 15 68 47 15 68 47 15 68 47 15 68 47 15
102316 +68 47 15 75 50 15 62 38 11 75 50 15 62 38 11 75 50 15
102317 +62 38 11 75 50 15 75 50 15 62 38 11 75 50 15 62 38 11
102318 +75 50 15 75 50 15 75 50 15 75 50 15 90 63 20 90 63 20
102319 +90 63 20 90 63 20 104 73 28 104 73 28 104 73 28 104 73 28
102320 +104 73 28 117 83 35 104 73 28 131 88 37 104 73 28 131 88 37
102321 +104 73 28 131 88 37 117 83 35 117 83 35 117 83 35 131 88 37
102322 +117 83 35 131 88 37 104 73 28 131 88 37 104 73 28 131 88 37
102323 +104 73 28 104 73 28 104 73 28 131 88 37 104 73 28 104 73 28
102324 +143 92 37 90 63 20 143 92 37 104 73 28 143 92 37 104 73 28
102325 +154 97 33 90 63 20 143 92 37 90 63 20 143 92 37 90 63 20
102326 +143 92 37 104 73 28 131 88 37 131 88 37 104 73 28 131 88 37
102327 +154 108 49 224 212 126 226 218 148 224 217 160 224 217 160 224 217 160
102328 +227 220 160 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
102329 +227 218 146 226 217 137 226 217 137 224 212 126 224 212 126 90 65 21
102330 +90 65 21 57 50 16 47 39 13 47 39 13 31 27 8 31 27 8
102331 +24 21 6 16 14 4 11 9 3 5 4 1 2 2 2 0 0 0
102332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102390 +0 0 0 0 0 0 0 0 0 1 0 0 2 1 0 4 3 1
102391 +6 5 1 7 5 2 7 5 2 11 9 3 11 9 3 11 9 3
102392 +17 13 4 17 13 4 23 17 5 23 17 5 36 23 7 38 27 8
102393 +38 27 8 48 30 8 46 36 11 57 34 10 57 41 13 60 42 13
102394 +59 45 14 59 49 15 59 49 15 59 49 15 59 45 14 68 47 15
102395 +62 38 11 68 47 15 62 38 11 68 47 15 62 38 11 75 50 15
102396 +62 38 11 62 38 11 75 50 15 62 38 11 75 50 15 62 38 11
102397 +75 50 15 62 38 11 62 38 11 75 50 15 62 38 11 62 38 11
102398 +62 38 11 75 50 15 75 50 15 75 50 15 75 50 15 90 63 20
102399 +90 63 20 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
102400 +104 73 28 104 73 28 104 73 28 117 83 35 104 73 28 117 83 35
102401 +117 83 35 117 83 35 117 83 35 131 88 37 117 83 35 131 88 37
102402 +117 83 35 131 88 37 104 73 28 154 97 33 104 73 28 143 92 37
102403 +104 73 28 154 97 33 104 73 28 143 92 37 90 63 20 143 92 37
102404 +90 63 20 143 92 37 90 63 20 143 92 37 90 63 20 143 92 37
102405 +90 63 20 143 92 37 104 73 28 143 92 37 104 73 28 143 92 37
102406 +104 73 28 131 88 37 104 73 28 143 92 37 156 118 66 216 206 146
102407 +227 220 160 224 217 160 227 221 169 227 221 169 227 220 160 227 220 160
102408 +227 220 160 227 220 160 227 219 152 227 219 152 227 218 146 227 218 146
102409 +227 217 139 226 217 137 224 212 126 224 212 126 224 212 126 104 73 28
102410 +90 65 21 57 50 16 47 39 13 47 39 13 37 31 10 31 27 8
102411 +24 21 6 18 15 5 13 11 4 7 5 2 3 3 1 0 0 0
102412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102470 +0 0 0 0 0 0 0 0 0 2 1 0 4 3 1 5 4 1
102471 +7 5 2 9 7 3 11 9 3 11 9 3 14 11 4 14 11 4
102472 +17 13 4 30 16 4 17 13 4 30 16 4 30 16 4 36 23 7
102473 +38 27 8 43 33 10 48 30 8 50 37 12 56 33 8 58 38 12
102474 +58 38 12 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
102475 +62 38 11 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
102476 +62 38 11 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
102477 +62 38 11 62 38 11 75 50 15 62 38 11 62 38 11 75 50 15
102478 +75 50 15 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
102479 +90 63 20 90 63 20 90 63 20 104 73 28 90 63 20 104 73 28
102480 +104 73 28 104 73 28 104 73 28 131 88 37 104 73 28 131 88 37
102481 +117 83 35 131 88 37 117 83 35 131 88 37 117 83 35 131 88 37
102482 +117 83 35 131 88 37 131 88 37 104 73 28 131 88 37 131 88 37
102483 +104 73 28 131 88 37 104 73 28 104 73 28 143 92 37 90 63 20
102484 +143 92 37 90 63 20 154 97 33 90 63 20 154 97 33 104 73 28
102485 +143 92 37 104 73 28 143 92 37 104 73 28 143 92 37 104 73 28
102486 +143 92 37 154 97 33 163 154 123 227 219 152 227 221 169 228 223 179
102487 +227 221 169 227 221 169 227 221 169 227 220 160 227 220 160 227 220 160
102488 +227 220 160 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
102489 +227 218 146 226 217 137 226 217 137 224 212 126 224 212 126 90 65 21
102490 +90 65 21 57 50 16 56 48 15 47 39 13 37 31 10 31 27 8
102491 +27 23 7 18 15 5 11 9 3 7 5 2 3 3 1 0 0 0
102492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102550 +0 0 0 0 0 0 2 1 0 3 3 1 4 3 1 7 5 2
102551 +7 5 2 7 5 2 11 9 3 14 11 4 14 11 4 17 13 4
102552 +17 13 4 17 13 4 17 13 4 30 16 4 30 16 4 38 21 5
102553 +38 21 5 38 27 8 48 30 8 48 30 8 49 31 9 50 37 12
102554 +56 33 8 57 34 10 58 38 12 57 34 10 62 38 11 62 38 11
102555 +57 34 10 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
102556 +62 38 11 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
102557 +75 50 15 62 38 11 62 38 11 62 38 11 75 50 15 62 38 11
102558 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
102559 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
102560 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 131 88 37
102561 +104 73 28 117 83 35 131 88 37 117 83 35 131 88 37 131 88 37
102562 +117 83 35 143 92 37 104 73 28 154 97 33 104 73 28 143 92 37
102563 +104 73 28 154 97 33 104 73 28 154 97 33 104 73 28 154 97 33
102564 +104 73 28 154 97 33 104 73 28 154 97 33 104 73 28 154 97 33
102565 +104 73 28 154 97 33 104 73 28 131 88 37 154 97 33 156 118 66
102566 +216 206 146 228 223 179 227 221 169 228 223 179 228 223 179 227 221 169
102567 +227 221 169 227 221 169 227 221 169 227 221 169 227 220 160 227 220 160
102568 +227 220 160 227 220 160 227 219 152 227 219 152 227 218 146 227 218 146
102569 +227 217 139 226 217 137 226 217 137 224 212 126 224 212 126 117 83 35
102570 +90 65 21 57 50 16 47 39 13 47 39 13 37 31 10 31 27 8
102571 +25 20 6 18 15 5 13 11 4 7 5 2 4 3 1 0 0 0
102572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102630 +0 0 0 1 0 0 2 1 0 4 3 1 5 4 1 7 5 2
102631 +11 9 3 11 9 3 11 9 3 14 11 4 17 13 4 30 16 4
102632 +17 13 4 30 16 4 17 13 4 30 16 4 30 16 4 30 16 4
102633 +38 21 5 38 21 5 38 21 5 48 30 8 48 30 8 48 30 8
102634 +49 31 9 56 33 8 56 33 8 56 33 8 56 33 8 56 33 8
102635 +56 33 8 57 34 10 56 33 8 56 33 8 62 38 11 62 38 11
102636 +62 38 11 62 38 11 62 38 11 62 38 11 75 50 15 62 38 11
102637 +62 38 11 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
102638 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 90 63 20
102639 +75 50 15 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
102640 +104 73 28 104 73 28 104 73 28 131 88 37 104 73 28 131 88 37
102641 +131 88 37 131 88 37 104 73 28 154 97 33 104 73 28 154 97 33
102642 +117 83 35 131 88 37 131 88 37 131 88 37 131 88 37 131 88 37
102643 +131 88 37 104 73 28 154 97 33 104 73 28 143 92 37 104 73 28
102644 +154 97 33 104 73 28 154 97 33 104 73 28 154 97 33 104 73 28
102645 +154 97 33 143 92 37 154 114 62 216 206 146 227 221 169 229 225 190
102646 +229 224 185 228 223 179 228 223 179 228 223 179 228 223 179 227 221 169
102647 +227 221 169 227 221 169 227 221 169 227 220 160 227 221 169 227 220 160
102648 +227 220 160 227 219 152 227 219 152 227 219 152 226 218 148 227 218 146
102649 +227 218 146 226 217 137 226 217 137 224 212 126 224 212 126 140 95 42
102650 +90 65 21 57 50 16 47 39 13 47 39 13 37 31 10 37 31 10
102651 +27 23 7 20 17 5 14 11 4 9 7 3 4 3 1 0 0 0
102652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102710 +0 0 0 2 1 0 4 3 1 5 4 1 7 5 2 7 5 2
102711 +9 7 3 11 9 3 14 11 4 14 11 4 17 13 4 17 13 4
102712 +17 13 4 17 13 4 30 16 4 30 16 4 30 16 4 30 16 4
102713 +38 21 5 38 21 5 38 21 5 38 21 5 38 21 5 48 30 8
102714 +48 30 8 48 30 8 48 30 8 56 33 8 48 30 8 56 33 8
102715 +56 33 8 56 33 8 56 33 8 56 33 8 62 38 11 56 33 8
102716 +62 38 11 62 38 11 75 50 15 62 38 11 62 38 11 75 50 15
102717 +75 50 15 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
102718 +75 50 15 75 50 15 75 50 15 90 63 20 90 63 20 75 50 15
102719 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
102720 +90 63 20 104 73 28 104 73 28 104 73 28 104 73 28 131 88 37
102721 +104 73 28 131 88 37 131 88 37 117 83 35 131 88 37 131 88 37
102722 +131 88 37 131 88 37 131 88 37 131 88 37 131 88 37 131 88 37
102723 +131 88 37 143 92 37 131 88 37 131 88 37 143 92 37 154 97 33
102724 +104 73 28 143 92 37 143 92 37 143 92 37 154 97 33 156 118 66
102725 +176 168 138 227 222 178 229 224 185 229 224 185 229 224 185 229 224 185
102726 +229 224 185 228 223 179 228 223 179 228 223 179 228 223 179 228 223 179
102727 +227 221 169 227 221 169 227 221 169 227 221 169 227 220 160 227 220 160
102728 +227 220 160 227 220 160 227 219 152 227 219 152 226 218 148 227 218 146
102729 +227 218 146 226 217 137 226 217 137 224 212 126 224 212 126 146 109 61
102730 +80 59 18 57 50 16 57 50 17 47 39 13 37 31 10 37 31 10
102731 +27 23 7 20 17 5 14 11 4 9 7 3 4 3 1 1 1 1
102732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102786 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
102787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102790 +1 0 0 3 3 1 4 3 1 5 4 1 7 5 2 9 7 3
102791 +11 9 3 14 11 4 14 11 4 17 13 4 30 16 4 17 13 4
102792 +30 16 4 30 16 4 30 16 4 30 16 4 30 16 4 30 16 4
102793 +38 21 5 38 21 5 38 21 5 38 21 5 48 30 8 38 21 5
102794 +48 30 8 48 30 8 48 30 8 48 30 8 56 33 8 56 33 8
102795 +56 33 8 56 33 8 56 33 8 62 38 11 62 38 11 62 38 11
102796 +62 38 11 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
102797 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 90 63 20
102798 +75 50 15 90 63 20 90 63 20 75 50 15 90 63 20 90 63 20
102799 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
102800 +104 73 28 104 73 28 143 92 37 104 73 28 143 92 37 104 73 28
102801 +143 92 37 104 73 28 154 97 33 117 83 35 154 97 33 117 83 35
102802 +143 92 37 131 88 37 131 88 37 131 88 37 131 88 37 131 88 37
102803 +131 88 37 131 88 37 131 88 37 143 92 37 104 73 28 154 97 33
102804 +143 92 37 154 97 33 156 118 66 185 178 149 229 224 185 229 224 185
102805 +229 224 185 229 224 185 229 224 185 229 224 185 229 224 185 229 224 185
102806 +229 224 185 228 223 179 228 223 179 228 223 179 227 221 169 227 221 169
102807 +228 223 179 227 221 169 227 221 169 227 220 160 227 220 160 227 220 160
102808 +227 220 160 227 219 152 227 219 152 227 219 152 227 219 152 227 218 146
102809 +227 217 139 227 217 139 226 217 137 226 217 137 224 212 126 156 118 66
102810 +90 65 21 57 50 16 47 39 13 47 39 13 47 39 13 31 27 8
102811 +27 23 7 23 19 6 15 13 4 9 7 3 5 4 1 1 1 1
102812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102865 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 1
102866 +4 3 1 4 3 1 5 4 1 5 4 1 5 4 1 4 3 1
102867 +3 3 1 3 3 1 1 1 1 1 1 1 0 0 0 0 0 0
102868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102870 +1 0 0 4 3 1 5 4 1 7 5 2 7 5 2 11 9 3
102871 +11 9 3 14 11 4 17 13 4 17 13 4 17 13 4 14 11 4
102872 +30 16 4 17 13 4 30 16 4 30 16 4 30 16 4 30 16 4
102873 +38 21 5 38 21 5 38 21 5 38 21 5 48 30 8 48 30 8
102874 +48 30 8 48 30 8 48 30 8 56 33 8 56 33 8 56 33 8
102875 +56 33 8 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
102876 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
102877 +75 50 15 75 50 15 90 63 20 90 63 20 90 63 20 90 63 20
102878 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
102879 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
102880 +104 73 28 90 63 20 104 73 28 104 73 28 104 73 28 104 73 28
102881 +131 88 37 131 88 37 131 88 37 131 88 37 131 88 37 131 88 37
102882 +131 88 37 131 88 37 131 88 37 154 97 33 131 88 37 143 92 37
102883 +143 92 37 143 92 37 131 88 37 154 97 33 156 118 66 156 118 66
102884 +216 206 146 229 224 185 230 227 199 229 225 190 229 225 190 229 225 190
102885 +229 225 190 229 225 190 229 224 185 229 224 185 229 224 185 228 223 179
102886 +229 224 185 228 223 179 228 223 179 228 223 179 228 223 179 228 223 179
102887 +227 221 169 227 221 169 227 221 169 227 221 169 227 220 160 227 220 160
102888 +227 220 160 227 220 160 227 219 152 227 219 152 227 218 146 227 218 146
102889 +227 218 146 226 217 137 226 217 137 224 212 126 224 212 126 156 118 66
102890 +80 59 18 57 50 16 57 50 16 47 39 13 37 31 10 37 31 10
102891 +27 23 7 20 17 5 15 13 4 9 7 3 5 4 1 1 1 1
102892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102945 +0 0 0 0 0 0 1 1 1 3 3 1 5 4 1 5 4 1
102946 +7 5 2 9 7 3 9 7 3 9 7 3 9 7 3 9 7 3
102947 +7 5 2 7 5 2 5 4 1 5 4 1 4 3 1 3 3 1
102948 +3 3 1 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1
102949 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 0
102950 +4 3 1 5 4 1 7 5 2 9 7 3 11 9 3 11 9 3
102951 +17 13 4 17 13 4 17 13 4 30 16 4 30 16 4 30 16 4
102952 +30 16 4 30 16 4 30 16 4 30 16 4 38 21 5 38 21 5
102953 +38 21 5 38 21 5 48 30 8 48 30 8 48 30 8 48 30 8
102954 +56 33 8 56 33 8 56 33 8 56 33 8 57 34 10 62 38 11
102955 +62 38 11 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
102956 +75 50 15 75 50 15 75 50 15 75 50 15 90 63 20 90 63 20
102957 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
102958 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
102959 +90 63 20 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
102960 +104 73 28 104 73 28 143 92 37 104 73 28 154 97 33 131 88 37
102961 +131 88 37 131 88 37 131 88 37 143 92 37 131 88 37 154 97 33
102962 +131 88 37 154 97 33 131 88 37 131 88 37 131 88 37 154 97 33
102963 +154 97 33 156 118 66 176 168 138 227 221 169 230 227 201 231 228 207
102964 +231 228 207 230 227 201 229 226 196 230 227 197 230 227 197 229 225 190
102965 +229 225 190 229 225 190 229 224 185 229 225 190 229 224 185 229 224 185
102966 +229 224 185 228 223 179 228 223 179 227 221 169 228 223 179 227 221 169
102967 +227 221 169 227 221 169 227 221 169 227 220 160 227 221 169 227 220 160
102968 +227 220 160 227 219 152 227 219 152 227 219 152 227 218 149 227 218 146
102969 +227 218 146 226 217 137 226 217 137 226 217 137 224 212 126 156 118 66
102970 +90 65 21 57 50 16 57 50 16 47 39 13 47 39 13 31 27 8
102971 +31 27 8 23 19 6 15 13 4 9 7 3 5 4 1 1 1 1
102972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
102999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103025 +0 0 0 2 2 2 4 3 1 7 5 2 9 7 3 10 9 3
103026 +13 11 4 13 11 4 13 11 4 14 11 4 14 11 4 13 11 4
103027 +13 11 4 11 9 3 10 9 3 9 7 3 9 7 3 7 5 2
103028 +7 5 2 5 4 1 5 4 1 5 4 1 5 4 1 5 4 1
103029 +4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 5 4 1
103030 +5 4 1 9 7 3 11 9 3 11 9 3 14 11 4 14 11 4
103031 +30 16 4 17 13 4 30 16 4 17 13 4 30 16 4 30 16 4
103032 +30 16 4 30 16 4 38 21 5 38 21 5 38 21 5 38 21 5
103033 +48 30 8 48 30 8 48 30 8 56 33 8 56 33 8 56 33 8
103034 +56 33 8 57 34 10 62 38 11 62 38 11 75 50 15 62 38 11
103035 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
103036 +75 50 15 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
103037 +90 63 20 90 63 20 90 63 20 90 63 20 104 73 28 90 63 20
103038 +104 73 28 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
103039 +90 63 20 90 63 20 104 73 28 90 63 20 104 73 28 104 73 28
103040 +104 73 28 104 73 28 90 63 20 143 92 37 104 73 28 104 73 28
103041 +131 88 37 131 88 37 131 88 37 154 97 33 131 88 37 131 88 37
103042 +154 97 33 131 88 37 154 97 33 156 118 66 163 154 123 216 206 146
103043 +229 226 196 230 227 201 230 227 199 230 227 202 230 227 202 230 227 202
103044 +229 226 196 230 227 201 229 225 190 230 227 197 229 225 190 230 227 197
103045 +229 225 190 229 225 190 229 224 185 229 224 185 229 224 185 228 223 179
103046 +229 224 185 228 223 179 228 223 179 228 223 179 227 221 169 228 223 179
103047 +227 221 169 227 221 169 227 221 169 227 221 169 227 220 160 227 220 160
103048 +227 220 160 227 220 160 227 219 152 227 219 152 227 218 146 227 218 146
103049 +227 218 146 226 217 137 226 217 137 224 212 126 224 212 126 149 122 79
103050 +80 59 18 57 50 16 57 50 16 47 39 13 37 31 10 37 31 10
103051 +27 23 7 23 19 6 15 13 4 9 7 3 5 4 1 1 1 1
103052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103105 +3 3 1 5 4 1 7 5 2 10 9 3 13 11 4 15 13 4
103106 +18 15 5 18 15 5 18 15 5 18 15 5 18 15 5 18 15 5
103107 +18 15 5 18 15 5 16 14 4 15 13 4 14 11 4 13 11 4
103108 +13 11 4 11 9 3 10 9 3 10 9 3 9 7 3 9 7 3
103109 +9 7 3 9 7 3 9 7 3 9 7 3 9 7 3 11 9 3
103110 +13 11 4 14 11 4 17 13 4 17 13 4 30 16 4 17 13 4
103111 +30 16 4 30 16 4 30 16 4 30 16 4 30 16 4 38 21 5
103112 +38 21 5 38 21 5 48 30 8 48 30 8 48 30 8 56 33 8
103113 +49 31 9 57 34 10 57 34 10 57 34 10 57 34 10 62 38 11
103114 +62 38 11 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
103115 +75 50 15 75 50 15 75 50 15 90 63 20 90 63 20 90 63 20
103116 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
103117 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
103118 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 90 63 20
103119 +104 73 28 90 63 20 104 73 28 104 73 28 104 73 28 104 73 28
103120 +143 92 37 104 73 28 143 92 37 90 63 20 154 97 33 143 92 37
103121 +143 92 37 143 92 37 131 88 37 143 92 37 154 97 33 154 108 49
103122 +163 154 123 216 206 146 229 225 190 230 227 199 231 228 207 231 228 207
103123 +231 228 207 230 227 204 230 227 202 230 227 202 230 227 201 230 227 199
103124 +230 227 197 229 226 196 230 227 199 229 225 190 230 227 197 229 225 190
103125 +229 225 190 229 225 190 229 224 185 229 225 190 229 224 185 229 224 185
103126 +229 224 185 228 223 179 228 223 179 228 223 179 228 223 179 227 221 169
103127 +227 221 169 227 221 169 227 221 169 227 220 160 227 220 160 227 220 160
103128 +227 220 160 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
103129 +227 217 139 226 217 137 226 217 137 226 217 137 224 212 126 156 118 66
103130 +90 65 21 57 50 16 57 50 16 47 39 13 47 39 13 31 27 8
103131 +31 27 8 20 17 5 15 13 4 10 9 3 5 4 1 1 1 1
103132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2
103185 +5 4 1 9 7 3 11 9 3 15 13 4 18 15 5 20 17 5
103186 +23 19 6 24 21 6 25 20 6 27 23 7 24 21 6 25 20 6
103187 +25 20 6 24 21 6 23 19 6 22 17 5 20 17 5 18 15 5
103188 +18 15 5 18 15 5 16 14 4 15 13 4 15 13 4 15 13 4
103189 +15 13 4 15 13 4 14 11 4 14 11 4 15 13 4 17 13 4
103190 +18 15 5 22 17 5 23 17 5 23 17 5 30 16 4 30 16 4
103191 +30 16 4 30 16 4 38 21 5 38 27 8 38 27 8 38 27 8
103192 +41 32 10 49 31 9 49 31 9 49 31 9 57 34 10 57 34 10
103193 +58 38 12 62 38 11 62 38 11 68 47 15 62 38 11 68 47 15
103194 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
103195 +75 50 15 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
103196 +90 63 20 90 63 20 104 73 28 104 73 28 104 73 28 104 73 28
103197 +90 63 20 143 92 37 90 63 20 143 92 37 90 63 20 143 92 37
103198 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
103199 +104 73 28 104 73 28 90 63 20 104 73 28 104 73 28 104 73 28
103200 +104 73 28 104 73 28 90 63 20 154 97 33 104 73 28 131 88 37
103201 +131 88 37 131 88 37 154 97 33 154 97 33 229 226 192 231 228 207
103202 +230 227 201 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
103203 +230 227 205 230 227 204 230 227 202 230 227 202 230 227 201 230 227 199
103204 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 229 225 190
103205 +229 225 190 229 225 190 229 224 185 229 224 185 229 224 185 229 224 185
103206 +228 223 179 228 223 179 228 223 179 228 223 179 228 223 179 227 221 169
103207 +228 223 179 227 221 169 227 221 169 227 221 169 227 220 160 227 217 139
103208 +176 168 138 227 220 160 227 219 152 227 219 152 227 218 146 227 218 146
103209 +227 218 146 226 217 137 226 217 137 226 217 137 224 212 126 156 118 66
103210 +57 50 16 57 50 16 57 50 16 47 39 13 37 31 10 37 31 10
103211 +27 23 7 23 19 6 15 13 4 9 7 3 5 4 1 1 1 1
103212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103264 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 5 4 1
103265 +7 5 2 11 9 3 15 13 4 18 15 5 23 19 6 25 20 6
103266 +29 24 7 31 27 8 31 27 8 31 27 8 35 26 8 31 27 8
103267 +31 27 8 31 27 8 29 24 7 27 23 7 27 23 7 25 20 6
103268 +25 20 6 24 21 6 23 19 6 23 19 6 23 19 6 23 19 6
103269 +22 17 5 22 17 5 22 17 5 23 19 6 23 19 6 25 20 6
103270 +25 20 6 28 21 6 29 24 7 35 25 8 35 25 8 35 26 8
103271 +38 29 9 41 32 10 41 32 10 48 30 8 49 31 9 50 37 12
103272 +49 31 9 50 37 12 58 38 12 58 38 12 60 42 13 60 42 13
103273 +60 42 13 68 47 15 68 47 15 68 47 15 75 50 15 75 50 15
103274 +75 50 15 75 50 15 78 55 17 90 63 20 90 63 20 90 63 20
103275 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
103276 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 143 92 37
103277 +104 73 28 104 73 28 143 92 37 90 63 20 143 92 37 90 63 20
103278 +104 73 28 143 92 37 90 63 20 104 73 28 104 73 28 104 73 28
103279 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 143 92 37
103280 +104 73 28 154 97 33 104 73 28 154 97 33 104 73 28 154 97 33
103281 +154 97 33 143 92 37 131 88 37 154 97 33 229 225 190 231 229 212
103282 +231 229 212 231 229 212 231 228 207 231 228 207 231 228 207 231 228 207
103283 +231 228 207 230 227 204 230 227 202 230 227 202 230 227 201 230 227 199
103284 +230 227 197 230 227 197 229 225 190 230 227 197 229 225 190 229 225 190
103285 +229 225 190 229 224 185 229 225 190 229 224 185 229 224 185 229 224 185
103286 +229 224 185 228 223 179 228 223 179 228 223 179 227 221 169 228 223 179
103287 +227 221 169 227 221 169 227 220 160 227 221 169 224 212 126 143 100 47
103288 +156 118 66 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
103289 +227 217 139 226 217 137 226 217 137 224 212 126 224 212 126 163 154 123
103290 +80 59 18 57 50 16 57 50 16 47 39 13 47 39 13 31 27 8
103291 +31 27 8 23 19 6 15 13 4 10 9 3 5 4 1 1 1 1
103292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103344 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 1 7 5 2
103345 +11 9 3 15 13 4 18 15 5 24 21 6 27 23 7 31 27 8
103346 +37 31 10 37 31 10 41 32 10 37 31 10 37 31 10 37 31 10
103347 +37 31 10 37 31 10 37 31 10 37 31 10 37 31 10 31 27 8
103348 +31 27 8 31 27 8 29 24 7 29 24 7 29 24 7 27 23 7
103349 +27 23 7 27 23 7 27 23 7 29 24 7 31 27 8 31 27 8
103350 +35 26 8 35 26 8 38 29 9 38 29 9 41 32 10 43 33 10
103351 +43 33 10 46 36 11 50 37 12 50 37 12 51 40 13 58 38 12
103352 +60 42 13 60 42 13 60 42 13 67 48 15 68 47 15 69 49 15
103353 +71 51 16 75 50 15 75 50 15 75 50 15 78 55 17 78 55 17
103354 +78 55 17 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
103355 +104 73 28 90 63 20 90 63 20 104 73 28 104 73 28 104 73 28
103356 +104 73 28 104 73 28 104 73 28 104 73 28 143 92 37 90 63 20
103357 +143 92 37 104 73 28 143 92 37 90 63 20 143 92 37 104 73 28
103358 +143 92 37 90 63 20 143 92 37 104 73 28 143 92 37 104 73 28
103359 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 90 63 20
103360 +143 92 37 90 63 20 143 92 37 104 73 28 154 97 33 104 73 28
103361 +154 97 33 131 88 37 154 97 33 154 97 33 200 196 176 231 229 212
103362 +231 228 207 231 229 212 231 228 207 231 228 207 231 228 207 231 228 207
103363 +231 228 207 230 227 204 230 227 202 230 227 202 230 227 201 230 227 199
103364 +230 227 197 230 227 197 230 227 197 230 227 197 229 225 190 230 227 197
103365 +229 225 190 229 225 190 229 224 185 229 224 185 229 224 185 229 224 185
103366 +228 223 179 228 223 179 228 223 179 228 223 179 227 221 169 228 223 179
103367 +227 221 169 227 221 169 227 218 146 163 154 123 117 83 35 154 97 33
103368 +163 154 123 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
103369 +227 217 139 226 217 137 226 217 137 224 212 126 224 212 126 156 118 66
103370 +57 50 16 57 50 16 57 50 16 47 39 13 37 31 10 37 31 10
103371 +27 23 7 23 19 6 15 13 4 9 7 3 5 4 1 1 1 1
103372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103424 +0 0 0 0 0 0 0 0 0 2 2 2 5 4 1 9 7 3
103425 +14 11 4 18 15 5 24 21 6 29 24 7 31 27 8 37 31 10
103426 +37 31 10 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
103427 +47 39 13 44 35 11 44 35 11 37 31 10 41 32 10 37 31 10
103428 +37 31 10 37 31 10 37 31 10 37 31 10 37 31 10 37 31 10
103429 +37 31 10 37 31 10 37 31 10 37 31 10 37 31 10 41 32 10
103430 +41 32 10 44 35 11 46 36 11 46 36 11 50 37 12 50 37 12
103431 +51 40 13 57 41 13 55 43 14 60 42 13 59 45 14 59 45 14
103432 +67 48 15 67 48 15 69 49 15 71 51 16 71 53 16 78 55 17
103433 +78 55 17 79 57 18 80 59 18 90 63 20 90 63 20 90 63 20
103434 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
103435 +90 63 20 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
103436 +143 92 37 104 73 28 154 97 33 104 73 28 104 73 28 143 92 37
103437 +104 73 28 143 92 37 104 73 28 154 97 33 104 73 28 143 92 37
103438 +90 63 20 154 97 33 90 63 20 104 73 28 104 73 28 104 73 28
103439 +143 92 37 90 63 20 143 92 37 90 63 20 143 92 37 104 73 28
103440 +104 73 28 154 97 33 104 73 28 154 97 33 143 92 37 154 97 33
103441 +143 92 37 154 97 33 131 88 37 154 97 33 185 178 149 230 227 202
103442 +231 229 212 231 229 212 231 228 207 231 228 207 231 228 207 231 228 207
103443 +230 227 204 230 227 204 230 227 202 230 227 201 230 227 201 230 227 199
103444 +230 227 197 230 227 197 230 227 197 229 225 190 230 227 197 229 224 185
103445 +229 225 190 229 224 185 229 224 185 229 224 185 229 224 185 229 224 185
103446 +228 223 179 228 223 179 228 223 179 228 223 179 227 221 169 227 221 169
103447 +227 221 169 224 212 126 154 97 33 143 92 37 131 88 37 131 88 37
103448 +156 118 66 227 219 152 227 219 152 227 219 152 227 218 146 227 218 146
103449 +227 218 146 226 217 137 226 217 137 224 212 126 224 212 126 156 118 66
103450 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 31 27 8
103451 +31 27 8 20 17 5 15 13 4 10 9 3 5 4 1 1 1 1
103452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103504 +0 0 0 0 0 0 1 1 1 3 3 1 7 5 2 13 11 4
103505 +18 15 5 23 19 6 27 23 7 31 27 8 37 31 10 44 35 11
103506 +47 39 13 47 39 13 47 39 13 56 48 15 47 39 13 56 48 15
103507 +47 39 13 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
103508 +47 39 13 47 39 13 44 35 11 41 32 10 44 35 11 41 32 10
103509 +44 35 11 37 31 10 41 32 10 44 35 11 44 35 11 47 39 13
103510 +47 39 13 47 39 13 55 43 14 51 40 13 55 43 14 58 46 15
103511 +58 46 15 59 45 14 59 49 15 67 48 15 67 48 15 71 51 16
103512 +71 53 16 71 53 16 71 53 16 79 57 18 79 57 18 80 59 18
103513 +80 59 18 80 59 18 90 63 20 90 63 20 90 63 20 90 63 20
103514 +90 63 20 104 73 28 90 63 20 104 73 28 104 73 28 104 73 28
103515 +104 73 28 104 73 28 104 73 28 131 88 37 104 73 28 143 92 37
103516 +104 73 28 104 73 28 104 73 28 104 73 28 154 97 33 104 73 28
103517 +143 92 37 104 73 28 154 97 33 104 73 28 154 97 33 104 73 28
103518 +154 97 33 90 63 20 154 97 33 104 73 28 154 97 33 104 73 28
103519 +104 73 28 104 73 28 104 73 28 104 73 28 90 63 20 143 92 37
103520 +104 73 28 143 92 37 104 73 28 154 97 33 104 73 28 143 92 37
103521 +131 88 37 154 97 33 154 97 33 154 97 33 163 154 123 231 228 207
103522 +231 229 212 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
103523 +230 227 205 230 227 204 230 227 202 230 227 201 230 227 201 230 227 199
103524 +230 227 197 230 227 197 230 227 197 230 227 197 229 225 190 230 227 197
103525 +229 225 190 229 224 185 229 225 190 229 224 185 229 224 185 229 224 185
103526 +228 223 179 229 224 185 227 221 169 228 223 179 228 223 179 224 214 136
103527 +156 118 66 131 88 37 131 88 37 131 88 37 131 88 37 131 88 37
103528 +224 212 126 227 219 152 227 219 152 227 218 146 227 218 146 227 218 146
103529 +226 217 137 226 217 137 226 217 137 224 212 126 224 212 126 156 118 66
103530 +57 50 16 57 50 16 57 50 16 47 39 13 37 31 10 37 31 10
103531 +27 23 7 23 19 6 15 13 4 9 7 3 5 4 1 1 1 1
103532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103584 +0 0 0 0 0 0 1 1 1 5 4 1 9 7 3 15 13 4
103585 +20 17 5 25 20 6 31 27 8 37 31 10 44 35 11 47 39 13
103586 +56 48 15 57 50 17 57 50 17 57 50 17 56 48 15 57 50 17
103587 +57 50 17 56 48 15 56 48 15 47 39 13 56 48 15 47 39 13
103588 +47 39 13 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
103589 +47 39 13 47 39 13 47 39 13 56 48 15 47 39 13 56 48 15
103590 +55 44 14 58 46 15 56 48 15 59 49 15 59 49 15 67 48 15
103591 +59 49 15 71 53 16 71 53 16 71 53 16 71 53 16 78 55 17
103592 +78 55 17 80 59 18 80 59 18 80 59 18 80 59 18 90 65 21
103593 +90 63 20 90 65 21 90 65 21 90 65 21 90 65 21 97 69 27
103594 +104 73 28 90 63 20 104 73 28 104 73 28 104 73 28 104 73 28
103595 +104 73 28 104 73 28 131 88 37 104 73 28 104 73 28 104 73 28
103596 +143 92 37 131 88 37 143 92 37 104 73 28 143 92 37 143 92 37
103597 +154 97 33 156 118 66 176 168 138 156 118 66 154 97 33 104 73 28
103598 +154 97 33 104 73 28 143 92 37 104 73 28 104 73 28 104 73 28
103599 +154 97 33 104 73 28 104 73 28 143 92 37 104 73 28 104 73 28
103600 +143 92 37 104 73 28 154 97 33 104 73 28 154 97 33 154 97 33
103601 +154 97 33 154 97 33 154 97 33 154 97 33 156 118 66 231 228 207
103602 +231 229 212 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
103603 +230 227 202 230 227 202 230 227 202 230 227 201 230 227 199 230 227 197
103604 +230 227 197 230 227 197 229 225 190 230 227 197 229 225 190 229 225 190
103605 +229 225 190 229 224 185 229 224 185 229 224 185 229 224 185 229 224 185
103606 +228 223 179 228 223 179 228 223 179 227 218 149 156 118 66 154 97 33
103607 +143 92 37 154 97 33 131 88 37 154 97 33 131 88 37 131 88 37
103608 +224 212 126 224 214 136 227 219 152 227 219 152 227 218 146 227 218 146
103609 +227 217 139 226 217 137 226 217 137 224 212 126 224 212 126 154 108 49
103610 +57 50 16 57 50 16 47 39 13 47 39 13 37 31 10 37 31 10
103611 +27 23 7 20 17 5 15 13 4 8 7 4 5 4 1 1 1 1
103612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103664 +0 0 0 0 0 0 3 3 1 7 5 2 13 11 4 18 15 5
103665 +23 19 6 29 24 7 37 31 10 37 31 10 47 39 13 47 39 13
103666 +56 48 15 56 48 15 57 50 17 57 50 17 57 50 17 57 50 17
103667 +56 48 15 57 50 17 57 50 17 57 50 17 56 48 15 57 50 17
103668 +57 50 17 57 50 17 56 48 15 57 50 17 56 48 15 56 48 15
103669 +56 48 15 56 48 15 57 50 17 56 48 15 57 50 17 57 50 17
103670 +57 50 17 59 49 15 59 49 15 67 48 15 71 53 16 71 53 16
103671 +71 53 16 71 53 16 71 53 16 79 57 18 80 59 18 80 59 18
103672 +80 59 18 80 59 18 90 65 21 90 65 21 90 65 21 90 65 21
103673 +90 65 21 97 69 27 90 65 21 97 69 27 97 69 27 104 73 28
103674 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
103675 +104 73 28 131 88 37 104 73 28 104 73 28 143 92 37 154 108 49
103676 +156 118 66 156 118 66 176 168 138 192 187 164 229 225 190 231 229 217
103677 +238 238 238 238 238 238 231 229 217 176 168 138 143 92 37 154 97 33
103678 +104 73 28 154 97 33 104 73 28 154 97 33 104 73 28 154 97 33
103679 +104 73 28 90 63 20 143 92 37 104 73 28 104 73 28 143 92 37
103680 +104 73 28 154 97 33 104 73 28 143 92 37 143 92 37 143 92 37
103681 +131 88 37 154 97 33 154 97 33 154 97 33 156 118 66 231 229 212
103682 +231 229 212 231 228 207 231 228 207 231 228 207 231 228 207 230 227 205
103683 +230 227 204 230 227 202 230 227 202 230 227 201 230 227 199 230 227 197
103684 +230 227 197 230 227 197 230 227 197 230 227 197 229 225 190 229 225 190
103685 +229 225 190 229 225 190 229 224 185 229 224 185 229 224 185 228 223 179
103686 +229 224 185 227 218 153 156 118 66 154 97 33 154 97 33 143 92 37
103687 +154 97 33 131 88 37 154 97 33 131 88 37 131 88 37 131 88 37
103688 +216 206 146 227 219 152 227 219 152 227 218 146 227 218 146 227 218 146
103689 +226 217 137 226 217 137 224 212 126 224 212 126 224 212 126 110 81 38
103690 +57 50 16 57 50 16 57 50 16 57 50 17 37 31 10 37 31 10
103691 +27 23 7 20 17 5 15 13 4 9 7 3 4 3 1 1 1 1
103692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103744 +0 0 0 1 1 1 4 3 1 9 7 3 13 11 4 18 15 5
103745 +25 20 6 31 27 8 37 31 10 47 39 13 47 39 13 57 50 17
103746 +57 50 17 57 50 17 57 50 17 150 141 118 142 111 68 60 51 33
103747 +57 50 16 57 50 17 57 50 17 57 50 17 57 50 17 56 48 15
103748 +56 48 15 56 48 15 56 48 15 56 48 15 57 50 17 56 48 15
103749 +56 48 15 57 50 17 56 48 15 57 50 17 59 49 15 67 48 15
103750 +71 53 16 71 53 16 71 53 16 71 53 16 71 53 16 80 59 18
103751 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
103752 +90 65 21 90 65 21 90 65 21 90 65 21 91 66 24 91 66 24
103753 +97 69 27 90 65 21 104 73 28 97 69 27 104 73 28 90 65 21
103754 +104 73 28 104 73 28 104 73 28 143 92 37 154 108 49 149 122 79
103755 +163 154 123 176 168 138 216 206 146 229 225 190 230 228 210 231 229 217
103756 +238 238 238 238 238 238 231 230 220 231 230 220 231 230 220 231 230 220
103757 +231 230 220 231 230 220 231 230 220 200 196 176 143 92 37 104 73 28
103758 +154 97 33 104 73 28 154 97 33 104 73 28 143 92 37 90 63 20
103759 +154 97 33 104 73 28 104 73 28 143 92 37 104 73 28 104 73 28
103760 +154 97 33 104 73 28 154 97 33 104 73 28 154 97 33 154 97 33
103761 +143 92 37 154 97 33 154 97 33 154 97 33 154 97 33 230 227 197
103762 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 230 227 205
103763 +230 227 204 230 227 202 230 227 201 230 227 201 230 227 199 230 227 197
103764 +230 227 197 230 227 197 229 225 190 229 225 190 230 227 197 229 225 190
103765 +229 224 185 229 224 185 229 224 185 229 224 185 229 224 185 216 206 146
103766 +156 118 66 154 97 33 154 97 33 154 97 33 154 97 33 131 88 37
103767 +154 97 33 131 88 37 131 88 37 154 97 33 131 88 37 154 97 33
103768 +226 217 137 227 219 152 227 219 152 227 218 149 227 218 146 227 217 139
103769 +227 217 139 226 217 137 226 217 137 224 212 126 224 212 126 90 65 21
103770 +57 50 16 57 50 16 47 39 13 37 31 10 47 39 13 31 27 8
103771 +27 23 7 20 17 5 15 13 4 8 7 4 3 3 1 1 1 1
103772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103824 +0 0 0 2 2 2 5 4 1 10 9 3 16 14 4 23 19 6
103825 +27 23 7 37 31 10 37 31 10 47 39 13 47 39 13 56 48 15
103826 +57 50 17 57 50 17 90 68 33 226 218 148 227 219 152 227 219 152
103827 +176 168 138 138 129 110 135 101 60 75 62 40 57 50 17 57 50 17
103828 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
103829 +57 50 17 57 50 17 57 50 17 57 50 17 71 53 16 57 50 17
103830 +71 53 16 57 50 17 71 53 16 80 59 18 71 53 16 70 58 37
103831 +80 59 18 80 59 18 80 59 18 80 59 18 91 66 24 80 59 18
103832 +90 65 21 90 65 21 90 65 21 90 65 21 91 66 24 90 65 21
103833 +135 101 60 135 98 56 150 141 118 149 122 79 176 168 138 176 168 138
103834 +200 196 176 227 222 178 231 228 207 231 229 212 231 229 217 231 229 217
103835 +231 229 214 231 229 217 231 230 220 231 229 217 231 230 220 231 230 220
103836 +231 230 220 231 230 220 231 230 220 231 230 220 231 230 220 238 238 238
103837 +231 230 220 231 230 220 231 230 220 230 227 205 143 92 37 154 97 33
103838 +143 92 37 143 92 37 154 97 33 104 73 28 154 97 33 104 73 28
103839 +143 92 37 104 73 28 143 92 37 104 73 28 104 73 28 143 92 37
103840 +104 73 28 154 97 33 104 73 28 154 97 33 143 92 37 131 88 37
103841 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 227 222 178
103842 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 230 227 204
103843 +230 227 202 230 227 202 230 227 201 230 227 201 230 227 197 230 227 197
103844 +230 227 197 229 225 190 230 227 197 230 227 197 229 225 190 229 225 190
103845 +229 225 190 229 224 185 229 224 185 216 206 146 156 118 66 154 97 33
103846 +154 97 33 154 97 33 154 97 33 143 92 37 154 97 33 154 97 33
103847 +131 88 37 154 97 33 154 97 33 131 88 37 154 97 33 156 118 66
103848 +227 219 152 227 219 152 227 219 152 227 218 146 227 218 146 227 218 146
103849 +226 217 137 226 217 137 224 212 126 224 212 126 224 212 126 57 50 16
103850 +57 50 16 57 50 16 57 50 16 47 39 13 37 31 10 31 27 8
103851 +27 23 7 18 15 5 13 11 4 7 5 2 4 3 1 0 0 0
103852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103904 +1 1 1 3 3 1 7 5 2 13 11 4 18 15 5 24 21 6
103905 +31 27 8 37 31 10 47 39 13 47 39 13 57 50 17 57 50 17
103906 +57 50 17 57 50 17 149 122 79 227 219 152 227 220 160 227 219 152
103907 +227 220 160 227 219 152 227 220 160 227 221 169 227 221 169 185 178 149
103908 +176 168 138 163 154 123 150 141 118 142 111 68 138 129 110 142 111 68
103909 +100 76 42 100 76 42 100 76 42 114 84 45 100 76 42 114 84 45
103910 +114 84 45 114 84 45 114 84 45 114 84 45 114 84 45 138 129 110
103911 +149 122 79 138 129 110 138 129 110 150 141 118 176 168 138 163 154 123
103912 +176 168 138 200 196 176 200 196 176 229 225 190 230 228 209 230 228 209
103913 +230 228 209 230 228 209 231 228 207 231 229 212 231 229 212 231 229 212
103914 +231 228 207 231 229 214 231 229 217 231 229 217 231 229 217 231 229 217
103915 +231 230 220 231 229 217 231 230 220 231 230 220 231 230 220 231 230 220
103916 +231 230 220 231 230 220 231 230 220 231 230 220 231 230 220 231 230 220
103917 +231 230 220 238 238 238 231 230 220 231 230 220 154 108 49 131 88 37
103918 +104 73 28 154 97 33 104 73 28 154 97 33 104 73 28 143 92 37
103919 +104 73 28 143 92 37 104 73 28 143 92 37 104 73 28 154 97 33
103920 +104 73 28 154 97 33 143 92 37 143 92 37 143 92 37 154 97 33
103921 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 216 206 146
103922 +230 227 205 231 228 207 231 228 207 231 228 207 230 227 204 230 227 204
103923 +230 227 202 230 227 202 230 227 201 230 227 199 230 227 197 230 227 197
103924 +230 227 197 230 227 197 229 225 190 229 225 190 229 225 190 229 225 190
103925 +228 223 179 176 168 138 154 108 49 154 97 33 154 97 33 154 97 33
103926 +154 97 33 154 97 33 154 97 33 154 97 33 131 88 37 154 97 33
103927 +154 97 33 131 88 37 154 97 33 131 88 37 154 97 33 156 118 66
103928 +227 219 152 227 219 152 227 219 152 227 218 146 227 218 146 227 217 139
103929 +226 217 137 226 217 137 224 212 126 224 212 126 224 212 126 57 50 16
103930 +57 50 16 57 50 16 47 39 13 47 39 13 37 31 10 31 27 8
103931 +24 21 6 18 15 5 13 11 4 7 5 2 3 3 1 0 0 0
103932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
103984 +1 1 1 4 3 1 9 7 3 14 11 4 18 15 5 25 20 6
103985 +31 27 8 37 31 10 47 39 13 47 39 13 56 48 15 57 50 17
103986 +57 50 16 57 50 16 163 154 123 227 219 152 227 220 160 227 219 152
103987 +227 220 160 227 221 169 227 220 160 227 221 169 227 221 169 227 220 160
103988 +227 221 169 227 221 169 227 221 169 227 222 178 227 222 178 227 222 178
103989 +229 226 192 229 226 192 229 226 192 229 226 196 229 226 196 230 227 199
103990 +230 227 201 230 227 202 230 227 202 230 228 209 229 226 196 229 226 192
103991 +229 226 196 229 226 192 229 226 192 229 226 192 230 227 197 231 228 207
103992 +230 227 202 230 227 202 230 227 204 230 227 205 231 228 207 230 228 209
103993 +230 228 209 231 229 212 231 229 212 231 229 212 231 229 212 231 229 214
103994 +231 229 214 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
103995 +231 229 217 231 230 220 231 229 217 231 230 220 231 230 220 231 230 220
103996 +231 230 220 231 230 220 231 230 220 238 238 238 231 230 220 231 230 220
103997 +231 230 220 231 230 220 231 230 220 238 238 238 149 122 79 143 92 37
103998 +154 97 33 143 92 37 154 97 33 104 73 28 154 97 33 104 73 28
103999 +154 97 33 104 73 28 143 92 37 104 73 28 143 92 37 104 73 28
104000 +143 92 37 104 73 28 154 97 33 104 73 28 143 92 37 143 92 37
104001 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 176 168 138
104002 +230 228 209 231 228 207 231 228 207 230 227 205 230 227 204 230 227 202
104003 +230 227 202 230 227 201 230 227 201 230 227 199 230 227 197 230 227 197
104004 +230 227 197 230 227 197 229 225 190 230 227 197 227 218 153 156 118 66
104005 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104006 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 131 88 37
104007 +154 97 33 154 97 33 131 88 37 154 97 33 131 88 37 224 212 126
104008 +227 219 152 227 219 152 227 218 149 227 218 146 227 218 146 227 217 139
104009 +226 217 137 226 217 137 224 212 126 224 212 126 163 154 123 57 50 16
104010 +57 50 16 57 50 16 47 39 13 47 39 13 37 31 10 31 27 8
104011 +24 21 6 18 15 5 13 11 4 7 5 2 3 3 1 0 0 0
104012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104064 +2 2 2 5 4 1 9 7 3 15 13 4 22 17 5 27 23 7
104065 +37 31 10 37 31 10 47 39 13 56 48 15 57 50 17 57 50 17
104066 +57 50 17 57 50 16 163 154 123 227 218 146 227 219 152 227 220 160
104067 +227 220 160 227 220 160 227 220 160 227 221 169 227 221 169 227 221 169
104068 +227 221 169 228 223 179 227 221 169 227 222 178 227 222 178 227 222 178
104069 +229 224 185 229 224 185 229 226 192 229 224 185 229 226 192 229 226 192
104070 +229 226 192 229 226 192 229 226 192 229 226 196 229 226 196 229 226 196
104071 +229 226 196 230 227 199 230 227 201 230 227 201 230 227 202 230 227 202
104072 +230 227 204 230 227 205 231 228 207 231 228 207 231 228 207 230 228 209
104073 +231 228 207 231 229 212 231 229 212 231 229 212 231 229 214 231 229 214
104074 +231 229 214 231 229 214 231 229 217 231 229 217 231 229 217 231 229 217
104075 +231 229 217 231 229 217 231 230 220 231 230 220 231 230 220 231 230 220
104076 +231 230 220 231 230 220 231 230 220 231 229 217 231 230 220 231 230 220
104077 +231 230 220 231 230 220 231 230 220 231 230 220 185 178 149 154 97 33
104078 +131 88 37 143 92 37 104 73 28 154 97 33 143 92 37 143 92 37
104079 +104 73 28 154 97 33 104 73 28 143 92 37 104 73 28 154 97 33
104080 +104 73 28 154 97 33 143 92 37 154 97 33 154 97 33 154 97 33
104081 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 163 154 123
104082 +230 227 197 231 228 207 231 228 207 230 227 204 230 227 204 230 227 202
104083 +230 227 202 230 227 201 230 227 199 230 227 197 230 227 197 230 227 197
104084 +230 227 197 227 222 178 176 168 138 154 108 49 154 97 33 154 108 49
104085 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104086 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104087 +154 97 33 131 88 37 154 97 33 154 97 33 131 88 37 224 212 126
104088 +226 218 148 227 219 152 226 218 148 227 218 146 227 218 146 227 217 139
104089 +226 217 137 226 217 137 224 212 126 224 212 126 156 118 66 80 59 18
104090 +57 50 16 57 50 16 47 39 13 47 39 13 37 31 10 31 27 8
104091 +24 21 6 18 15 5 10 9 3 6 5 1 3 3 1 0 0 0
104092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104144 +3 3 1 5 4 1 10 9 3 15 13 4 23 19 6 29 24 7
104145 +31 27 8 47 39 13 47 39 13 47 39 13 56 48 15 57 50 16
104146 +57 50 16 57 50 16 163 154 123 227 219 152 227 219 152 227 219 152
104147 +227 220 160 227 220 160 227 221 169 227 220 160 227 221 169 227 221 169
104148 +227 221 169 227 221 169 228 223 179 227 222 178 228 223 179 228 223 179
104149 +228 223 179 229 224 185 228 223 179 229 224 185 229 224 185 229 224 185
104150 +229 226 192 229 226 192 229 226 192 229 226 192 229 226 196 230 227 197
104151 +230 227 197 230 227 197 230 227 199 230 227 201 230 227 202 230 227 202
104152 +230 227 204 230 227 205 231 228 207 231 228 207 231 228 207 231 228 207
104153 +230 228 209 231 228 207 231 229 212 231 229 212 231 229 212 231 229 214
104154 +231 229 214 231 229 214 231 229 214 231 229 217 231 229 217 231 229 217
104155 +231 229 217 231 229 217 231 229 217 231 229 217 231 230 220 231 230 220
104156 +231 230 220 231 230 220 231 230 220 231 230 220 231 230 220 231 230 220
104157 +231 230 220 231 230 220 231 230 220 231 229 217 200 196 176 143 92 37
104158 +143 92 37 154 97 33 154 97 33 104 73 28 154 97 33 104 73 28
104159 +154 97 33 104 73 28 154 97 33 104 73 28 154 97 33 104 73 28
104160 +154 97 33 104 73 28 154 97 33 104 73 28 143 92 37 154 97 33
104161 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 156 118 66
104162 +230 227 201 231 228 207 231 228 207 230 227 204 230 227 204 230 227 202
104163 +230 227 201 230 227 201 230 227 201 229 226 196 229 224 185 224 212 126
104164 +156 118 66 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104165 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104166 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104167 +154 97 33 154 97 33 131 88 37 154 97 33 154 97 33 227 219 152
104168 +227 219 152 227 219 152 227 218 146 227 218 146 227 218 146 226 217 137
104169 +226 217 137 224 212 126 224 212 126 224 212 126 156 118 66 57 50 16
104170 +57 50 16 57 50 16 47 39 13 47 39 13 31 27 8 31 27 8
104171 +24 21 6 16 14 4 10 9 3 5 4 1 2 2 2 0 0 0
104172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104224 +3 3 1 7 5 2 11 9 3 16 14 4 23 19 6 29 24 7
104225 +37 31 10 44 35 11 47 39 13 57 50 17 57 50 17 57 50 17
104226 +75 61 38 57 50 16 135 101 60 226 217 137 227 219 152 227 220 160
104227 +227 219 152 227 220 160 227 220 160 227 221 169 227 221 169 227 221 169
104228 +227 221 169 228 223 179 227 221 169 228 223 179 228 223 179 228 223 179
104229 +228 223 179 229 224 185 229 224 185 229 224 185 229 226 192 229 224 185
104230 +229 226 192 229 226 192 229 226 192 229 226 192 229 226 196 230 227 197
104231 +230 227 197 230 227 197 230 227 199 230 227 201 230 227 201 230 227 202
104232 +230 227 202 230 227 204 230 227 205 231 228 207 231 228 207 231 228 207
104233 +231 228 207 230 228 209 230 228 210 231 229 212 231 229 212 231 229 212
104234 +231 229 214 231 229 214 231 229 214 231 229 214 231 229 217 231 229 217
104235 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 230 220
104236 +231 229 217 231 230 220 231 230 220 231 230 220 231 230 220 231 230 220
104237 +231 230 220 231 230 220 231 230 220 231 230 220 231 229 217 154 97 33
104238 +143 92 37 143 92 37 143 92 37 154 97 33 143 92 37 143 92 37
104239 +143 92 37 104 73 28 154 97 33 104 73 28 154 97 33 104 73 28
104240 +154 97 33 154 97 33 143 92 37 154 97 33 154 97 33 143 92 37
104241 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 156 118 66
104242 +230 227 197 231 228 207 231 228 207 230 227 202 230 227 202 230 227 202
104243 +230 227 201 229 224 185 185 178 149 156 118 66 154 108 49 154 97 33
104244 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104245 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104246 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 131 88 37
104247 +154 97 33 154 97 33 154 97 33 154 97 33 156 118 66 227 219 152
104248 +227 219 152 227 219 152 227 218 146 227 218 146 227 217 139 226 217 137
104249 +226 217 137 224 212 126 224 212 126 224 212 126 117 83 35 57 50 16
104250 +57 50 16 57 50 16 47 39 13 37 31 10 37 31 10 31 27 8
104251 +20 17 5 15 13 4 10 9 3 5 4 1 1 1 1 0 0 0
104252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104304 +3 3 1 7 5 2 11 9 3 18 15 5 24 21 6 31 27 8
104305 +33 28 19 47 39 13 47 39 13 57 50 17 57 50 17 57 50 16
104306 +80 59 18 75 61 38 57 50 17 224 214 136 227 219 152 227 219 152
104307 +227 220 160 227 220 160 227 220 160 227 220 160 227 221 169 227 221 169
104308 +227 221 169 227 221 169 227 221 169 228 223 179 228 223 179 228 223 179
104309 +228 223 179 228 223 179 228 223 179 229 226 192 228 223 179 229 226 192
104310 +229 224 185 229 226 192 229 226 192 229 226 192 229 226 192 230 227 197
104311 +230 227 197 230 227 197 230 227 197 230 227 199 230 227 201 230 227 201
104312 +230 227 202 230 227 204 230 227 205 230 227 205 231 228 207 231 228 207
104313 +231 228 207 231 228 207 230 228 209 230 228 210 231 229 212 231 229 212
104314 +231 229 212 231 229 214 231 229 214 231 229 214 231 229 214 231 229 217
104315 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
104316 +231 230 220 231 229 217 231 230 220 231 230 220 231 230 220 231 230 220
104317 +231 230 220 231 230 220 231 230 220 231 229 217 231 229 217 154 108 49
104318 +143 92 37 143 92 37 154 97 33 104 73 28 154 97 33 104 73 28
104319 +143 92 37 143 92 37 143 92 37 154 97 33 104 73 28 143 92 37
104320 +154 97 33 104 73 28 154 97 33 104 73 28 154 97 33 154 97 33
104321 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104322 +230 227 199 231 228 207 230 227 202 230 227 204 229 224 185 216 206 146
104323 +156 118 66 154 97 33 154 97 33 154 108 49 154 97 33 154 97 33
104324 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104325 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104326 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104327 +154 97 33 154 97 33 154 97 33 131 88 37 224 212 126 227 219 152
104328 +227 219 152 227 219 152 227 218 146 227 218 146 227 217 139 226 217 137
104329 +226 217 137 224 212 126 224 212 126 224 212 126 57 50 16 57 50 16
104330 +57 50 16 57 50 16 47 39 13 47 39 13 31 27 8 24 21 6
104331 +20 17 5 15 13 4 10 9 3 5 4 1 1 1 1 0 0 0
104332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104384 +3 3 1 7 5 2 11 9 3 18 15 5 23 19 6 31 27 8
104385 +37 31 10 44 35 11 47 39 13 57 50 17 57 50 17 57 50 17
104386 +57 50 16 114 84 45 57 50 16 114 84 45 227 220 160 227 219 152
104387 +227 220 160 227 220 160 227 220 160 227 221 169 227 220 160 227 221 169
104388 +227 221 169 227 221 169 228 223 179 227 221 169 228 223 179 228 223 179
104389 +228 223 179 228 223 179 229 224 185 229 224 185 229 224 185 229 226 192
104390 +229 224 185 229 226 192 229 226 192 229 226 192 229 226 192 230 227 197
104391 +230 227 197 230 227 197 230 227 197 230 227 199 230 227 201 230 227 201
104392 +230 227 202 230 227 202 230 227 204 230 227 205 230 227 205 231 228 207
104393 +231 228 207 231 228 207 230 228 209 231 228 207 230 228 210 231 229 212
104394 +231 229 212 231 229 212 231 229 214 231 229 214 231 229 214 231 229 214
104395 +231 229 214 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
104396 +231 229 217 231 229 217 231 229 217 231 229 217 231 230 220 231 229 217
104397 +231 230 220 231 230 220 231 230 220 231 230 220 231 230 220 176 168 138
104398 +154 97 33 154 97 33 143 92 37 154 97 33 154 97 33 143 92 37
104399 +143 92 37 104 73 28 154 97 33 104 73 28 154 97 33 104 73 28
104400 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104401 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 108 49
104402 +227 221 169 227 221 169 176 168 138 156 118 66 154 97 33 154 97 33
104403 +154 108 49 154 108 49 154 97 33 154 97 33 154 97 33 154 108 49
104404 +154 97 33 154 108 49 154 97 33 154 97 33 154 97 33 154 97 33
104405 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104406 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104407 +154 97 33 154 97 33 154 97 33 154 97 33 224 212 126 226 218 148
104408 +227 219 152 226 218 148 227 218 146 227 218 146 227 217 139 226 217 137
104409 +226 217 137 224 212 126 224 212 126 224 212 126 57 50 16 57 50 16
104410 +57 50 16 47 39 13 37 31 10 37 31 10 31 27 8 27 23 7
104411 +20 17 5 13 11 4 8 7 4 3 3 1 1 1 1 0 0 0
104412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104464 +3 3 1 7 5 2 11 9 3 15 13 4 24 21 6 27 23 7
104465 +37 31 10 47 39 13 47 39 13 56 48 15 57 50 16 57 50 17
104466 +57 50 17 135 101 60 57 50 17 57 50 17 149 122 79 227 219 152
104467 +227 219 152 227 220 160 227 220 160 227 220 160 227 221 169 227 221 169
104468 +227 221 169 227 221 169 228 223 179 227 221 169 228 223 179 228 223 179
104469 +228 223 179 228 223 179 228 223 179 229 224 185 229 224 185 229 224 185
104470 +229 224 185 229 225 190 229 226 192 229 226 192 229 226 192 229 226 192
104471 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 199 230 227 201
104472 +230 227 201 230 227 202 230 227 202 230 227 204 230 227 205 230 227 205
104473 +231 228 207 231 228 207 230 228 209 231 228 207 231 229 212 231 229 212
104474 +231 229 212 231 229 212 231 229 212 231 229 214 231 229 214 231 229 214
104475 +231 229 214 231 229 214 231 229 217 231 229 217 231 229 217 231 229 217
104476 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
104477 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 185 178 149
104478 +143 92 37 143 92 37 154 97 33 154 97 33 104 73 28 143 92 37
104479 +143 92 37 143 92 37 143 92 37 143 92 37 143 92 37 143 92 37
104480 +154 97 33 104 73 28 143 92 37 143 92 37 154 97 33 154 97 33
104481 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104482 +154 108 49 154 97 33 154 97 33 154 97 33 154 108 49 154 97 33
104483 +154 97 33 154 97 33 154 97 33 154 108 49 154 97 33 154 97 33
104484 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104485 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104486 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104487 +154 97 33 154 97 33 154 97 33 156 118 66 227 219 152 227 219 152
104488 +227 219 152 227 218 146 227 218 146 227 218 146 226 217 137 226 217 137
104489 +224 212 126 224 212 126 224 212 126 156 118 66 57 50 16 57 50 16
104490 +57 50 16 57 50 16 47 39 13 37 31 10 31 27 8 24 21 6
104491 +16 14 4 13 11 4 7 5 2 3 3 1 0 0 0 0 0 0
104492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104544 +2 2 2 5 4 1 10 9 3 16 14 4 23 19 6 29 24 7
104545 +31 27 8 44 35 11 47 39 13 57 50 17 57 50 16 57 50 17
104546 +57 50 17 135 101 60 58 54 45 57 50 16 57 50 16 142 111 68
104547 +226 218 148 227 220 160 227 220 160 227 220 160 227 220 160 227 221 169
104548 +227 221 169 227 221 169 227 221 169 228 223 179 227 221 169 228 223 179
104549 +228 223 179 228 223 179 229 224 185 228 223 179 229 224 185 229 226 192
104550 +229 224 185 229 226 192 229 225 190 229 226 192 229 226 192 229 226 192
104551 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 199
104552 +230 227 201 230 227 202 230 227 202 230 227 204 230 227 205 230 227 205
104553 +230 227 205 231 228 207 231 228 207 231 228 207 231 228 207 231 229 212
104554 +231 228 207 231 229 212 231 229 212 231 229 212 231 229 214 231 229 214
104555 +231 229 214 231 229 214 231 229 217 231 229 217 231 229 217 231 229 217
104556 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
104557 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 230 227 204
104558 +154 97 33 154 97 33 143 92 37 154 97 33 154 97 33 154 97 33
104559 +104 73 28 154 97 33 143 92 37 104 73 28 154 97 33 104 73 28
104560 +154 97 33 154 97 33 154 97 33 143 92 37 154 97 33 154 97 33
104561 +154 97 33 154 97 33 154 97 33 154 97 33 154 108 49 154 97 33
104562 +154 97 33 154 108 49 154 97 33 154 108 49 154 97 33 154 108 49
104563 +154 97 33 154 108 49 154 97 33 154 97 33 154 97 33 154 97 33
104564 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104565 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104566 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104567 +154 97 33 154 97 33 154 97 33 163 154 123 226 217 137 227 219 152
104568 +227 219 152 227 218 146 227 218 146 227 217 139 226 217 137 226 217 137
104569 +224 212 126 224 212 126 224 212 126 154 108 49 57 50 16 57 50 16
104570 +57 50 16 37 31 10 47 39 13 37 31 10 31 27 8 24 21 6
104571 +16 14 4 10 9 3 6 5 1 3 3 1 0 0 0 0 0 0
104572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104624 +1 1 1 5 4 1 9 7 3 15 13 4 20 17 5 27 23 7
104625 +37 31 10 37 31 10 47 39 13 47 39 13 57 50 16 57 50 16
104626 +57 50 16 68 60 43 142 111 68 57 50 16 57 50 16 57 50 16
104627 +90 68 33 185 178 149 227 220 160 227 220 160 227 221 169 227 220 160
104628 +227 221 169 227 221 169 227 221 169 227 221 169 228 223 179 228 223 179
104629 +228 223 179 228 223 179 229 224 185 228 223 179 229 224 185 229 224 185
104630 +229 224 185 229 224 185 229 224 185 229 226 192 229 226 192 229 226 192
104631 +229 226 192 229 226 196 230 227 197 230 227 197 230 227 197 230 227 199
104632 +230 227 201 230 227 201 230 227 202 230 227 202 230 227 204 230 227 205
104633 +230 227 205 230 227 205 231 228 207 231 228 207 231 228 207 231 228 207
104634 +231 229 212 231 229 212 231 229 212 231 229 212 231 229 212 231 229 212
104635 +231 229 214 231 229 214 231 229 214 231 229 214 231 229 217 231 229 217
104636 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
104637 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
104638 +154 97 33 143 92 37 154 97 33 143 92 37 143 92 37 154 97 33
104639 +154 97 33 143 92 37 143 92 37 154 97 33 143 92 37 154 97 33
104640 +143 92 37 143 92 37 143 92 37 154 97 33 154 97 33 154 97 33
104641 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 108 49
104642 +154 97 33 154 108 49 154 97 33 154 97 33 154 97 33 154 97 33
104643 +154 97 33 154 97 33 154 97 33 154 97 33 154 108 49 154 97 33
104644 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104645 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104646 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104647 +154 97 33 154 97 33 154 97 33 226 217 137 227 219 152 227 219 152
104648 +227 218 146 227 218 146 227 218 146 227 217 139 226 217 137 226 217 137
104649 +224 212 126 224 212 126 224 212 126 80 59 18 57 50 16 57 50 16
104650 +57 50 16 57 50 16 37 31 10 37 31 10 27 23 7 24 21 6
104651 +15 13 4 10 9 3 5 4 1 1 1 1 0 0 0 0 0 0
104652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104704 +1 1 1 4 3 1 9 7 3 14 11 4 20 17 5 27 23 7
104705 +37 31 10 37 31 10 47 39 13 57 50 17 57 50 16 57 50 17
104706 +57 50 16 57 50 16 150 141 118 57 50 16 57 50 16 57 50 16
104707 +57 50 16 57 50 16 135 101 60 216 206 146 227 219 152 227 221 169
104708 +227 220 160 227 221 169 227 221 169 227 221 169 228 223 179 227 221 169
104709 +228 223 179 228 223 179 228 223 179 228 223 179 229 224 185 229 224 185
104710 +229 224 185 229 226 192 229 224 185 229 226 192 229 226 192 229 226 192
104711 +229 226 192 230 227 197 229 226 192 230 227 197 230 227 197 230 227 197
104712 +230 227 199 230 227 201 230 227 201 230 227 202 230 227 202 230 227 204
104713 +230 227 205 230 227 205 230 227 205 231 228 207 231 228 207 231 228 207
104714 +231 228 207 231 228 207 231 229 212 231 229 212 231 229 212 231 229 212
104715 +231 229 212 231 229 214 231 229 214 231 229 214 231 229 214 231 229 214
104716 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
104717 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 217 231 229 217
104718 +163 154 123 154 97 33 154 97 33 154 97 33 154 97 33 143 92 37
104719 +143 92 37 143 92 37 143 92 37 143 92 37 104 73 28 154 97 33
104720 +104 73 28 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104721 +154 97 33 154 97 33 154 97 33 154 97 33 154 108 49 154 108 49
104722 +154 108 49 154 108 49 154 108 49 154 108 49 154 108 49 154 108 49
104723 +154 108 49 154 108 49 154 108 49 154 97 33 154 108 49 154 97 33
104724 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104725 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104726 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104727 +154 97 33 154 97 33 156 118 66 226 217 137 227 219 152 227 219 152
104728 +227 218 146 227 218 146 227 218 146 226 217 137 226 217 137 224 212 126
104729 +224 212 126 224 212 126 224 212 126 57 50 16 57 50 16 57 50 16
104730 +47 39 13 37 31 10 47 39 13 31 27 8 27 23 7 20 17 5
104731 +15 13 4 10 9 3 5 4 1 1 1 1 0 0 0 0 0 0
104732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104784 +0 0 0 3 3 1 7 5 2 13 11 4 18 15 5 24 21 6
104785 +31 27 8 37 31 10 37 31 10 47 39 13 57 50 16 57 50 16
104786 +57 50 16 57 50 16 149 122 79 75 62 40 57 50 16 57 50 16
104787 +57 50 16 57 50 16 56 48 15 57 50 16 114 84 45 163 154 123
104788 +227 220 160 227 221 169 227 221 169 227 221 169 228 223 179 227 221 169
104789 +228 223 179 228 223 179 228 223 179 229 224 185 228 223 179 229 224 185
104790 +229 224 185 229 224 185 229 225 190 229 224 185 229 226 192 229 226 192
104791 +229 226 192 229 226 192 230 227 197 230 227 197 230 227 197 230 227 197
104792 +230 227 197 230 227 199 230 227 201 230 227 201 230 227 202 230 227 202
104793 +230 227 204 230 227 205 230 227 205 230 227 205 231 228 207 231 228 207
104794 +231 228 207 231 229 212 231 228 207 231 228 207 231 228 207 231 229 212
104795 +231 229 212 231 229 212 231 229 212 231 229 214 230 228 210 231 229 214
104796 +230 228 210 231 229 214 230 228 210 231 229 217 231 229 217 231 229 217
104797 +231 229 217 231 229 217 231 229 217 231 229 217 231 229 214 231 228 207
104798 +176 168 138 154 97 33 154 97 33 154 97 33 143 92 37 154 97 33
104799 +143 92 37 154 97 33 143 92 37 154 97 33 154 97 33 154 97 33
104800 +154 97 33 154 97 33 143 92 37 154 97 33 154 97 33 154 97 33
104801 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 108 49
104802 +154 108 49 154 97 33 154 108 49 154 108 49 154 97 33 154 108 49
104803 +154 97 33 154 97 33 154 108 49 154 97 33 154 97 33 154 97 33
104804 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104805 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104806 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104807 +154 97 33 154 97 33 224 212 126 227 219 152 227 219 152 227 219 152
104808 +227 218 146 227 218 146 227 217 139 226 217 137 226 217 137 224 212 126
104809 +224 212 126 224 212 126 156 118 66 57 50 16 57 50 16 57 50 16
104810 +57 50 16 47 39 13 37 31 10 31 27 8 24 21 6 20 17 5
104811 +13 11 4 6 5 1 5 4 1 0 0 0 0 0 0 0 0 0
104812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104864 +0 0 0 3 3 1 7 5 2 11 9 3 18 15 5 24 21 6
104865 +31 27 8 37 31 10 47 39 13 47 39 13 57 50 17 57 50 16
104866 +57 50 16 57 50 16 135 101 60 149 122 79 57 50 16 57 50 16
104867 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
104868 +80 59 18 135 101 60 163 154 123 227 219 152 227 221 169 228 223 179
104869 +227 221 169 228 223 179 228 223 179 228 223 179 228 223 179 229 224 185
104870 +229 224 185 229 224 185 229 224 185 229 225 190 229 225 190 229 226 192
104871 +229 226 192 229 226 192 230 227 197 229 226 192 230 227 197 230 227 197
104872 +230 227 197 230 227 199 230 227 199 230 227 201 230 227 201 230 227 202
104873 +230 227 202 230 227 204 230 227 205 230 227 205 230 227 205 231 228 207
104874 +231 228 207 231 228 207 231 228 207 231 229 212 231 228 207 231 228 207
104875 +231 229 212 231 229 212 231 228 207 231 229 214 230 228 210 231 229 214
104876 +231 229 214 231 229 214 230 228 210 231 229 217 230 228 210 231 229 214
104877 +230 228 210 231 229 214 231 229 214 231 229 214 231 229 214 231 229 214
104878 +229 224 185 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104879 +143 92 37 143 92 37 143 92 37 143 92 37 143 92 37 143 92 37
104880 +143 92 37 143 92 37 154 97 33 154 97 33 154 97 33 154 97 33
104881 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 108 49
104882 +154 97 33 154 108 49 154 97 33 154 108 49 154 108 49 154 97 33
104883 +154 108 49 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104884 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104885 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104886 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104887 +154 97 33 154 108 49 226 217 137 227 218 146 227 219 152 227 218 146
104888 +227 218 146 227 218 146 227 217 139 226 217 137 226 217 137 224 212 126
104889 +224 212 126 224 212 126 117 83 35 57 50 16 57 50 16 57 50 16
104890 +37 31 10 47 39 13 31 27 8 31 27 8 24 21 6 16 14 4
104891 +13 11 4 6 5 1 3 3 1 0 0 0 0 0 0 0 0 0
104892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104944 +0 0 0 2 2 2 5 4 1 10 9 3 15 13 4 20 17 5
104945 +31 27 8 37 31 10 37 31 10 47 39 13 47 39 13 57 50 16
104946 +57 50 16 57 50 16 57 50 16 224 212 126 57 50 17 57 50 16
104947 +57 50 16 57 50 16 57 50 16 57 50 17 57 50 17 57 50 17
104948 +57 50 17 57 50 17 57 50 16 57 50 17 90 68 33 149 122 79
104949 +163 154 123 216 206 146 228 223 179 228 223 179 229 224 185 228 223 179
104950 +229 224 185 229 224 185 229 225 190 229 224 185 229 224 185 229 225 190
104951 +229 226 192 229 226 192 229 226 192 229 226 196 229 226 196 230 227 197
104952 +230 227 197 230 227 197 230 227 199 230 227 199 230 227 201 230 227 201
104953 +230 227 202 230 227 202 230 227 204 230 227 205 230 227 205 231 228 207
104954 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
104955 +231 229 212 231 228 207 231 229 212 231 229 212 230 228 210 230 228 210
104956 +230 228 210 231 229 214 231 228 207 231 229 217 231 228 207 231 229 217
104957 +230 228 210 231 229 217 231 228 207 231 229 214 231 228 207 231 229 214
104958 +230 227 205 154 97 33 154 97 33 154 97 33 154 97 33 143 92 37
104959 +154 97 33 154 97 33 154 97 33 143 92 37 154 97 33 143 92 37
104960 +154 97 33 143 92 37 154 97 33 154 97 33 154 97 33 154 97 33
104961 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104962 +154 97 33 154 108 49 154 97 33 154 97 33 154 108 49 154 97 33
104963 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104964 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104965 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104966 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
104967 +154 97 33 224 212 126 227 219 152 227 219 152 227 219 152 227 218 146
104968 +227 218 146 227 217 139 226 217 137 226 217 137 224 212 126 224 212 126
104969 +224 212 126 224 212 126 57 50 16 57 50 16 57 50 16 57 50 16
104970 +47 39 13 47 39 13 31 27 8 31 27 8 24 21 6 16 14 4
104971 +10 9 3 5 4 1 2 2 2 0 0 0 0 0 0 0 0 0
104972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
104999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105024 +0 0 0 1 1 1 4 3 1 9 7 3 14 11 4 20 17 5
105025 +27 23 7 31 27 8 37 31 10 47 39 13 57 50 17 57 50 16
105026 +57 50 17 57 50 16 57 50 16 163 154 123 135 101 60 57 50 16
105027 +57 50 16 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
105028 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 16
105029 +57 50 16 71 53 16 71 53 16 100 76 42 142 111 68 138 129 110
105030 +163 154 123 185 178 149 216 206 146 224 217 160 229 226 192 229 225 190
105031 +229 225 190 229 226 192 229 226 192 229 226 192 229 226 196 229 226 196
105032 +230 227 197 230 227 197 230 227 197 230 227 199 230 227 201 230 227 201
105033 +230 227 201 230 227 202 230 227 202 230 227 204 230 227 205 230 227 205
105034 +231 228 207 231 228 207 231 228 207 231 228 207 229 225 190 200 196 176
105035 +200 196 176 229 224 185 230 228 210 231 228 207 230 228 210 231 229 214
105036 +231 228 207 230 228 210 230 228 210 230 228 210 230 228 210 230 228 210
105037 +231 229 214 231 228 207 231 229 214 231 229 214 231 229 214 231 228 207
105038 +231 229 214 163 154 123 154 97 33 154 97 33 154 97 33 154 97 33
105039 +154 97 33 143 92 37 154 97 33 143 92 37 154 97 33 143 92 37
105040 +143 92 37 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105041 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105042 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105043 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105044 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105045 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105046 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105047 +154 97 33 224 212 126 226 217 137 227 219 152 227 218 146 227 218 146
105048 +227 218 146 227 217 139 226 217 137 226 217 137 224 212 126 224 212 126
105049 +224 212 126 156 118 66 57 50 16 57 50 16 57 50 16 57 50 16
105050 +37 31 10 37 31 10 31 27 8 27 23 7 20 17 5 15 13 4
105051 +7 7 7 3 3 1 1 1 1 0 0 0 0 0 0 0 0 0
105052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105104 +0 0 0 0 0 0 3 3 1 8 7 4 13 11 4 18 15 5
105105 +24 21 6 31 27 8 37 31 10 37 31 10 47 39 13 57 50 16
105106 +57 50 16 57 50 16 57 50 16 110 81 38 176 168 138 57 50 16
105107 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
105108 +57 50 17 57 50 17 57 50 17 71 53 16 57 50 17 71 53 16
105109 +71 53 16 57 50 17 80 59 18 57 50 17 80 59 18 71 53 16
105110 +80 59 18 80 59 18 71 53 16 80 59 18 80 59 18 90 68 33
105111 +135 101 60 114 84 45 135 101 60 142 111 68 149 122 79 138 129 110
105112 +149 122 79 149 122 79 138 129 110 149 122 79 150 141 118 149 122 79
105113 +150 141 118 149 122 79 150 141 118 149 122 79 135 101 60 143 106 60
105114 +143 106 60 144 102 51 117 83 35 117 83 35 117 83 35 117 83 35
105115 +143 92 37 150 141 118 231 228 207 230 228 210 231 228 207 231 228 207
105116 +230 228 210 230 228 210 230 228 210 231 228 207 231 229 214 230 228 210
105117 +231 228 207 231 229 214 231 228 207 231 228 207 231 229 214 231 228 207
105118 +230 227 197 176 168 138 154 97 33 154 97 33 154 97 33 154 97 33
105119 +154 97 33 154 97 33 154 97 33 154 97 33 143 92 37 154 97 33
105120 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105121 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105122 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105123 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105124 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105125 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105126 +154 97 33 154 97 33 154 97 33 154 97 33 154 108 49 154 97 33
105127 +163 154 123 227 218 146 227 219 152 227 219 152 227 218 146 227 218 146
105128 +227 218 146 226 217 137 226 217 137 224 212 126 224 212 126 224 212 126
105129 +224 212 126 117 83 35 57 50 16 57 50 16 57 50 16 47 39 13
105130 +47 39 13 37 31 10 31 27 8 24 21 6 16 14 4 10 9 3
105131 +8 7 4 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0
105132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105184 +0 0 0 0 0 0 2 2 2 5 4 1 11 9 3 16 14 4
105185 +24 21 6 31 27 8 37 31 10 47 39 13 47 39 13 47 39 13
105186 +57 50 17 57 50 16 57 50 16 57 50 16 224 212 126 114 84 45
105187 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
105188 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 71 53 16
105189 +57 50 17 80 59 18 57 50 17 80 59 18 80 59 18 71 53 16
105190 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 80 59 18
105191 +80 59 18 91 66 24 90 65 21 90 65 21 91 66 24 104 73 28
105192 +97 69 27 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
105193 +104 73 28 117 83 35 104 73 28 104 73 28 117 83 35 104 73 28
105194 +117 83 35 117 83 35 104 73 28 117 83 35 117 83 35 131 88 37
105195 +104 73 28 154 97 33 231 228 207 231 228 207 231 228 207 230 228 210
105196 +231 228 207 231 228 207 230 228 210 230 228 210 231 228 207 230 228 210
105197 +231 228 207 231 229 214 231 228 207 231 229 214 231 228 207 231 228 207
105198 +231 228 207 229 224 185 154 97 33 154 97 33 154 97 33 154 97 33
105199 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105200 +143 92 37 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105201 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105202 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105203 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105204 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105205 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105206 +154 97 33 154 97 33 154 97 33 154 108 49 154 108 49 154 97 33
105207 +224 212 126 226 217 137 227 219 152 227 218 146 227 218 146 227 218 146
105208 +227 217 139 226 217 137 226 217 137 226 217 137 224 212 126 224 212 126
105209 +224 212 126 57 50 16 57 50 16 57 50 16 57 50 16 47 39 13
105210 +37 31 10 37 31 10 31 27 8 24 21 6 16 14 4 10 9 3
105211 +6 5 1 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0
105212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105264 +0 0 0 0 0 0 1 1 1 5 4 1 9 8 6 15 13 4
105265 +20 17 5 24 21 6 33 28 19 37 31 10 37 31 10 57 50 16
105266 +57 50 16 57 50 17 57 50 16 57 50 16 149 122 79 176 168 138
105267 +57 50 17 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
105268 +57 50 17 57 50 17 57 50 16 57 50 17 71 53 16 57 50 17
105269 +57 50 17 71 53 16 57 50 17 80 59 18 57 50 17 71 53 16
105270 +80 59 18 80 59 18 80 59 18 90 65 21 80 59 18 90 65 21
105271 +90 65 21 90 65 21 90 65 21 91 66 24 91 66 24 90 65 21
105272 +97 69 27 90 65 21 104 73 28 104 73 28 104 73 28 104 73 28
105273 +104 73 28 104 73 28 104 73 28 104 73 28 117 83 35 104 73 28
105274 +117 83 35 104 73 28 117 83 35 117 83 35 131 88 37 117 83 35
105275 +131 88 37 131 88 37 200 196 176 231 228 207 231 228 207 231 228 207
105276 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 231 229 214
105277 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
105278 +231 228 207 231 228 207 154 97 33 154 97 33 154 97 33 154 97 33
105279 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105280 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105281 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105282 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105283 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105284 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105285 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105286 +154 97 33 154 97 33 154 108 49 154 97 33 154 97 33 224 212 126
105287 +227 218 146 227 218 146 227 219 152 227 218 146 227 218 146 227 218 146
105288 +226 217 137 226 217 137 224 212 126 224 212 126 224 212 126 224 212 126
105289 +154 108 49 57 50 16 57 50 16 57 50 16 57 50 16 47 39 13
105290 +37 31 10 31 27 8 24 21 6 20 17 5 16 14 4 10 9 3
105291 +5 4 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
105292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105344 +0 0 0 0 0 0 1 1 1 4 3 1 7 5 2 13 11 4
105345 +18 15 5 24 21 6 31 27 8 37 31 10 47 39 13 47 39 13
105346 +57 50 16 57 50 16 57 50 17 57 50 16 71 64 51 226 217 137
105347 +114 84 45 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
105348 +57 50 17 57 50 16 57 50 16 57 50 16 57 50 17 57 50 17
105349 +71 53 16 57 50 17 57 50 17 71 53 16 80 59 18 57 50 17
105350 +80 59 18 57 50 17 80 59 18 80 59 18 80 59 18 80 59 18
105351 +80 59 18 90 65 21 90 65 21 90 65 21 90 65 21 97 69 27
105352 +90 65 21 104 73 28 90 65 21 90 65 21 104 73 28 104 73 28
105353 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 117 83 35
105354 +104 73 28 131 88 37 117 83 35 117 83 35 117 83 35 131 88 37
105355 +117 83 35 131 88 37 163 154 123 230 227 201 231 228 207 231 228 207
105356 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
105357 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
105358 +231 228 207 231 228 207 163 154 123 154 97 33 154 97 33 154 97 33
105359 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105360 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105361 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105362 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105363 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105364 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105365 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105366 +154 97 33 154 97 33 154 108 49 154 108 49 154 97 33 224 212 126
105367 +226 217 137 227 218 146 227 218 146 227 218 146 227 218 146 227 217 139
105368 +226 217 137 226 217 137 226 217 137 224 212 126 224 212 126 224 212 126
105369 +80 59 18 57 50 16 57 50 16 57 50 16 37 31 10 47 39 13
105370 +37 31 10 31 27 8 31 27 8 16 14 4 10 10 10 6 5 1
105371 +3 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
105372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105424 +0 0 0 0 0 0 0 0 0 3 3 1 6 5 1 10 9 3
105425 +16 14 4 24 21 6 31 27 8 31 27 8 47 39 13 35 34 31
105426 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 163 154 123
105427 +224 212 126 57 50 17 57 50 17 57 50 17 57 50 17 57 50 17
105428 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
105429 +57 50 17 57 50 16 57 50 16 57 50 16 57 50 16 71 53 16
105430 +57 50 17 80 59 18 71 53 16 80 59 18 80 59 18 80 59 18
105431 +80 59 18 80 59 18 80 59 18 90 65 21 90 65 21 90 65 21
105432 +90 65 21 90 65 21 90 65 21 104 73 28 90 65 21 104 73 28
105433 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 117 83 35
105434 +104 73 28 117 83 35 104 73 28 117 83 35 117 83 35 131 88 37
105435 +117 83 35 143 92 37 156 118 66 231 228 207 231 228 207 231 228 207
105436 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
105437 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
105438 +231 228 207 230 227 199 224 212 126 154 97 33 154 97 33 154 97 33
105439 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105440 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105441 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105442 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105443 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105444 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105445 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105446 +154 108 49 154 108 49 154 97 33 154 97 33 224 212 126 227 217 139
105447 +227 218 146 227 219 152 227 218 146 227 218 146 227 218 146 227 217 139
105448 +226 217 137 224 212 126 224 212 126 224 212 126 224 212 126 156 118 66
105449 +57 50 16 57 50 16 57 50 16 57 50 16 47 39 13 47 39 13
105450 +31 27 8 31 27 8 24 21 6 16 14 4 10 9 3 6 5 1
105451 +2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105504 +0 0 0 0 0 0 0 0 0 1 1 1 5 4 1 10 9 3
105505 +15 13 4 20 17 5 27 23 7 31 27 8 37 31 10 47 39 13
105506 +47 39 13 57 50 16 57 50 16 57 50 16 57 50 16 114 84 45
105507 +226 217 137 142 111 68 57 50 16 57 50 17 57 50 17 57 50 16
105508 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
105509 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
105510 +57 50 16 71 53 16 57 50 16 71 53 16 71 53 16 80 59 18
105511 +80 59 18 80 59 18 80 59 18 80 59 18 90 65 21 90 65 21
105512 +90 65 21 90 65 21 90 65 21 90 65 21 90 65 21 90 65 21
105513 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
105514 +104 73 28 117 83 35 117 83 35 131 88 37 117 83 35 131 88 37
105515 +117 83 35 131 88 37 131 88 37 227 222 178 230 227 204 230 227 205
105516 +230 227 205 230 227 205 231 228 207 230 227 205 231 228 207 230 227 205
105517 +231 228 207 231 228 207 231 228 207 231 228 207 231 228 207 231 228 207
105518 +231 228 207 230 227 205 227 222 178 154 97 33 154 97 33 154 97 33
105519 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105520 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105521 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105522 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105523 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105524 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105525 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105526 +154 108 49 154 108 49 154 108 49 154 97 33 224 212 126 227 217 139
105527 +227 219 152 227 218 146 227 218 146 227 218 146 227 217 139 226 217 137
105528 +226 217 137 226 217 137 224 212 126 224 212 126 224 212 126 117 83 35
105529 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 31 27 8
105530 +31 27 8 24 21 6 16 14 4 16 14 4 10 9 3 3 3 1
105531 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105584 +0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 6 5 1
105585 +13 11 4 20 17 5 24 21 6 31 27 8 37 31 10 37 31 10
105586 +47 39 13 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
105587 +176 168 138 224 212 126 63 54 38 57 50 17 57 50 17 57 50 16
105588 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 56 48 15
105589 +56 48 15 55 44 14 56 48 15 51 40 13 56 48 15 57 50 16
105590 +57 50 16 57 50 16 59 49 15 57 50 16 71 53 16 57 50 16
105591 +71 53 16 71 53 16 80 59 18 80 59 18 80 59 18 80 59 18
105592 +80 59 18 90 63 20 90 63 20 90 63 20 90 65 21 90 63 20
105593 +90 63 20 90 63 20 90 63 20 104 73 28 104 73 28 104 73 28
105594 +104 73 28 104 73 28 117 83 35 104 73 28 117 83 35 117 83 35
105595 +131 88 37 131 88 37 131 88 37 185 178 149 230 227 204 230 227 204
105596 +230 227 204 230 227 205 230 227 205 230 227 205 230 227 205 230 227 205
105597 +230 227 205 230 227 205 230 227 205 230 227 205 230 227 205 230 227 205
105598 +230 227 205 230 227 205 230 227 202 154 108 49 154 97 33 154 97 33
105599 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105600 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105601 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105602 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105603 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105604 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105605 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 108 49
105606 +154 108 49 154 108 49 154 97 33 224 212 126 227 218 146 227 219 152
105607 +227 218 146 227 218 146 227 218 146 227 218 146 227 217 139 226 217 137
105608 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 57 50 16
105609 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 37 31 10
105610 +31 27 8 24 21 6 16 14 4 10 9 3 8 7 4 3 3 1
105611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105664 +0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 5 4 1
105665 +10 9 3 15 13 4 24 21 6 27 23 7 37 31 10 37 31 10
105666 +47 39 13 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
105667 +142 111 68 226 217 137 150 141 118 57 50 16 57 50 16 57 50 16
105668 +57 50 16 57 50 16 56 48 15 56 48 15 56 48 15 51 40 13
105669 +51 40 13 51 40 13 51 40 13 47 39 13 46 36 11 50 37 12
105670 +51 40 13 55 43 14 59 45 14 59 49 15 59 45 14 67 48 15
105671 +59 49 15 71 53 16 67 48 15 71 53 16 71 53 16 78 55 17
105672 +78 55 17 78 55 17 80 59 18 90 63 20 90 63 20 90 63 20
105673 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
105674 +104 73 28 104 73 28 131 88 37 104 73 28 131 88 37 131 88 37
105675 +117 83 35 131 88 37 131 88 37 156 118 66 230 227 197 230 227 202
105676 +230 227 202 230 227 202 230 227 204 230 227 204 230 227 204 230 227 204
105677 +230 227 204 230 227 204 230 227 204 230 227 204 230 227 204 230 227 204
105678 +230 227 204 230 227 204 231 228 207 224 212 126 154 97 33 154 97 33
105679 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105680 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105681 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105682 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105683 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105684 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105685 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 108 49
105686 +154 108 49 154 108 49 224 212 126 224 212 126 226 217 137 227 218 146
105687 +227 218 146 227 218 146 227 218 146 227 217 139 226 217 137 226 217 137
105688 +224 212 126 224 212 126 224 212 126 224 212 126 117 83 35 57 50 16
105689 +57 50 16 57 50 16 57 50 16 37 31 10 37 31 10 31 27 8
105690 +31 27 8 24 21 6 16 14 4 10 9 3 5 5 5 3 3 1
105691 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105744 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 1
105745 +8 7 4 13 11 4 20 17 5 24 21 6 31 27 8 37 31 10
105746 +47 39 13 37 31 10 57 50 16 57 50 16 57 50 16 57 50 16
105747 +47 39 13 224 212 126 226 217 137 100 76 42 57 50 16 57 50 16
105748 +57 50 16 56 48 15 56 48 15 56 48 15 55 44 14 55 44 14
105749 +51 40 13 51 40 13 50 37 12 46 36 11 46 36 11 43 33 10
105750 +46 36 11 49 31 9 50 37 12 57 34 10 58 38 12 60 42 13
105751 +60 42 13 60 42 13 68 47 15 68 47 15 68 47 15 75 50 15
105752 +75 50 15 75 50 15 75 50 15 75 50 15 78 55 17 75 50 15
105753 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
105754 +104 73 28 104 73 28 104 73 28 104 73 28 117 83 35 104 73 28
105755 +131 88 37 117 83 35 131 88 37 143 92 37 229 225 190 230 227 202
105756 +230 227 202 230 227 202 230 227 202 230 227 202 230 227 202 230 227 202
105757 +230 227 202 230 227 202 230 227 202 230 227 202 230 227 202 230 227 202
105758 +230 227 202 230 227 205 229 224 185 216 206 146 154 97 33 154 97 33
105759 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105760 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105761 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105762 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105763 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105764 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105765 +154 97 33 154 97 33 154 97 33 154 108 49 154 108 49 154 108 49
105766 +154 97 33 154 97 33 224 212 126 227 217 139 227 218 146 227 218 146
105767 +227 218 146 227 218 146 227 217 139 226 217 137 226 217 137 224 212 126
105768 +224 212 126 224 212 126 224 212 126 224 212 126 57 50 16 57 50 16
105769 +57 50 16 57 50 16 47 39 13 47 39 13 37 31 10 31 27 8
105770 +24 21 6 16 14 4 10 9 3 10 9 3 3 3 1 1 1 1
105771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 1
105825 +6 5 1 10 9 3 16 14 4 24 21 6 31 27 8 31 27 8
105826 +47 39 13 35 34 31 57 50 16 57 50 16 57 50 16 57 50 16
105827 +57 50 16 100 76 42 226 217 137 224 212 126 57 50 17 57 50 17
105828 +57 50 16 56 48 15 56 48 15 47 39 13 56 48 15 47 39 13
105829 +51 40 13 47 39 13 46 36 11 44 35 11 43 33 10 41 32 10
105830 +38 27 8 38 27 8 48 30 8 49 31 9 49 31 9 50 37 12
105831 +57 34 10 58 38 12 62 38 11 62 38 11 62 38 11 62 38 11
105832 +68 47 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
105833 +75 50 15 75 50 15 90 63 20 90 63 20 90 63 20 90 63 20
105834 +90 63 20 104 73 28 104 73 28 131 88 37 104 73 28 143 92 37
105835 +117 83 35 131 88 37 131 88 37 131 88 37 176 168 138 230 227 197
105836 +230 227 201 230 227 201 230 227 201 230 227 201 230 227 201 230 227 201
105837 +230 227 202 230 227 202 230 227 202 230 227 202 230 227 202 230 227 201
105838 +230 227 201 230 227 201 230 227 202 229 225 190 154 97 33 154 97 33
105839 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105840 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105841 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105842 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105843 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105844 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105845 +154 97 33 154 97 33 154 97 33 154 108 49 224 212 126 154 97 33
105846 +154 108 49 224 212 126 224 212 126 227 217 139 227 218 146 227 218 146
105847 +227 218 146 227 218 146 227 217 139 227 217 139 226 217 137 226 217 137
105848 +224 212 126 224 212 126 224 212 126 104 73 28 57 50 16 57 50 16
105849 +57 50 16 57 50 16 37 31 10 37 31 10 37 31 10 31 27 8
105850 +24 21 6 16 14 4 10 9 3 8 7 4 3 3 1 1 1 1
105851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
105905 +5 4 1 10 9 3 16 14 4 20 17 5 24 21 6 31 27 8
105906 +37 31 10 37 31 10 47 39 13 57 50 16 57 50 16 57 50 16
105907 +57 50 16 57 50 16 176 168 138 226 217 137 138 129 110 57 50 17
105908 +57 50 16 56 48 15 56 48 15 56 48 15 56 48 15 51 40 13
105909 +51 40 13 46 36 11 44 35 11 41 32 10 41 32 10 38 27 8
105910 +48 30 8 38 27 8 38 27 8 38 27 8 48 30 8 49 31 9
105911 +49 31 9 56 33 8 57 34 10 56 33 8 62 38 11 62 38 11
105912 +62 38 11 62 38 11 62 38 11 75 50 15 75 50 15 75 50 15
105913 +75 50 15 75 50 15 75 50 15 75 50 15 90 63 20 90 63 20
105914 +90 63 20 104 73 28 104 73 28 104 73 28 117 83 35 104 73 28
105915 +117 83 35 131 88 37 131 88 37 154 97 33 156 118 66 230 227 197
105916 +230 227 199 230 227 201 230 227 201 230 227 201 230 227 201 230 227 201
105917 +230 227 201 230 227 201 230 227 201 230 227 201 230 227 201 230 227 201
105918 +230 227 201 230 227 201 230 227 201 230 227 199 156 118 66 154 97 33
105919 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105920 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105921 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105922 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105923 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105924 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
105925 +154 97 33 154 108 49 154 108 49 154 97 33 154 97 33 154 97 33
105926 +154 108 49 224 212 126 227 217 139 227 218 146 227 218 146 227 218 146
105927 +227 218 146 227 217 139 227 217 139 226 217 137 224 212 126 224 212 126
105928 +224 212 126 224 212 126 224 212 126 57 50 16 57 50 16 57 50 16
105929 +57 50 16 47 39 13 47 39 13 37 31 10 31 27 8 24 21 6
105930 +16 14 4 15 13 4 10 9 3 3 3 1 1 1 1 0 0 0
105931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
105985 +3 3 1 8 7 4 10 9 3 16 14 4 24 21 6 31 27 8
105986 +37 31 10 47 39 13 47 39 13 57 50 16 57 50 16 57 50 16
105987 +57 50 16 57 50 16 110 81 38 226 217 137 226 217 137 114 84 45
105988 +57 50 17 57 50 16 57 50 16 56 48 15 47 39 13 55 44 14
105989 +47 39 13 47 39 13 44 35 11 43 33 10 38 29 9 38 27 8
105990 +36 23 7 38 27 8 38 21 5 38 21 5 38 21 5 48 30 8
105991 +48 30 8 48 30 8 48 30 8 56 33 8 56 33 8 56 33 8
105992 +62 38 11 62 38 11 62 38 11 62 38 11 62 38 11 75 50 15
105993 +62 38 11 75 50 15 75 50 15 75 50 15 75 50 15 90 63 20
105994 +90 63 20 90 63 20 104 73 28 104 73 28 104 73 28 143 92 37
105995 +117 83 35 131 88 37 131 88 37 131 88 37 154 97 33 227 222 178
105996 +230 227 199 230 227 197 230 227 199 230 227 199 230 227 199 230 227 199
105997 +230 227 199 230 227 199 230 227 199 230 227 199 230 227 199 230 227 199
105998 +230 227 199 230 227 199 230 227 199 230 227 197 224 212 126 154 97 33
105999 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106000 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106001 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106002 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106003 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106004 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106005 +154 108 49 154 108 49 224 212 126 154 97 33 154 108 49 154 108 49
106006 +224 212 126 227 217 139 227 218 146 227 218 146 227 218 146 227 218 146
106007 +227 217 139 227 217 139 227 217 139 226 217 137 224 212 126 224 212 126
106008 +224 212 126 224 212 126 90 65 21 57 50 16 57 50 16 57 50 16
106009 +57 50 16 37 31 10 37 31 10 37 31 10 31 27 8 24 21 6
106010 +13 13 13 10 9 3 8 7 4 3 3 1 1 1 1 0 0 0
106011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
106065 +1 1 1 6 5 1 7 7 7 16 14 4 20 17 5 24 21 6
106066 +31 27 8 31 27 8 47 39 13 37 31 10 57 50 16 57 50 16
106067 +57 50 16 57 50 16 57 50 16 163 154 123 226 217 139 224 214 136
106068 +75 62 40 57 50 17 57 50 17 56 48 15 56 48 15 55 44 14
106069 +51 40 13 50 37 12 46 36 11 43 33 10 48 30 8 38 27 8
106070 +38 27 8 36 23 7 38 21 5 38 21 5 38 21 5 38 21 5
106071 +38 21 5 48 30 8 48 30 8 48 30 8 56 33 8 56 33 8
106072 +56 33 8 56 33 8 62 38 11 62 38 11 62 38 11 62 38 11
106073 +75 50 15 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
106074 +90 63 20 90 63 20 104 73 28 104 73 28 104 73 28 104 73 28
106075 +131 88 37 117 83 35 131 88 37 131 88 37 143 92 37 176 168 138
106076 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
106077 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
106078 +230 227 197 230 227 197 230 227 197 230 227 197 227 221 169 154 97 33
106079 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106080 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106081 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106082 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106083 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106084 +154 97 33 154 97 33 154 97 33 154 97 33 154 108 49 154 108 49
106085 +154 108 49 154 97 33 154 97 33 154 97 33 154 97 33 224 212 126
106086 +227 217 139 227 218 146 227 219 152 227 218 146 227 218 146 227 218 146
106087 +227 217 139 226 217 137 226 217 137 224 212 126 224 212 126 224 212 126
106088 +224 212 126 156 118 66 57 50 16 57 50 16 57 50 16 57 50 16
106089 +47 39 13 47 39 13 37 31 10 31 27 8 24 21 6 20 17 5
106090 +16 14 4 10 9 3 6 5 1 1 1 1 0 0 0 0 0 0
106091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106145 +0 0 0 3 3 1 6 5 1 13 11 4 16 14 4 24 21 6
106146 +31 27 8 37 31 10 37 31 10 47 39 13 57 50 16 57 50 16
106147 +57 50 16 57 50 16 57 50 16 90 68 33 224 212 126 226 217 139
106148 +176 168 138 71 53 16 57 50 16 57 50 17 57 50 17 56 48 15
106149 +55 44 14 51 40 13 50 37 12 46 36 11 43 33 10 41 32 10
106150 +38 27 8 38 27 8 38 21 5 38 21 5 38 21 5 38 21 5
106151 +38 21 5 38 21 5 48 30 8 48 30 8 48 30 8 56 33 8
106152 +56 33 8 56 33 8 56 33 8 62 38 11 62 38 11 62 38 11
106153 +62 38 11 62 38 11 62 38 11 75 50 15 75 50 15 75 50 15
106154 +90 63 20 90 63 20 90 63 20 104 73 28 104 73 28 131 88 37
106155 +104 73 28 154 97 33 117 83 35 131 88 37 131 88 37 154 108 49
106156 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
106157 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
106158 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 156 118 66
106159 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106160 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106161 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106162 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106163 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106164 +154 97 33 154 97 33 154 108 49 154 108 49 154 108 49 224 212 126
106165 +154 97 33 154 108 49 154 108 49 154 108 49 224 212 126 224 212 126
106166 +227 217 139 227 218 146 227 218 146 227 218 146 227 218 146 227 217 139
106167 +227 217 139 227 217 139 224 212 126 224 212 126 224 212 126 224 212 126
106168 +224 212 126 90 65 21 57 50 16 57 50 16 57 50 16 47 39 13
106169 +47 39 13 37 31 10 31 27 8 31 27 8 24 21 6 16 14 4
106170 +15 13 4 8 7 4 3 3 1 3 3 1 0 0 0 0 0 0
106171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106225 +1 1 1 3 3 1 6 5 1 10 9 3 11 11 11 24 21 6
106226 +24 21 6 31 27 8 37 31 10 37 31 10 35 34 31 57 50 16
106227 +57 50 16 57 50 16 57 50 16 57 50 16 149 122 79 226 217 137
106228 +226 217 137 150 141 118 57 50 17 71 53 16 59 49 15 59 49 15
106229 +58 46 15 55 44 14 55 43 14 51 40 13 50 37 12 49 31 9
106230 +43 33 10 48 30 8 48 30 8 38 27 8 38 21 5 38 21 5
106231 +38 21 5 38 21 5 48 30 8 38 21 5 48 30 8 38 21 5
106232 +56 33 8 56 33 8 56 33 8 56 33 8 62 38 11 62 38 11
106233 +62 38 11 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
106234 +75 50 15 90 63 20 90 63 20 104 73 28 104 73 28 104 73 28
106235 +117 83 35 117 83 35 131 88 37 131 88 37 143 92 37 143 92 37
106236 +227 221 169 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
106237 +230 227 197 230 227 197 230 227 197 230 227 197 230 227 197 230 227 197
106238 +230 227 197 229 225 190 230 227 197 230 227 197 228 223 179 224 212 126
106239 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106240 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106241 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106242 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106243 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106244 +154 108 49 154 108 49 154 108 49 154 108 49 154 97 33 154 97 33
106245 +154 108 49 154 97 33 224 212 126 154 108 49 224 212 126 227 217 139
106246 +227 218 146 227 218 146 227 218 146 227 218 146 227 217 139 227 217 139
106247 +226 217 137 226 217 137 224 212 126 224 212 126 224 212 126 224 212 126
106248 +154 97 33 57 50 16 57 50 16 57 50 16 57 50 16 47 39 13
106249 +47 39 13 37 31 10 31 27 8 24 21 6 16 14 4 15 13 4
106250 +10 9 3 6 5 1 1 1 1 0 0 0 0 0 0 0 0 0
106251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106305 +0 0 0 0 0 0 3 3 1 6 5 1 15 13 4 16 14 4
106306 +24 21 6 31 27 8 31 27 8 47 39 13 47 39 13 47 39 13
106307 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 176 168 138
106308 +224 212 126 226 217 137 142 111 68 57 50 16 71 53 16 57 50 17
106309 +71 53 16 57 50 17 59 45 14 55 43 14 51 40 13 50 37 12
106310 +46 36 11 48 30 8 48 30 8 48 30 8 48 30 8 38 21 5
106311 +48 30 8 38 21 5 48 30 8 48 30 8 48 30 8 56 33 8
106312 +56 33 8 56 33 8 56 33 8 56 33 8 56 33 8 62 38 11
106313 +62 38 11 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
106314 +90 63 20 90 63 20 90 63 20 104 73 28 104 73 28 143 92 37
106315 +104 73 28 143 92 37 117 83 35 154 97 33 117 83 35 154 97 33
106316 +163 154 123 229 224 185 229 226 192 230 227 197 229 225 190 229 225 190
106317 +230 227 197 229 225 190 229 225 190 230 227 197 229 225 190 229 225 190
106318 +230 227 197 229 225 190 230 227 197 229 225 190 229 225 190 216 206 146
106319 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106320 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106321 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106322 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106323 +154 97 33 154 97 33 154 108 49 154 108 49 154 108 49 154 108 49
106324 +224 212 126 154 97 33 154 108 49 224 212 126 154 97 33 154 108 49
106325 +154 108 49 154 108 49 154 97 33 224 212 126 226 217 137 227 217 139
106326 +227 219 152 227 218 146 227 218 146 227 217 139 227 217 139 227 217 139
106327 +226 217 137 224 212 126 224 212 126 224 212 126 224 212 126 156 118 66
106328 +90 65 21 57 50 16 57 50 16 57 50 16 47 39 13 47 39 13
106329 +37 31 10 31 27 8 31 27 8 24 21 6 16 14 4 15 13 4
106330 +8 7 4 3 3 1 3 3 1 0 0 0 0 0 0 0 0 0
106331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106385 +0 0 0 1 1 1 3 3 1 6 5 1 10 9 3 16 14 4
106386 +16 14 4 24 21 6 31 27 8 31 27 8 47 39 13 37 31 10
106387 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 91 66 24
106388 +226 217 137 226 217 137 226 217 137 135 101 60 57 50 17 71 53 16
106389 +67 48 15 59 49 15 59 49 15 59 45 14 55 44 14 57 41 13
106390 +51 40 13 50 37 12 49 31 9 48 30 8 48 30 8 48 30 8
106391 +48 30 8 38 21 5 48 30 8 38 21 5 56 33 8 38 21 5
106392 +56 33 8 56 33 8 56 33 8 56 33 8 62 38 11 62 38 11
106393 +62 38 11 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
106394 +90 63 20 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
106395 +131 88 37 104 73 28 131 88 37 131 88 37 131 88 37 131 88 37
106396 +154 108 49 229 225 190 229 226 192 229 226 192 229 225 190 230 227 197
106397 +229 225 190 229 225 190 230 227 197 229 225 190 230 227 197 229 225 190
106398 +230 227 197 229 225 190 229 225 190 230 227 197 229 225 190 228 223 179
106399 +156 118 66 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106400 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106401 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106402 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106403 +154 108 49 154 97 33 154 97 33 224 212 126 154 108 49 154 97 33
106404 +154 97 33 154 108 49 154 97 33 154 97 33 154 97 33 224 212 126
106405 +154 108 49 154 108 49 224 212 126 227 217 139 227 218 146 227 218 146
106406 +227 218 146 227 218 146 227 218 146 227 217 139 227 217 139 226 217 137
106407 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 117 83 35
106408 +57 50 16 57 50 16 57 50 16 57 50 16 47 39 13 47 39 13
106409 +37 31 10 31 27 8 24 21 6 16 14 4 15 13 4 10 9 3
106410 +6 5 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
106411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106465 +0 0 0 0 0 0 1 1 1 3 3 1 5 5 5 10 9 3
106466 +16 14 4 24 21 6 31 27 8 31 27 8 37 31 10 47 39 13
106467 +47 39 13 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
106468 +149 122 79 226 217 137 226 217 139 226 217 139 100 76 42 57 50 17
106469 +71 53 16 71 53 16 71 53 16 59 49 15 59 49 15 59 45 14
106470 +59 45 14 58 38 12 50 37 12 57 34 10 49 31 9 48 30 8
106471 +48 30 8 56 33 8 48 30 8 38 21 5 56 33 8 38 21 5
106472 +56 33 8 56 33 8 56 33 8 56 33 8 62 38 11 62 38 11
106473 +62 38 11 75 50 15 62 38 11 75 50 15 75 50 15 75 50 15
106474 +75 50 15 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
106475 +104 73 28 143 92 37 104 73 28 154 97 33 131 88 37 154 97 33
106476 +131 88 37 216 206 146 229 224 185 229 225 190 229 225 190 229 225 190
106477 +229 225 190 230 227 197 229 225 190 229 225 190 229 225 190 229 225 190
106478 +229 225 190 229 225 190 229 225 190 229 225 190 229 225 190 229 224 185
106479 +224 212 126 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106480 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106481 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106482 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106483 +154 108 49 154 108 49 154 108 49 154 97 33 154 97 33 154 108 49
106484 +224 212 126 154 97 33 154 108 49 154 108 49 154 108 49 154 97 33
106485 +154 108 49 224 212 126 226 217 137 227 217 139 227 219 152 227 218 146
106486 +227 218 146 227 217 139 227 217 139 227 217 139 227 217 139 224 212 126
106487 +224 212 126 224 212 126 224 212 126 224 212 126 154 97 33 57 50 16
106488 +57 50 16 57 50 16 57 50 16 47 39 13 37 31 10 37 31 10
106489 +31 27 8 31 27 8 24 21 6 16 14 4 15 13 4 8 7 4
106490 +3 3 1 3 3 1 0 0 0 0 0 0 0 0 0 0 0 0
106491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106545 +0 0 0 0 0 0 1 1 1 3 3 1 6 5 1 10 9 3
106546 +16 14 4 16 14 4 24 21 6 31 27 8 37 31 10 37 31 10
106547 +35 34 31 47 39 13 57 50 16 57 50 16 57 50 16 57 50 16
106548 +57 50 16 163 154 123 226 217 137 226 218 148 226 217 139 100 76 42
106549 +71 53 16 57 50 17 71 53 16 71 53 16 67 48 15 67 48 15
106550 +59 49 15 59 45 14 60 42 13 57 41 13 57 34 10 56 33 8
106551 +56 33 8 48 30 8 56 33 8 56 33 8 56 33 8 56 33 8
106552 +56 33 8 56 33 8 56 33 8 62 38 11 62 38 11 62 38 11
106553 +75 50 15 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
106554 +90 63 20 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
106555 +131 88 37 104 73 28 131 88 37 117 83 35 131 88 37 131 88 37
106556 +154 97 33 156 118 66 229 225 190 229 225 190 229 225 190 229 225 190
106557 +229 225 190 229 225 190 229 225 190 229 225 190 229 225 190 229 225 190
106558 +229 225 190 229 225 190 229 225 190 229 225 190 229 224 185 228 223 179
106559 +224 212 126 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106560 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106561 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106562 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106563 +224 212 126 154 108 49 154 108 49 154 97 33 224 212 126 154 97 33
106564 +154 97 33 154 108 49 154 97 33 224 212 126 154 108 49 154 97 33
106565 +224 212 126 227 217 139 227 217 139 227 218 146 227 218 146 227 218 146
106566 +227 218 146 227 217 139 227 217 139 226 217 137 226 217 137 224 212 126
106567 +224 212 126 224 212 126 224 212 126 156 118 66 57 50 16 57 50 16
106568 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 31 27 8
106569 +31 27 8 24 21 6 16 14 4 10 9 3 10 9 3 3 3 1
106570 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106625 +0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 4 4 4
106626 +10 9 3 16 14 4 20 17 5 24 21 6 31 27 8 37 31 10
106627 +47 39 13 47 39 13 57 50 16 57 50 16 57 50 16 57 50 16
106628 +57 50 16 90 65 21 224 212 126 226 217 137 226 217 139 216 206 146
106629 +90 68 33 80 59 18 71 53 16 71 53 16 71 53 16 57 50 17
106630 +67 48 15 67 48 15 59 45 14 59 45 14 58 38 12 58 38 12
106631 +57 34 10 57 34 10 56 33 8 56 33 8 38 21 5 56 33 8
106632 +56 33 8 56 33 8 56 33 8 56 33 8 62 38 11 62 38 11
106633 +62 38 11 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
106634 +75 50 15 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
106635 +104 73 28 143 92 37 104 73 28 154 97 33 131 88 37 131 88 37
106636 +143 92 37 154 97 33 227 221 169 229 225 190 229 225 190 229 225 190
106637 +229 225 190 229 225 190 229 224 185 229 225 190 229 224 185 229 225 190
106638 +229 224 185 229 224 185 229 225 190 229 224 185 229 224 185 229 224 185
106639 +229 224 185 154 108 49 154 97 33 154 97 33 154 97 33 154 97 33
106640 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106641 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106642 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106643 +154 97 33 154 97 33 154 108 49 154 108 49 154 97 33 154 97 33
106644 +224 212 126 154 97 33 154 108 49 154 97 33 154 108 49 224 212 126
106645 +224 212 126 227 217 139 227 218 146 227 218 146 227 218 146 227 218 146
106646 +227 217 139 227 217 139 227 217 139 226 217 137 224 212 126 224 212 126
106647 +224 212 126 224 212 126 224 212 126 104 73 28 57 50 16 57 50 16
106648 +57 50 16 57 50 16 37 31 10 37 31 10 31 27 8 31 27 8
106649 +24 21 6 24 21 6 16 14 4 15 13 4 8 7 4 3 3 1
106650 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
106651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106705 +0 0 0 0 0 0 0 0 0 0 0 0 3 3 1 6 5 1
106706 +10 9 3 15 13 4 16 14 4 24 21 6 31 27 8 31 27 8
106707 +37 31 10 47 39 13 37 31 10 57 50 16 57 50 16 57 50 16
106708 +57 50 16 57 50 16 90 68 33 224 214 136 226 217 139 226 217 137
106709 +224 214 136 100 76 42 70 58 37 80 59 18 71 53 16 71 53 16
106710 +71 53 16 71 53 16 67 48 15 67 48 15 67 48 15 60 42 13
106711 +62 38 11 62 38 11 57 34 10 62 38 11 56 33 8 56 33 8
106712 +56 33 8 56 33 8 56 33 8 62 38 11 62 38 11 62 38 11
106713 +62 38 11 62 38 11 62 38 11 75 50 15 75 50 15 75 50 15
106714 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
106715 +104 73 28 104 73 28 131 88 37 117 83 35 131 88 37 131 88 37
106716 +131 88 37 154 97 33 163 154 123 229 224 185 229 224 185 229 224 185
106717 +229 224 185 229 224 185 229 224 185 229 225 190 229 224 185 229 225 190
106718 +229 224 185 229 225 190 229 224 185 229 225 190 229 224 185 229 224 185
106719 +227 220 160 224 212 126 154 97 33 154 97 33 154 97 33 154 97 33
106720 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106721 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106722 +154 97 33 154 97 33 154 97 33 154 108 49 154 108 49 154 108 49
106723 +154 108 49 154 108 49 154 97 33 224 212 126 154 108 49 154 108 49
106724 +154 97 33 154 108 49 154 108 49 154 97 33 224 212 126 226 217 137
106725 +227 217 139 227 218 146 227 218 146 227 218 146 227 218 146 227 217 139
106726 +227 217 139 227 217 139 226 217 137 224 212 126 224 212 126 224 212 126
106727 +224 212 126 224 212 126 117 83 35 57 50 16 57 50 16 57 50 16
106728 +57 50 16 47 39 13 47 39 13 47 39 13 31 27 8 31 27 8
106729 +24 21 6 16 14 4 10 9 3 8 7 4 3 3 1 1 1 1
106730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
106786 +3 3 1 10 9 3 15 13 4 16 14 4 24 21 6 31 27 8
106787 +31 27 8 37 31 10 47 39 13 57 50 16 57 50 16 57 50 16
106788 +57 50 16 57 50 16 57 50 17 142 111 68 226 217 137 226 217 139
106789 +226 217 139 224 214 136 100 76 42 80 59 18 71 53 16 80 59 18
106790 +71 53 16 71 53 16 71 53 16 71 51 16 67 48 15 68 47 15
106791 +68 47 15 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
106792 +62 38 11 56 33 8 62 38 11 62 38 11 62 38 11 62 38 11
106793 +62 38 11 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
106794 +75 50 15 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
106795 +104 73 28 143 92 37 104 73 28 131 88 37 131 88 37 154 97 33
106796 +131 88 37 131 88 37 154 97 33 227 221 169 229 225 190 229 224 185
106797 +229 224 185 229 225 190 229 224 185 229 224 185 229 224 185 229 224 185
106798 +229 224 185 229 224 185 229 224 185 229 224 185 229 224 185 229 224 185
106799 +229 224 185 224 212 126 154 97 33 154 97 33 154 97 33 154 97 33
106800 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106801 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106802 +154 97 33 154 97 33 154 97 33 154 108 49 154 108 49 224 212 126
106803 +154 97 33 154 108 49 154 108 49 154 97 33 154 108 49 224 212 126
106804 +154 97 33 154 108 49 224 212 126 224 212 126 224 212 126 226 217 137
106805 +227 217 139 227 218 146 227 218 146 227 218 146 227 217 139 227 217 139
106806 +227 217 139 226 217 137 224 212 126 224 212 126 224 212 126 224 212 126
106807 +224 212 126 154 97 33 57 50 16 57 50 16 57 50 16 57 50 16
106808 +57 50 16 37 31 10 37 31 10 31 27 8 31 27 8 24 21 6
106809 +20 17 5 16 14 4 10 9 3 10 9 3 3 3 1 1 1 1
106810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106865 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
106866 +6 5 1 10 9 3 10 9 3 16 14 4 24 21 6 24 21 6
106867 +31 27 8 37 31 10 37 31 10 47 39 13 47 39 13 57 50 16
106868 +57 50 16 57 50 16 57 50 16 57 50 16 150 141 118 226 217 137
106869 +226 217 139 226 218 148 226 217 139 135 101 60 70 58 37 80 59 18
106870 +80 59 18 71 53 16 79 57 18 71 53 16 71 53 16 71 51 16
106871 +68 47 15 75 50 15 68 47 15 75 50 15 62 38 11 62 38 11
106872 +62 38 11 62 38 11 62 38 11 62 38 11 62 38 11 62 38 11
106873 +75 50 15 62 38 11 75 50 15 75 50 15 75 50 15 75 50 15
106874 +75 50 15 75 50 15 90 63 20 90 63 20 104 73 28 90 63 20
106875 +104 73 28 104 73 28 104 73 28 131 88 37 117 83 35 131 88 37
106876 +131 88 37 154 97 33 154 97 33 185 178 149 229 224 185 229 224 185
106877 +229 224 185 229 224 185 229 224 185 229 224 185 229 224 185 229 224 185
106878 +229 224 185 229 224 185 229 224 185 229 224 185 229 224 185 229 224 185
106879 +229 224 185 227 220 160 156 118 66 154 108 49 154 97 33 154 97 33
106880 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106881 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106882 +154 97 33 154 97 33 154 108 49 154 108 49 154 97 33 154 97 33
106883 +154 108 49 154 108 49 154 97 33 224 212 126 154 97 33 154 97 33
106884 +154 108 49 154 97 33 224 212 126 224 212 126 227 217 139 227 218 146
106885 +227 218 146 227 218 146 227 218 146 227 217 139 227 217 139 227 217 139
106886 +226 217 137 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
106887 +154 108 49 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
106888 +47 39 13 47 39 13 37 31 10 31 27 8 24 21 6 20 17 5
106889 +16 14 4 10 9 3 5 5 5 3 3 1 1 1 1 0 0 0
106890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106946 +1 1 1 3 3 1 8 7 4 10 9 3 16 14 4 24 21 6
106947 +31 27 8 31 27 8 37 31 10 47 39 13 47 39 13 57 50 16
106948 +57 50 16 57 50 16 57 50 16 57 50 16 80 59 18 163 154 123
106949 +226 217 137 226 217 137 226 217 139 226 217 137 142 111 68 71 53 16
106950 +80 59 18 80 59 18 80 59 18 79 57 18 71 53 16 78 55 17
106951 +71 53 16 75 50 15 75 50 15 68 47 15 75 50 15 75 50 15
106952 +62 38 11 75 50 15 62 38 11 75 50 15 62 38 11 75 50 15
106953 +62 38 11 75 50 15 62 38 11 75 50 15 75 50 15 75 50 15
106954 +75 50 15 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
106955 +104 73 28 143 92 37 104 73 28 143 92 37 104 73 28 154 97 33
106956 +131 88 37 131 88 37 154 97 33 154 97 33 228 223 179 229 224 185
106957 +229 224 185 229 224 185 229 224 185 229 224 185 229 224 185 229 224 185
106958 +229 224 185 229 224 185 229 224 185 228 223 179 229 224 185 228 223 179
106959 +229 224 185 228 223 179 224 212 126 154 97 33 154 97 33 154 97 33
106960 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106961 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
106962 +154 97 33 154 97 33 154 108 49 154 108 49 154 108 49 154 108 49
106963 +224 212 126 154 97 33 154 108 49 154 97 33 154 108 49 154 108 49
106964 +224 212 126 224 212 126 224 212 126 224 212 126 227 217 139 227 218 146
106965 +227 218 146 227 218 146 227 217 139 227 217 139 227 217 139 227 217 139
106966 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 156 118 66
106967 +117 83 35 57 50 16 57 50 16 57 50 16 57 50 16 47 39 13
106968 +37 31 10 37 31 10 31 27 8 31 27 8 24 21 6 16 14 4
106969 +16 14 4 10 9 3 6 5 1 3 3 1 1 1 1 0 0 0
106970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
106999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
107026 +1 1 1 3 3 1 10 9 3 10 9 3 16 14 4 14 14 14
107027 +24 21 6 31 27 8 31 27 8 37 31 10 35 34 31 47 39 13
107028 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
107029 +224 212 126 226 217 137 226 217 139 226 217 139 226 217 137 163 154 123
107030 +75 61 38 80 59 18 80 59 18 80 59 18 80 59 18 79 57 18
107031 +79 57 18 78 55 17 75 50 15 75 50 15 75 50 15 75 50 15
107032 +75 50 15 75 50 15 62 38 11 75 50 15 75 50 15 62 38 11
107033 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
107034 +90 63 20 75 50 15 90 63 20 90 63 20 90 63 20 104 73 28
107035 +90 63 20 104 73 28 104 73 28 104 73 28 131 88 37 131 88 37
107036 +131 88 37 154 97 33 131 88 37 154 97 33 216 206 146 228 223 179
107037 +228 223 179 229 224 185 228 223 179 228 223 179 228 223 179 228 223 179
107038 +228 223 179 228 223 179 228 223 179 229 224 185 228 223 179 228 223 179
107039 +228 223 179 227 221 169 224 212 126 154 97 33 154 108 49 154 97 33
107040 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
107041 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
107042 +154 97 33 154 97 33 154 108 49 154 97 33 224 212 126 154 97 33
107043 +154 97 33 154 108 49 154 108 49 154 97 33 224 212 126 154 97 33
107044 +224 212 126 224 212 126 227 217 139 227 217 139 227 218 146 227 218 146
107045 +227 218 146 227 217 139 227 217 139 227 217 139 226 217 137 224 212 126
107046 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 90 65 21
107047 +57 50 16 57 50 16 57 50 16 57 50 16 47 39 13 47 39 13
107048 +37 31 10 31 27 8 31 27 8 24 21 6 16 14 4 15 13 4
107049 +10 9 3 3 3 1 3 3 1 0 0 0 0 0 0 0 0 0
107050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107106 +0 0 0 1 1 1 3 3 1 5 5 5 10 9 3 16 14 4
107107 +20 17 5 24 21 6 31 27 8 37 31 10 37 31 10 47 39 13
107108 +57 50 16 57 50 16 57 50 16 57 50 16 80 59 18 57 50 16
107109 +80 59 18 176 168 138 226 217 137 226 217 137 226 217 137 226 217 137
107110 +224 212 126 90 68 33 80 59 18 80 59 18 90 65 21 80 59 18
107111 +80 59 18 80 59 18 79 57 18 78 55 17 75 50 15 75 50 15
107112 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
107113 +75 50 15 75 50 15 75 50 15 75 50 15 75 50 15 75 50 15
107114 +75 50 15 90 63 20 75 50 15 90 63 20 90 63 20 90 63 20
107115 +104 73 28 104 73 28 143 92 37 104 73 28 143 92 37 104 73 28
107116 +154 97 33 117 83 35 154 97 33 131 88 37 154 108 49 228 223 179
107117 +228 223 179 228 223 179 228 223 179 228 223 179 228 223 179 228 223 179
107118 +228 223 179 228 223 179 228 223 179 228 223 179 228 223 179 228 223 179
107119 +228 223 179 228 223 179 227 221 169 224 212 126 154 97 33 154 97 33
107120 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
107121 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
107122 +154 97 33 154 108 49 154 108 49 154 108 49 154 97 33 154 97 33
107123 +224 212 126 154 97 33 154 108 49 154 108 49 224 212 126 224 212 126
107124 +224 212 126 227 217 139 227 217 139 227 218 146 227 218 146 227 217 139
107125 +227 217 139 227 217 139 227 217 139 226 217 137 226 217 137 224 212 126
107126 +224 212 126 224 212 126 224 212 126 224 212 126 80 59 18 57 50 16
107127 +57 50 16 57 50 16 57 50 16 57 50 16 37 31 10 47 39 13
107128 +31 27 8 31 27 8 24 21 6 24 21 6 16 14 4 15 13 4
107129 +8 7 4 3 3 1 3 3 1 0 0 0 0 0 0 0 0 0
107130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107186 +0 0 0 1 1 1 3 3 1 6 5 1 10 9 3 15 13 4
107187 +16 14 4 24 21 6 31 27 8 31 27 8 37 31 10 37 31 10
107188 +37 31 10 57 50 16 57 50 16 57 50 16 71 53 16 57 50 16
107189 +71 53 16 80 59 18 224 212 126 226 217 137 226 217 137 226 217 139
107190 +224 214 136 224 214 136 135 101 60 90 65 21 80 59 18 80 59 18
107191 +90 65 21 80 59 18 90 63 20 78 55 17 90 63 20 90 63 20
107192 +90 63 20 75 50 15 90 63 20 75 50 15 75 50 15 75 50 15
107193 +75 50 15 75 50 15 75 50 15 75 50 15 90 63 20 75 50 15
107194 +90 63 20 75 50 15 90 63 20 90 63 20 90 63 20 104 73 28
107195 +104 73 28 90 63 20 90 63 20 131 88 37 104 73 28 131 88 37
107196 +131 88 37 131 88 37 131 88 37 154 97 33 154 97 33 216 206 146
107197 +228 223 179 228 223 179 228 223 179 228 223 179 228 223 179 228 223 179
107198 +228 223 179 228 223 179 228 223 179 228 223 179 228 223 179 228 223 179
107199 +227 221 169 228 223 179 227 217 139 224 212 126 154 97 33 154 108 49
107200 +154 108 49 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
107201 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
107202 +154 108 49 154 108 49 154 97 33 224 212 126 154 108 49 154 97 33
107203 +154 97 33 154 108 49 154 97 33 224 212 126 224 212 126 224 212 126
107204 +227 217 139 227 217 139 227 218 146 227 218 146 227 218 146 227 217 139
107205 +227 217 139 226 217 137 226 217 137 224 212 126 224 212 126 224 212 126
107206 +224 212 126 224 212 126 224 212 126 80 59 18 57 50 16 57 50 16
107207 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 31 27 8
107208 +31 27 8 24 21 6 24 21 6 16 14 4 10 9 3 6 5 1
107209 +3 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
107210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107266 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 1 10 9 3
107267 +10 9 3 16 14 4 24 21 6 24 21 6 31 27 8 37 31 10
107268 +47 39 13 47 39 13 57 50 16 57 50 16 57 50 16 71 53 16
107269 +57 50 16 80 59 18 90 68 33 224 212 126 224 212 126 226 217 139
107270 +226 217 139 226 218 148 226 217 139 150 141 118 91 66 24 90 65 21
107271 +90 65 21 90 65 21 90 63 20 90 63 20 90 63 20 75 50 15
107272 +90 63 20 90 63 20 75 50 15 90 63 20 90 63 20 75 50 15
107273 +90 63 20 75 50 15 90 63 20 75 50 15 90 63 20 90 63 20
107274 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
107275 +104 73 28 104 73 28 143 92 37 90 63 20 154 97 33 104 73 28
107276 +154 97 33 131 88 37 154 97 33 131 88 37 154 97 33 154 108 49
107277 +227 221 169 228 223 179 228 223 179 227 221 169 228 223 179 228 223 179
107278 +228 223 179 227 221 169 228 223 179 227 221 169 228 223 179 227 221 169
107279 +228 223 179 227 221 169 227 221 169 227 217 139 154 97 33 154 97 33
107280 +154 108 49 154 97 33 154 97 33 154 97 33 154 97 33 154 97 33
107281 +154 97 33 154 97 33 154 97 33 154 97 33 154 97 33 154 108 49
107282 +154 108 49 154 108 49 154 108 49 154 97 33 154 97 33 224 212 126
107283 +154 97 33 224 212 126 224 212 126 224 212 126 226 217 137 227 217 139
107284 +227 218 146 227 218 146 227 218 146 227 217 139 227 217 139 227 217 139
107285 +227 217 139 226 217 137 224 212 126 224 212 126 224 212 126 224 212 126
107286 +224 212 126 224 212 126 80 59 18 57 50 16 57 50 16 57 50 16
107287 +57 50 16 57 50 16 37 31 10 37 31 10 31 27 8 31 27 8
107288 +31 27 8 24 21 6 16 14 4 16 14 4 10 9 3 6 5 1
107289 +3 3 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
107290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107346 +0 0 0 0 0 0 1 1 1 1 1 1 3 3 1 6 5 1
107347 +10 9 3 16 14 4 16 14 4 24 21 6 31 27 8 31 27 8
107348 +37 31 10 37 31 10 57 50 16 57 50 16 57 50 16 57 50 16
107349 +80 59 18 57 50 16 57 50 16 90 65 21 176 168 138 226 217 137
107350 +226 217 137 226 217 139 226 217 139 226 217 137 224 212 126 135 101 60
107351 +80 59 18 90 65 21 90 65 21 90 63 20 90 63 20 90 63 20
107352 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
107353 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
107354 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 104 73 28
107355 +104 73 28 104 73 28 90 63 20 131 88 37 104 73 28 117 83 35
107356 +131 88 37 131 88 37 117 83 35 154 97 33 131 88 37 154 97 33
107357 +216 206 146 228 223 179 227 221 169 228 223 179 227 221 169 228 223 179
107358 +227 221 169 228 223 179 227 221 169 228 223 179 227 221 169 228 223 179
107359 +227 221 169 228 223 179 227 221 169 227 217 139 224 212 126 154 108 49
107360 +154 108 49 154 108 49 154 108 49 154 97 33 154 97 33 154 97 33
107361 +154 97 33 154 97 33 154 97 33 154 97 33 154 108 49 154 108 49
107362 +154 97 33 224 212 126 154 108 49 154 108 49 154 97 33 154 97 33
107363 +224 212 126 224 212 126 226 217 137 227 217 139 227 217 139 227 217 139
107364 +227 218 146 227 218 146 227 217 139 227 217 139 227 217 139 227 217 139
107365 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
107366 +156 118 66 80 59 18 57 50 16 57 50 16 57 50 16 57 50 16
107367 +57 50 16 47 39 13 47 39 13 37 31 10 31 27 8 31 27 8
107368 +24 21 6 16 14 4 15 13 4 10 9 3 6 5 1 3 3 1
107369 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107426 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 1
107427 +5 5 5 10 9 3 15 13 4 16 14 4 24 21 6 31 27 8
107428 +31 27 8 37 31 10 47 39 13 57 50 16 57 50 16 57 50 16
107429 +57 50 16 80 59 18 71 53 16 80 59 18 80 59 18 176 168 138
107430 +224 212 126 226 217 137 226 217 137 226 217 139 226 218 148 226 217 139
107431 +163 154 123 104 73 28 90 65 21 90 65 21 91 66 24 90 63 20
107432 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
107433 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
107434 +90 63 20 90 63 20 90 63 20 90 63 20 104 73 28 104 73 28
107435 +104 73 28 104 73 28 143 92 37 104 73 28 143 92 37 104 73 28
107436 +154 97 33 117 83 35 154 97 33 131 88 37 154 97 33 143 92 37
107437 +154 108 49 227 220 160 228 223 179 227 221 169 228 223 179 227 221 169
107438 +227 221 169 227 221 169 227 221 169 227 221 169 227 221 169 227 221 169
107439 +227 221 169 227 221 169 227 221 169 227 220 160 224 212 126 154 97 33
107440 +154 97 33 154 108 49 154 108 49 154 108 49 154 97 33 154 97 33
107441 +154 97 33 154 97 33 154 108 49 154 108 49 154 108 49 154 108 49
107442 +154 108 49 154 97 33 154 97 33 154 108 49 224 212 126 224 212 126
107443 +224 212 126 224 212 126 227 217 139 227 217 139 227 218 146 227 218 146
107444 +227 218 146 227 217 139 227 217 139 227 217 139 227 217 139 226 217 137
107445 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
107446 +104 73 28 71 53 16 57 50 16 57 50 16 57 50 16 47 39 13
107447 +47 39 13 37 31 10 37 31 10 31 27 8 31 27 8 24 21 6
107448 +20 17 5 16 14 4 10 9 3 10 9 3 3 3 1 3 3 1
107449 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107506 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 1
107507 +3 3 1 10 9 3 10 9 3 13 13 13 16 14 4 24 21 6
107508 +31 27 8 31 27 8 37 31 10 47 39 13 57 50 16 57 50 16
107509 +57 50 16 57 50 16 80 59 18 57 50 16 80 59 18 90 65 21
107510 +163 154 123 226 217 137 226 217 137 226 217 139 226 217 139 226 217 139
107511 +226 217 137 224 214 136 149 122 79 97 69 27 97 69 27 90 63 20
107512 +104 73 28 90 63 20 104 73 28 90 63 20 90 63 20 90 63 20
107513 +90 63 20 90 63 20 90 63 20 90 63 20 90 63 20 90 63 20
107514 +90 63 20 90 63 20 104 73 28 104 73 28 104 73 28 104 73 28
107515 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 131 88 37
107516 +131 88 37 131 88 37 131 88 37 131 88 37 131 88 37 154 97 33
107517 +143 92 37 224 212 126 227 221 169 227 221 169 227 221 169 227 221 169
107518 +227 221 169 227 221 169 227 221 169 227 221 169 227 221 169 227 221 169
107519 +227 221 169 227 221 169 227 221 169 227 220 160 224 212 126 224 212 126
107520 +154 108 49 154 108 49 154 108 49 154 108 49 154 108 49 154 108 49
107521 +154 108 49 154 108 49 154 108 49 154 108 49 154 97 33 224 212 126
107522 +154 108 49 154 108 49 154 108 49 224 212 126 224 212 126 224 212 126
107523 +227 217 139 227 217 139 227 218 146 227 218 146 227 218 146 227 217 139
107524 +227 217 139 227 217 139 227 217 139 226 217 137 224 212 126 224 212 126
107525 +224 212 126 224 212 126 224 212 126 224 212 126 154 108 49 71 53 16
107526 +57 50 16 57 50 16 57 50 16 56 48 15 57 50 16 47 39 13
107527 +47 39 13 37 31 10 31 27 8 31 27 8 24 21 6 16 14 4
107528 +16 14 4 10 9 3 5 5 5 3 3 1 1 1 1 0 0 0
107529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107587 +1 1 1 3 3 1 6 5 1 10 9 3 16 14 4 24 21 6
107588 +24 21 6 31 27 8 31 27 8 37 31 10 47 39 13 57 50 16
107589 +57 50 16 57 50 16 80 59 18 80 59 18 80 59 18 80 59 18
107590 +80 59 18 149 122 79 226 217 137 226 217 137 226 217 137 226 217 139
107591 +226 217 139 226 217 139 227 218 146 224 212 126 142 111 68 90 65 21
107592 +97 69 27 104 73 28 90 63 20 104 73 28 104 73 28 104 73 28
107593 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
107594 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
107595 +104 73 28 143 92 37 104 73 28 154 97 33 104 73 28 154 97 33
107596 +104 73 28 154 97 33 131 88 37 154 97 33 131 88 37 154 97 33
107597 +131 88 37 154 97 33 227 218 153 227 221 169 227 221 169 227 221 169
107598 +227 221 169 227 221 169 227 221 169 227 221 169 227 221 169 227 221 169
107599 +227 220 160 227 221 169 227 220 160 227 221 169 227 218 153 224 212 126
107600 +154 97 33 154 97 33 154 108 49 154 108 49 154 108 49 154 108 49
107601 +154 108 49 154 108 49 154 108 49 154 108 49 154 108 49 154 97 33
107602 +154 108 49 224 212 126 224 212 126 226 217 137 226 217 137 227 217 139
107603 +227 218 146 227 218 146 227 218 146 227 218 146 227 217 139 227 217 139
107604 +227 217 139 227 217 139 226 217 137 224 212 126 224 212 126 224 212 126
107605 +224 212 126 224 212 126 224 212 126 154 108 49 104 73 28 57 50 16
107606 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 37 31 10
107607 +37 31 10 37 31 10 31 27 8 24 21 6 24 21 6 16 14 4
107608 +16 14 4 10 9 3 6 5 1 3 3 1 1 1 1 0 0 0
107609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
107667 +1 1 1 3 3 1 6 5 1 10 9 3 10 9 3 16 14 4
107668 +20 17 5 24 21 6 31 27 8 37 31 10 37 31 10 56 48 15
107669 +57 50 16 57 50 16 57 50 16 57 50 16 80 59 18 57 50 16
107670 +80 59 18 90 65 21 143 106 60 224 212 126 226 217 137 226 217 137
107671 +226 217 139 226 217 139 226 217 139 226 218 148 224 214 136 224 212 126
107672 +154 108 49 90 63 20 104 73 28 90 63 20 104 73 28 90 63 20
107673 +104 73 28 104 73 28 90 63 20 104 73 28 104 73 28 104 73 28
107674 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
107675 +104 73 28 104 73 28 104 73 28 104 73 28 143 92 37 104 73 28
107676 +131 88 37 131 88 37 131 88 37 117 83 35 154 97 33 131 88 37
107677 +154 97 33 154 97 33 163 154 123 227 220 160 227 221 169 227 221 169
107678 +227 220 160 227 221 169 227 220 160 227 221 169 227 220 160 227 221 169
107679 +227 220 160 227 221 169 227 220 160 227 220 160 227 218 146 227 217 139
107680 +154 97 33 154 108 49 154 108 49 154 108 49 154 108 49 154 108 49
107681 +154 97 33 224 212 126 154 108 49 154 108 49 154 97 33 224 212 126
107682 +226 217 137 226 217 137 227 217 139 227 217 139 227 217 139 227 218 146
107683 +227 218 146 227 218 146 227 217 139 227 217 139 227 217 139 227 217 139
107684 +227 217 139 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
107685 +224 212 126 224 212 126 154 97 33 80 59 18 57 50 16 57 50 16
107686 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 37 31 10
107687 +31 27 8 31 27 8 24 21 6 24 21 6 16 14 4 10 9 3
107688 +10 9 3 3 3 1 3 3 1 1 1 1 0 0 0 0 0 0
107689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107747 +0 0 0 1 1 1 3 3 1 3 3 1 10 9 3 10 9 3
107748 +16 14 4 20 17 5 24 21 6 31 27 8 37 31 10 47 39 13
107749 +47 39 13 57 50 16 57 50 16 71 53 16 57 50 16 80 59 18
107750 +80 59 18 80 59 18 80 59 18 110 81 38 224 212 126 224 212 126
107751 +226 217 137 226 217 137 226 217 139 226 217 139 226 217 139 216 206 146
107752 +227 217 139 224 212 126 154 108 49 104 73 28 104 73 28 104 73 28
107753 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
107754 +104 73 28 143 92 37 90 63 20 143 92 37 104 73 28 143 92 37
107755 +104 73 28 143 92 37 104 73 28 154 97 33 104 73 28 154 97 33
107756 +131 88 37 131 88 37 154 97 33 131 88 37 131 88 37 154 97 33
107757 +131 88 37 154 97 33 154 97 33 224 212 126 227 220 160 227 220 160
107758 +227 221 169 227 220 160 227 220 160 227 220 160 227 220 160 227 220 160
107759 +227 220 160 227 220 160 227 220 160 227 220 160 227 220 160 227 219 152
107760 +224 212 126 154 97 33 154 97 33 154 108 49 154 108 49 154 108 49
107761 +154 97 33 154 97 33 154 108 49 224 212 126 224 212 126 224 212 126
107762 +226 217 137 227 217 139 227 217 139 227 218 146 227 218 146 227 218 146
107763 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 226 217 137
107764 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
107765 +224 212 126 104 73 28 57 50 16 57 50 16 57 50 16 57 50 16
107766 +57 50 16 57 50 16 37 31 10 47 39 13 37 31 10 31 27 8
107767 +31 27 8 24 21 6 24 21 6 16 14 4 15 13 4 10 9 3
107768 +6 5 1 3 3 1 1 1 1 1 1 1 0 0 0 0 0 0
107769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107827 +0 0 0 1 1 1 1 1 1 3 3 1 6 5 1 10 9 3
107828 +10 9 3 16 14 4 20 17 5 24 21 6 31 27 8 31 27 8
107829 +47 39 13 57 50 16 57 50 16 57 50 16 57 50 16 80 59 18
107830 +57 50 16 80 59 18 80 59 18 71 53 16 80 59 18 163 154 123
107831 +224 212 126 226 217 137 226 217 137 226 217 139 227 217 139 227 218 146
107832 +227 217 139 216 206 146 227 218 146 224 212 126 156 118 66 143 92 37
107833 +104 73 28 104 73 28 90 63 20 143 92 37 90 63 20 143 92 37
107834 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 104 73 28
107835 +104 73 28 90 63 20 143 92 37 104 73 28 143 92 37 104 73 28
107836 +117 83 35 131 88 37 131 88 37 131 88 37 131 88 37 154 97 33
107837 +131 88 37 154 97 33 154 97 33 156 118 66 227 220 160 227 220 160
107838 +227 220 160 227 220 160 227 220 160 227 220 160 227 220 160 227 220 160
107839 +227 220 160 227 220 160 227 220 160 227 220 160 227 220 160 227 218 146
107840 +226 217 137 154 108 49 154 108 49 154 108 49 154 108 49 154 97 33
107841 +224 212 126 224 212 126 226 217 137 226 217 137 227 217 139 227 217 139
107842 +227 217 139 227 218 146 227 218 146 227 218 146 227 217 139 227 217 139
107843 +227 217 139 227 217 139 227 217 139 227 217 139 224 212 126 224 212 126
107844 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 154 108 49
107845 +80 59 18 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
107846 +47 39 13 47 39 13 47 39 13 37 31 10 31 27 8 31 27 8
107847 +24 21 6 20 17 5 16 14 4 10 9 3 10 9 3 3 3 1
107848 +3 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
107849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107907 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 1 3 3 1
107908 +8 7 4 10 9 3 16 14 4 20 17 5 24 21 6 31 27 8
107909 +31 27 8 47 39 13 56 48 15 57 50 16 57 50 16 80 59 18
107910 +80 59 18 80 59 18 80 59 18 80 59 18 80 59 18 90 65 21
107911 +145 104 53 224 212 126 224 212 126 226 217 137 226 217 137 226 217 137
107912 +227 217 139 227 217 139 227 217 139 227 218 146 227 217 139 226 216 138
107913 +163 154 123 154 97 33 154 97 33 90 63 20 104 73 28 104 73 28
107914 +104 73 28 143 92 37 104 73 28 154 97 33 104 73 28 154 97 33
107915 +104 73 28 154 97 33 104 73 28 143 92 37 104 73 28 154 97 33
107916 +131 88 37 131 88 37 131 88 37 154 97 33 131 88 37 131 88 37
107917 +154 97 33 131 88 37 154 97 33 154 97 33 163 154 123 227 218 146
107918 +227 220 160 227 220 160 227 220 160 227 220 160 227 220 160 227 220 160
107919 +227 220 160 227 219 152 227 220 160 227 219 152 227 219 152 227 219 152
107920 +227 218 146 224 212 126 154 97 33 224 212 126 224 212 126 224 212 126
107921 +224 212 126 224 212 126 226 217 137 227 217 139 227 217 139 227 218 146
107922 +227 218 146 227 218 146 227 217 139 227 217 139 227 217 139 227 217 139
107923 +227 217 139 227 217 139 224 212 126 224 212 126 224 212 126 224 212 126
107924 +224 212 126 224 212 126 224 212 126 224 212 126 154 97 33 80 59 18
107925 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
107926 +47 39 13 37 31 10 37 31 10 31 27 8 31 27 8 24 21 6
107927 +24 21 6 16 14 4 15 13 4 10 9 3 6 5 1 3 3 1
107928 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
107929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
107987 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 1
107988 +6 5 1 10 9 3 10 9 3 16 14 4 20 17 5 24 21 6
107989 +27 23 7 31 27 8 37 31 10 57 50 16 57 50 16 57 50 16
107990 +57 50 16 57 50 16 80 59 18 80 59 18 80 59 18 80 59 18
107991 +80 59 18 104 73 28 163 154 123 224 212 126 225 215 136 225 215 136
107992 +226 216 138 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
107993 +227 217 139 227 217 139 224 212 126 176 168 138 154 97 33 154 97 33
107994 +104 73 28 104 73 28 104 73 28 104 73 28 104 73 28 90 63 20
107995 +143 92 37 104 73 28 104 73 28 154 97 33 104 73 28 131 88 37
107996 +131 88 37 131 88 37 131 88 37 131 88 37 131 88 37 131 88 37
107997 +131 88 37 154 97 33 131 88 37 154 97 33 154 97 33 224 212 126
107998 +227 220 160 227 219 152 227 220 160 227 219 152 227 220 160 227 219 152
107999 +227 220 160 227 219 152 227 219 152 227 219 152 227 219 152 227 219 152
108000 +227 218 146 224 212 126 224 212 126 224 212 126 224 212 126 226 217 137
108001 +227 217 139 227 217 139 227 217 139 227 218 146 227 218 146 227 218 146
108002 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108003 +226 217 137 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108004 +224 212 126 224 212 126 154 108 49 90 65 21 57 50 16 57 50 16
108005 +57 50 16 57 50 16 57 50 16 57 50 16 47 39 13 47 39 13
108006 +37 31 10 37 31 10 31 27 8 31 27 8 24 21 6 20 17 5
108007 +16 14 4 10 9 3 8 7 4 3 3 1 3 3 1 1 1 1
108008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
108068 +1 1 1 3 3 1 5 5 5 10 9 3 16 14 4 20 17 5
108069 +24 21 6 27 23 7 31 27 8 37 31 10 47 39 13 57 50 16
108070 +57 50 16 80 59 18 57 50 16 80 59 18 80 59 18 90 65 21
108071 +80 59 18 80 59 18 90 65 21 143 100 47 224 212 126 224 212 126
108072 +224 212 126 226 217 137 227 217 139 227 217 139 227 217 139 227 217 139
108073 +227 217 139 227 218 146 227 217 139 227 217 139 227 217 139 226 216 138
108074 +224 212 126 156 118 66 154 97 33 154 97 33 143 92 37 104 73 28
108075 +143 92 37 104 73 28 154 97 33 104 73 28 154 97 33 104 73 28
108076 +154 97 33 117 83 35 143 92 37 131 88 37 154 97 33 131 88 37
108077 +154 97 33 131 88 37 154 97 33 154 97 33 154 97 33 154 97 33
108078 +227 217 139 227 219 152 227 219 152 227 219 152 227 219 152 227 219 152
108079 +227 219 152 227 219 152 227 219 152 227 219 152 227 219 152 227 219 152
108080 +227 218 146 227 218 146 227 217 139 227 217 139 227 217 139 227 217 139
108081 +227 217 139 227 217 139 227 218 146 227 218 146 227 217 139 227 217 139
108082 +227 217 139 227 217 139 227 217 139 227 217 139 226 217 137 224 212 126
108083 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108084 +224 212 126 154 97 33 80 59 18 80 59 18 57 50 16 57 50 16
108085 +57 50 16 57 50 16 57 50 16 47 39 13 37 31 10 37 31 10
108086 +37 31 10 31 27 8 31 27 8 24 21 6 16 14 4 16 14 4
108087 +10 9 3 10 9 3 6 5 1 3 3 1 1 1 1 1 1 1
108088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108148 +1 1 1 3 3 1 3 3 1 8 7 4 10 9 3 15 13 4
108149 +16 14 4 24 21 6 24 21 6 31 27 8 31 27 8 47 39 13
108150 +57 50 16 57 50 16 57 50 16 80 59 18 80 59 18 80 59 18
108151 +80 59 18 90 65 21 90 65 21 80 59 18 97 69 27 149 122 79
108152 +224 212 126 224 212 126 224 212 126 225 215 136 227 217 139 227 217 139
108153 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 216 206 146
108154 +226 216 138 227 218 153 227 218 153 224 212 126 224 212 126 224 212 126
108155 +156 118 66 154 108 49 154 97 33 154 97 33 104 73 28 131 88 37
108156 +117 83 35 131 88 37 131 88 37 131 88 37 131 88 37 131 88 37
108157 +131 88 37 131 88 37 131 88 37 131 88 37 154 97 33 154 97 33
108158 +156 118 66 227 219 152 227 219 152 227 219 152 227 219 152 227 219 152
108159 +227 219 152 227 218 149 227 219 152 227 218 146 227 219 152 227 218 146
108160 +227 218 146 227 218 146 227 218 146 227 217 139 227 217 139 227 217 139
108161 +227 217 139 227 218 146 227 217 139 227 217 139 227 217 139 227 217 139
108162 +227 217 139 226 217 137 226 217 137 224 212 126 224 212 126 224 212 126
108163 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 154 97 33
108164 +80 59 18 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108165 +57 50 16 47 39 13 47 39 13 47 39 13 37 31 10 37 31 10
108166 +31 27 8 24 21 6 24 21 6 16 14 4 16 14 4 10 9 3
108167 +10 9 3 3 3 1 3 3 1 1 1 1 0 0 0 0 0 0
108168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108228 +0 0 0 1 1 1 1 1 1 3 3 1 5 5 5 10 9 3
108229 +15 13 4 16 14 4 24 21 6 24 21 6 31 27 8 31 27 8
108230 +37 31 10 47 39 13 57 50 16 57 50 16 80 59 18 80 59 18
108231 +80 59 18 80 59 18 90 65 21 90 65 21 90 65 21 90 65 21
108232 +117 83 35 163 154 123 224 212 126 224 212 126 224 212 126 227 217 139
108233 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108234 +227 217 139 227 217 139 227 217 139 216 206 146 216 206 146 224 212 126
108235 +227 217 139 227 218 149 227 217 139 224 214 136 224 212 126 224 212 126
108236 +224 212 126 163 154 123 156 118 66 224 212 126 156 118 66 224 212 126
108237 +156 118 66 224 212 126 156 118 66 224 212 126 224 212 126 224 212 126
108238 +227 217 139 227 219 152 227 218 149 227 218 149 227 218 146 227 218 146
108239 +227 218 146 227 218 146 227 218 146 227 218 146 227 218 146 227 218 146
108240 +227 218 146 227 218 146 227 217 139 227 218 146 227 218 146 227 217 139
108241 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 226 217 137
108242 +226 217 137 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108243 +224 212 126 224 212 126 224 212 126 154 108 49 117 83 35 80 59 18
108244 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108245 +47 39 13 47 39 13 37 31 10 37 31 10 31 27 8 31 27 8
108246 +24 21 6 24 21 6 16 14 4 16 14 4 10 9 3 10 9 3
108247 +6 5 1 3 3 1 1 1 1 1 1 1 0 0 0 0 0 0
108248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108308 +0 0 0 0 0 0 1 1 1 3 3 1 3 3 1 4 4 4
108309 +10 9 3 13 11 4 16 14 4 20 17 5 24 21 6 31 27 8
108310 +31 27 8 37 31 10 37 31 10 57 50 16 57 50 16 57 50 16
108311 +80 59 18 80 59 18 80 59 18 90 65 21 90 65 21 90 65 21
108312 +90 65 21 90 63 20 143 92 37 163 154 123 224 212 126 224 212 126
108313 +224 212 126 227 217 139 224 212 126 227 217 139 227 217 139 227 217 139
108314 +227 217 139 227 217 139 227 217 139 227 217 139 226 216 138 227 217 139
108315 +227 218 146 227 217 139 227 218 146 227 218 146 227 218 146 224 214 136
108316 +224 212 126 227 217 139 226 217 137 226 217 137 226 217 137 226 217 137
108317 +226 217 137 226 217 137 226 217 137 224 212 126 224 212 126 224 214 136
108318 +227 218 146 227 218 146 227 218 146 227 218 146 227 218 146 227 218 146
108319 +227 218 146 227 218 146 227 218 146 227 218 146 227 218 146 227 217 139
108320 +227 218 146 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108321 +227 217 139 226 217 137 226 217 137 226 217 137 226 217 137 224 212 126
108322 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108323 +224 212 126 154 108 49 117 83 35 80 59 18 57 50 16 57 50 16
108324 +57 50 16 57 50 16 57 50 16 57 50 16 47 39 13 47 39 13
108325 +47 39 13 37 31 10 37 31 10 31 27 8 31 27 8 24 21 6
108326 +24 21 6 16 14 4 15 13 4 10 9 3 8 7 4 3 3 1
108327 +3 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
108328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108388 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 3 3 1
108389 +4 4 4 8 7 4 10 9 3 16 14 4 20 17 5 24 21 6
108390 +24 21 6 31 27 8 37 31 10 37 31 10 47 39 13 47 39 13
108391 +57 50 16 80 59 18 80 59 18 80 59 18 90 65 21 90 65 21
108392 +90 65 21 90 65 21 90 65 21 104 73 28 143 92 37 163 154 123
108393 +224 212 126 224 212 126 224 212 126 224 212 126 227 217 139 224 212 126
108394 +227 217 139 227 217 139 226 216 138 227 217 139 227 217 139 227 217 139
108395 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108396 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108397 +227 217 139 227 218 146 227 218 146 227 218 146 226 218 148 227 218 146
108398 +227 218 146 227 218 146 227 218 146 227 217 139 227 218 146 227 218 146
108399 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108400 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 226 217 137
108401 +226 217 137 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108402 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 154 108 49
108403 +154 97 33 80 59 18 57 50 16 57 50 16 57 50 16 57 50 16
108404 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 37 31 10
108405 +37 31 10 37 31 10 31 27 8 31 27 8 24 21 6 16 14 4
108406 +16 14 4 15 13 4 10 9 3 8 7 4 6 5 1 3 3 1
108407 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
108408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108468 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
108469 +3 3 1 3 3 1 8 7 4 10 9 3 15 13 4 16 14 4
108470 +24 21 6 24 21 6 31 27 8 31 27 8 37 31 10 37 31 10
108471 +47 39 13 47 39 13 57 50 16 80 59 18 80 59 18 90 65 21
108472 +90 65 21 90 65 21 90 65 21 90 65 21 90 65 21 104 73 28
108473 +154 97 33 156 118 66 224 212 126 224 212 126 224 212 126 224 212 126
108474 +224 212 126 224 212 126 226 216 138 224 212 126 225 215 136 226 216 138
108475 +226 216 138 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108476 +227 217 139 227 217 139 227 217 139 227 218 146 227 217 139 227 218 146
108477 +227 217 139 227 217 139 226 217 139 226 217 139 226 217 139 227 217 139
108478 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108479 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108480 +227 217 139 227 217 139 226 217 137 226 217 137 224 212 126 224 212 126
108481 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108482 +224 212 126 224 212 126 224 212 126 154 108 49 90 65 21 80 59 18
108483 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108484 +57 50 16 47 39 13 47 39 13 47 39 13 37 31 10 37 31 10
108485 +31 27 8 31 27 8 24 21 6 24 21 6 16 14 4 16 14 4
108486 +10 9 3 10 9 3 6 5 1 3 3 1 1 1 1 1 1 1
108487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
108549 +1 1 1 3 3 1 3 3 1 6 5 1 10 9 3 10 9 3
108550 +16 14 4 20 17 5 24 21 6 31 27 8 31 27 8 37 31 10
108551 +37 31 10 37 31 10 47 39 13 47 39 13 57 50 16 57 50 16
108552 +80 59 18 90 65 21 90 65 21 104 73 28 90 65 21 90 65 21
108553 +104 73 28 104 73 28 117 83 35 154 108 49 224 212 126 224 212 126
108554 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108555 +227 217 139 224 212 126 227 217 139 225 215 136 227 217 139 227 217 139
108556 +227 217 139 227 217 139 227 217 139 227 217 139 226 217 137 226 217 137
108557 +226 217 137 226 217 137 226 217 137 226 217 137 227 217 139 226 217 137
108558 +227 217 139 227 217 139 227 217 139 227 217 139 227 217 139 227 217 139
108559 +227 217 139 227 217 139 227 217 139 227 217 139 224 212 126 226 217 137
108560 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108561 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108562 +154 108 49 154 97 33 80 59 18 80 59 18 57 50 16 57 50 16
108563 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108564 +47 39 13 37 31 10 37 31 10 37 31 10 37 31 10 31 27 8
108565 +31 27 8 24 21 6 20 17 5 16 14 4 16 14 4 10 9 3
108566 +10 9 3 6 5 1 3 3 1 1 1 1 1 1 1 0 0 0
108567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108629 +0 0 0 1 1 1 3 3 1 3 3 1 4 4 4 10 9 3
108630 +10 9 3 16 14 4 16 14 4 20 17 5 24 21 6 31 27 8
108631 +31 27 8 37 31 10 37 31 10 37 31 10 47 39 13 47 39 13
108632 +56 48 15 57 50 16 71 53 16 90 65 21 90 65 21 104 73 28
108633 +90 65 21 104 73 28 104 73 28 90 63 20 90 63 20 131 88 37
108634 +154 108 49 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108635 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108636 +226 217 137 224 212 126 226 217 137 226 217 137 226 217 137 226 217 137
108637 +226 217 137 226 217 137 226 217 137 226 217 137 226 217 137 226 217 137
108638 +224 212 126 227 217 139 224 212 126 227 217 139 224 212 126 224 212 126
108639 +226 217 137 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108640 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108641 +224 212 126 224 212 126 224 212 126 156 118 66 154 97 33 90 65 21
108642 +90 65 21 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108643 +57 50 16 57 50 16 57 50 16 57 50 16 47 39 13 37 31 10
108644 +47 39 13 37 31 10 37 31 10 31 27 8 31 27 8 24 21 6
108645 +24 21 6 16 14 4 16 14 4 10 9 3 10 9 3 8 7 4
108646 +3 3 1 3 3 1 1 1 1 0 0 0 0 0 0 0 0 0
108647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108709 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 1 3 3 1
108710 +5 5 5 10 9 3 15 13 4 16 14 4 16 14 4 24 21 6
108711 +24 21 6 31 27 8 31 27 8 37 31 10 37 31 10 47 39 13
108712 +47 39 13 47 39 13 56 48 15 47 39 13 57 50 16 71 53 16
108713 +80 59 18 90 63 20 90 65 21 104 73 28 104 73 28 104 73 28
108714 +104 73 28 104 73 28 131 88 37 154 108 49 163 154 123 224 212 126
108715 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108716 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108717 +224 212 126 224 212 126 226 217 137 224 212 126 224 212 126 224 212 126
108718 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108719 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108720 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108721 +154 108 49 154 97 33 104 73 28 90 65 21 57 50 16 57 50 16
108722 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108723 +57 50 16 57 50 16 47 39 13 37 31 10 47 39 13 37 31 10
108724 +37 31 10 31 27 8 31 27 8 31 27 8 24 21 6 20 17 5
108725 +16 14 4 16 14 4 15 13 4 10 9 3 10 9 3 3 3 1
108726 +3 3 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
108727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108789 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 1
108790 +3 3 1 6 5 1 6 6 6 10 9 3 16 14 4 16 14 4
108791 +20 17 5 24 21 6 31 27 8 31 27 8 37 31 10 31 27 8
108792 +37 31 10 37 31 10 47 39 13 47 39 13 47 39 13 56 48 15
108793 +56 48 15 59 49 15 59 49 15 71 53 16 90 63 20 90 63 20
108794 +90 63 20 104 73 28 104 73 28 104 73 28 131 88 37 131 88 37
108795 +154 97 33 156 118 66 156 118 66 224 212 126 224 212 126 224 212 126
108796 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108797 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108798 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108799 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108800 +224 212 126 224 212 126 154 108 49 154 97 33 90 65 21 80 59 18
108801 +80 59 18 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108802 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108803 +47 39 13 37 31 10 47 39 13 37 31 10 37 31 10 31 27 8
108804 +31 27 8 31 27 8 24 21 6 24 21 6 16 14 4 16 14 4
108805 +10 9 3 10 9 3 8 7 4 3 3 1 3 3 1 1 1 1
108806 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108870 +1 1 1 3 3 1 3 3 1 5 5 5 10 9 3 10 9 3
108871 +16 14 4 16 14 4 20 17 5 24 21 6 31 27 8 31 27 8
108872 +37 31 10 37 31 10 37 31 10 47 39 13 47 39 13 44 35 11
108873 +47 39 13 56 48 15 56 48 15 55 44 14 56 48 15 59 49 15
108874 +67 48 15 69 49 15 75 50 15 80 59 18 80 59 18 90 63 20
108875 +104 73 28 117 83 35 131 88 37 131 88 37 117 83 35 154 97 33
108876 +156 118 66 156 118 66 224 212 126 224 212 126 224 212 126 224 212 126
108877 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108878 +224 212 126 224 212 126 224 212 126 224 212 126 224 212 126 224 212 126
108879 +224 212 126 156 118 66 156 118 66 154 108 49 154 97 33 104 73 28
108880 +71 53 16 57 50 16 71 53 16 57 50 16 57 50 16 57 50 16
108881 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108882 +57 50 16 57 50 16 57 50 16 47 39 13 47 39 13 37 31 10
108883 +37 31 10 37 31 10 37 31 10 31 27 8 31 27 8 31 27 8
108884 +24 21 6 24 21 6 16 14 4 16 14 4 16 14 4 10 9 3
108885 +10 9 3 10 9 3 3 3 1 3 3 1 1 1 1 1 1 1
108886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108950 +1 1 1 1 1 1 3 3 1 6 5 1 6 5 1 10 9 3
108951 +10 9 3 15 13 4 16 14 4 16 14 4 20 17 5 24 21 6
108952 +27 23 7 31 27 8 37 31 10 31 27 8 37 31 10 44 35 11
108953 +44 35 11 44 35 11 47 39 13 47 39 13 51 40 13 55 44 14
108954 +55 44 14 56 48 15 56 48 15 59 49 15 59 49 15 59 49 15
108955 +59 49 15 59 49 15 59 49 15 59 49 15 59 49 15 57 50 16
108956 +80 59 18 80 59 18 69 49 15 62 38 11 59 49 15 59 49 15
108957 +59 49 15 80 59 18 104 73 28 104 73 28 104 73 28 104 73 28
108958 +104 73 28 104 73 28 104 73 28 80 59 18 71 53 16 67 48 15
108959 +71 53 16 90 65 21 80 59 18 80 59 18 57 50 16 57 50 16
108960 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108961 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
108962 +57 50 16 47 39 13 47 39 13 37 31 10 47 39 13 37 31 10
108963 +37 31 10 31 27 8 31 27 8 31 27 8 24 21 6 24 21 6
108964 +20 17 5 16 14 4 16 14 4 10 9 3 10 9 3 8 7 4
108965 +3 3 1 3 3 1 1 1 1 1 1 1 0 0 0 0 0 0
108966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
108999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109030 +0 0 0 0 0 0 1 1 1 1 1 1 3 3 1 3 3 1
109031 +5 5 5 8 7 4 10 9 3 15 13 4 16 14 4 16 14 4
109032 +24 21 6 24 21 6 24 21 6 31 27 8 31 27 8 37 31 10
109033 +37 31 10 37 31 10 47 39 13 44 35 11 47 39 13 47 39 13
109034 +47 39 13 56 48 15 51 40 13 56 48 15 56 48 15 56 48 15
109035 +56 48 15 56 48 15 59 49 15 59 49 15 59 49 15 57 50 16
109036 +57 50 16 57 50 16 57 50 16 59 49 15 59 49 15 59 49 15
109037 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109038 +57 50 16 57 50 16 57 50 16 57 50 16 59 49 15 57 50 16
109039 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109040 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109041 +57 50 16 57 50 16 57 50 16 57 50 16 47 39 13 37 31 10
109042 +47 39 13 37 31 10 37 31 10 37 31 10 31 27 8 31 27 8
109043 +31 27 8 31 27 8 24 21 6 24 21 6 24 21 6 16 14 4
109044 +16 14 4 16 14 4 10 9 3 10 9 3 6 5 1 3 3 1
109045 +3 3 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
109046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109110 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 3 3 1
109111 +3 3 1 6 5 1 5 5 5 10 9 3 10 9 3 15 13 4
109112 +15 13 4 16 14 4 24 21 6 24 21 6 24 21 6 31 27 8
109113 +31 27 8 37 31 10 37 31 10 37 31 10 37 31 10 44 35 11
109114 +44 35 11 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
109115 +56 48 15 56 48 15 56 48 15 56 48 15 57 50 16 57 50 16
109116 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109117 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109118 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109119 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109120 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109121 +47 39 13 47 39 13 47 39 13 37 31 10 47 39 13 37 31 10
109122 +37 31 10 37 31 10 37 31 10 31 27 8 31 27 8 31 27 8
109123 +24 21 6 24 21 6 24 21 6 16 14 4 16 14 4 15 13 4
109124 +10 9 3 10 9 3 6 5 1 3 3 1 3 3 1 1 1 1
109125 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
109191 +1 1 1 1 1 1 3 3 1 3 3 1 4 4 4 8 7 4
109192 +10 9 3 15 13 4 15 13 4 16 14 4 20 17 5 24 21 6
109193 +24 21 6 27 23 7 31 27 8 31 27 8 37 31 10 37 31 10
109194 +37 31 10 37 31 10 47 39 13 44 35 11 47 39 13 47 39 13
109195 +47 39 13 47 39 13 47 39 13 56 48 15 47 39 13 56 48 15
109196 +56 48 15 56 48 15 56 48 15 56 48 15 57 50 16 57 50 16
109197 +57 50 16 57 50 16 57 50 16 57 50 16 57 50 16 57 50 16
109198 +57 50 16 57 50 16 57 50 16 57 50 16 56 48 15 56 48 15
109199 +57 50 16 56 48 15 57 50 16 57 50 16 56 48 15 56 48 15
109200 +47 39 13 56 48 15 47 39 13 47 39 13 37 31 10 47 39 13
109201 +37 31 10 47 39 13 31 27 8 37 31 10 37 31 10 31 27 8
109202 +31 27 8 31 27 8 31 27 8 24 21 6 24 21 6 24 21 6
109203 +20 17 5 16 14 4 16 14 4 15 13 4 10 9 3 10 9 3
109204 +6 5 1 6 5 1 3 3 1 3 3 1 1 1 1 1 1 1
109205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109271 +0 0 0 1 1 1 1 1 1 3 3 1 3 3 1 3 3 1
109272 +6 5 1 6 6 6 10 9 3 10 9 3 16 14 4 16 14 4
109273 +16 14 4 20 17 5 24 21 6 24 21 6 27 23 7 31 27 8
109274 +31 27 8 31 27 8 37 31 10 37 31 10 37 31 10 37 31 10
109275 +37 31 10 47 39 13 44 35 11 47 39 13 47 39 13 47 39 13
109276 +47 39 13 47 39 13 47 39 13 56 48 15 47 39 13 47 39 13
109277 +56 48 15 47 39 13 56 48 15 57 50 16 47 39 13 56 48 15
109278 +56 48 15 56 48 15 47 39 13 56 48 15 47 39 13 56 48 15
109279 +47 39 13 47 39 13 47 39 13 47 39 13 47 39 13 37 31 10
109280 +47 39 13 47 39 13 37 31 10 47 39 13 37 31 10 37 31 10
109281 +37 31 10 37 31 10 31 27 8 31 27 8 31 27 8 31 27 8
109282 +24 21 6 24 21 6 24 21 6 24 21 6 16 14 4 16 14 4
109283 +16 14 4 10 9 3 10 9 3 8 7 4 6 5 1 3 3 1
109284 +3 3 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
109285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109351 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 3 3 1
109352 +3 3 1 3 3 1 4 4 4 8 7 4 10 9 3 10 9 3
109353 +15 13 4 15 13 4 16 14 4 20 17 5 20 17 5 24 21 6
109354 +24 21 6 27 23 7 31 27 8 31 27 8 31 27 8 37 31 10
109355 +37 31 10 37 31 10 37 31 10 37 31 10 37 31 10 44 35 11
109356 +37 31 10 47 39 13 44 35 11 44 35 11 47 39 13 47 39 13
109357 +47 39 13 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
109358 +37 31 10 47 39 13 47 39 13 47 39 13 47 39 13 47 39 13
109359 +37 31 10 47 39 13 37 31 10 47 39 13 37 31 10 47 39 13
109360 +31 27 8 37 31 10 37 31 10 31 27 8 37 31 10 31 27 8
109361 +31 27 8 31 27 8 24 21 6 31 27 8 24 21 6 24 21 6
109362 +24 21 6 20 17 5 16 14 4 16 14 4 16 14 4 10 9 3
109363 +10 9 3 10 9 3 6 5 1 6 5 1 3 3 1 3 3 1
109364 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
109365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109432 +1 1 1 3 3 1 3 3 1 3 3 1 6 5 1 5 5 5
109433 +8 7 4 10 9 3 10 9 3 15 13 4 16 14 4 16 14 4
109434 +16 14 4 20 17 5 24 21 6 24 21 6 24 21 6 27 23 7
109435 +27 23 7 31 27 8 31 27 8 37 31 10 31 27 8 37 31 10
109436 +37 31 10 37 31 10 37 31 10 37 31 10 37 31 10 37 31 10
109437 +37 31 10 37 31 10 37 31 10 37 31 10 37 31 10 37 31 10
109438 +47 39 13 37 31 10 37 31 10 37 31 10 37 31 10 37 31 10
109439 +37 31 10 37 31 10 37 31 10 31 27 8 37 31 10 31 27 8
109440 +31 27 8 31 27 8 31 27 8 31 27 8 31 27 8 24 21 6
109441 +24 21 6 24 21 6 24 21 6 20 17 5 16 14 4 16 14 4
109442 +16 14 4 16 14 4 10 9 3 10 9 3 10 9 3 6 5 1
109443 +6 5 1 3 3 1 3 3 1 1 1 1 1 1 1 0 0 0
109444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109498 +0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109499 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109512 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 3 3 1
109513 +3 3 1 6 5 1 6 5 1 8 7 4 10 9 3 10 9 3
109514 +15 13 4 15 13 4 15 13 4 16 14 4 20 17 5 20 17 5
109515 +24 21 6 24 21 6 24 21 6 24 21 6 27 23 7 27 23 7
109516 +31 27 8 27 23 7 31 27 8 31 27 8 31 27 8 31 27 8
109517 +31 27 8 31 27 8 37 31 10 37 31 10 31 27 8 37 31 10
109518 +31 27 8 31 27 8 37 31 10 31 27 8 31 27 8 31 27 8
109519 +31 27 8 31 27 8 31 27 8 31 27 8 31 27 8 24 21 6
109520 +24 21 6 24 21 6 24 21 6 24 21 6 16 14 4 20 17 5
109521 +16 14 4 16 14 4 16 14 4 16 14 4 16 14 4 15 13 4
109522 +10 9 3 10 9 3 10 9 3 6 5 1 6 5 1 3 3 1
109523 +3 3 1 3 3 1 1 1 1 1 1 1 0 0 0 0 0 0
109524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109526 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
109527 +1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
109528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109536 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
109537 +1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
109538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
109577 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109578 +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
109579 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109580 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
109581 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
109582 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109583 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109584 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109585 +1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
109586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109587 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
109588 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109589 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109590 +1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
109591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
109592 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109593 +3 3 1 3 3 1 3 3 3 6 5 1 4 4 4 8 7 4
109594 +8 7 4 10 9 3 10 9 3 13 11 4 15 13 4 16 14 4
109595 +16 14 4 16 14 4 20 17 5 20 17 5 20 17 5 20 17 5
109596 +24 21 6 24 21 6 24 21 6 24 21 6 24 21 6 27 23 7
109597 +24 21 6 31 27 8 27 23 7 27 23 7 27 23 7 31 27 8
109598 +27 23 7 31 27 8 27 23 7 27 23 7 27 23 7 27 23 7
109599 +31 27 8 24 21 6 24 21 6 24 21 6 24 21 6 24 21 6
109600 +20 17 5 24 21 6 16 14 4 16 14 4 16 14 4 16 14 4
109601 +16 14 4 16 14 4 10 9 3 10 9 3 10 9 3 10 9 3
109602 +6 5 1 6 5 1 3 3 1 3 3 1 3 3 1 2 2 2
109603 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
109604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109605 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
109606 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2
109607 +2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1
109608 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
109609 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
109610 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109611 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
109612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
109613 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109614 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109615 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109616 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2
109617 +2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1
109618 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109656 +0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109657 +2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3
109658 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109659 +3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2
109660 +2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
109661 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2
109662 +2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3
109663 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109664 +3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2
109665 +2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
109666 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
109667 +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
109668 +2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3
109669 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2
109670 +2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1
109671 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109672 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3
109673 +3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5
109674 +5 5 5 8 7 4 7 7 7 9 8 6 9 8 6 10 9 3
109675 +10 10 10 15 13 4 11 11 11 16 14 4 16 14 4 16 14 4
109676 +16 14 4 16 14 4 20 17 5 14 14 14 20 17 5 20 17 5
109677 +20 17 5 20 17 5 24 21 6 24 21 6 20 17 5 24 21 6
109678 +24 21 6 24 21 6 16 16 16 24 21 6 24 21 6 16 16 16
109679 +24 21 6 16 16 16 20 17 5 14 14 14 16 14 4 13 13 13
109680 +16 14 4 12 12 12 11 11 11 16 14 4 11 11 11 10 9 3
109681 +10 10 10 10 9 3 10 9 3 8 8 8 8 7 4 5 5 5
109682 +5 5 5 4 4 4 3 3 1 3 3 3 2 2 2 2 2 2
109683 +2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
109684 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
109685 +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
109686 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109687 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109688 +3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
109689 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
109690 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
109691 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1
109692 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2
109693 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3
109694 +3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
109695 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3
109696 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109697 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109698 +3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1
109699 +1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
109700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
109736 +1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3
109737 +3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4
109738 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109739 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3
109740 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109741 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109742 +3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4
109743 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109744 +4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3
109745 +3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2
109746 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
109747 +2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3
109748 +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4
109749 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109750 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109751 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109752 +3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4
109753 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109754 +4 4 4 6 6 6 6 6 6 8 7 4 7 7 7 9 8 6
109755 +8 7 4 8 7 4 8 8 8 10 9 3 9 9 9 10 10 10
109756 +15 13 4 11 11 11 15 13 4 16 14 4 16 14 4 14 14 14
109757 +16 14 4 14 14 14 16 14 4 14 14 14 16 14 4 16 16 16
109758 +16 14 4 14 14 14 20 17 5 16 14 4 14 14 14 16 14 4
109759 +13 13 13 15 13 4 16 14 4 16 14 4 11 11 11 15 13 4
109760 +11 11 11 10 9 3 10 9 3 9 9 9 10 9 3 10 9 3
109761 +10 9 3 7 7 7 6 6 6 5 5 5 4 4 4 4 4 4
109762 +4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3
109763 +3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2
109764 +2 2 2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
109765 +2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109766 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109767 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109768 +4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3
109769 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109770 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109771 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109772 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109773 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4
109774 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109775 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109776 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109777 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109778 +4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3
109779 +3 3 3 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1
109780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109815 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2
109816 +2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4
109817 +4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6
109818 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
109819 +6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5
109820 +5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4
109821 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
109822 +4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109823 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
109824 +6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109825 +5 5 5 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3
109826 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109827 +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 5 5 5
109828 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109829 +6 6 6 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109830 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109831 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109832 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109833 +5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 6 6 6
109834 +6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 6 6 6
109835 +6 6 6 7 7 7 9 8 6 7 7 7 10 9 3 8 8 8
109836 +10 9 3 8 8 8 9 9 9 9 9 9 10 10 10 15 13 4
109837 +9 9 9 15 13 4 12 12 12 15 13 4 12 12 12 15 13 4
109838 +12 12 12 15 13 4 12 12 12 12 12 12 16 14 4 12 12 12
109839 +15 13 4 11 11 11 10 10 10 10 10 10 10 9 3 10 10 10
109840 +9 9 9 9 9 9 9 9 9 10 9 3 8 8 8 8 8 8
109841 +7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7
109842 +6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5
109843 +4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3
109844 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
109845 +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5
109846 +5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6
109847 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
109848 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109849 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109850 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109851 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109852 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109853 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109854 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6
109855 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
109856 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
109857 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
109858 +5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4
109859 +4 4 4 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2
109860 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
109861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109895 +0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3
109896 +3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6
109897 +6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 8 8 8
109898 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
109899 +8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7
109900 +7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6
109901 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
109902 +6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 8 8 8
109903 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
109904 +8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 6 6 6
109905 +6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5
109906 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109907 +5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6
109908 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8
109909 +8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7
109910 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
109911 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
109912 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
109913 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
109914 +8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 7
109915 +7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 7 7 7
109916 +8 8 8 7 7 7 9 9 9 10 9 3 8 8 8 9 9 9
109917 +10 9 3 8 8 8 10 10 10 10 10 10 10 10 10 10 10 10
109918 +10 10 10 11 11 11 15 13 4 11 11 11 11 11 11 10 10 10
109919 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 9 9 9
109920 +8 8 8 9 9 9 8 8 8 9 9 9 8 8 8 8 8 8
109921 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9
109922 +8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 6 6 6
109923 +6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5
109924 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
109925 +5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7
109926 +7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8
109927 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
109928 +8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7
109929 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
109930 +7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6
109931 +6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7
109932 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
109933 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
109934 +7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8
109935 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
109936 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
109937 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
109938 +7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6
109939 +5 5 5 5 5 5 4 4 4 4 4 4 3 3 3 3 3 3
109940 +2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0
109941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
109974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
109975 +1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4
109976 +5 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7
109977 +8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 10 10 10
109978 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
109979 +10 10 10 10 10 10 10 10 10 9 9 9 9 9 9 9 9 9
109980 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
109981 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
109982 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10
109983 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
109984 +10 10 10 10 10 10 9 9 9 9 9 9 9 9 9 8 8 8
109985 +8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 7
109986 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
109987 +7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
109988 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 10 10 10
109989 +10 10 10 10 10 10 9 9 9 9 9 9 9 9 9 9 9 9
109990 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
109991 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
109992 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
109993 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
109994 +10 10 10 10 10 10 10 10 10 10 10 10 9 9 9 9 9 9
109995 +9 9 9 10 10 10 9 9 9 9 9 9 9 9 9 9 9 9
109996 +9 9 9 9 9 9 9 9 9 10 10 10 9 9 9 9 9 9
109997 +10 10 10 9 9 9 9 9 9 10 10 10 10 9 3 11 11 11
109998 +9 9 9 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
109999 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110000 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110001 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110002 +10 10 10 9 9 9 9 9 9 9 9 9 9 9 9 8 8 8
110003 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
110004 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
110005 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9
110006 +9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10
110007 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110008 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110009 +10 10 10 10 10 10 9 9 9 9 9 9 9 9 9 9 9 9
110010 +9 9 9 9 9 9 9 9 9 9 9 9 8 8 8 8 8 8
110011 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
110012 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
110013 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
110014 +9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10
110015 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110016 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110017 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110018 +9 9 9 9 9 9 9 9 9 8 8 8 8 8 8 7 7 7
110019 +7 7 7 6 6 6 6 6 6 5 5 5 5 5 5 4 4 4
110020 +3 3 3 3 3 3 2 2 2 2 2 2 1 1 1 1 1 1
110021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110054 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
110055 +2 2 2 3 3 3 3 3 3 4 4 4 5 5 5 5 5 5
110056 +6 6 6 7 7 7 7 7 7 8 8 8 9 9 9 9 9 9
110057 +10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 12 12 12
110058 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
110059 +12 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 11 11
110060 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110061 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110062 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110063 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
110064 +12 12 12 12 12 12 11 11 11 11 11 11 11 11 11 10 10 10
110065 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110066 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110067 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110068 +10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 12 12 12
110069 +12 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 11 11
110070 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110071 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110072 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110073 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
110074 +12 12 12 12 12 12 12 12 12 12 12 12 11 11 11 11 11 11
110075 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110076 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110077 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110078 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 13 13 13
110079 +13 13 13 14 14 14 13 13 13 13 13 13 13 13 13 13 13 13
110080 +14 14 14 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
110081 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 12 12 12
110082 +12 12 12 12 12 12 11 11 11 11 11 11 11 11 11 10 10 10
110083 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110084 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
110085 +10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11
110086 +11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12
110087 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
110088 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
110089 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 11 11 11
110090 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110091 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110092 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110093 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
110094 +11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12
110095 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
110096 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
110097 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
110098 +11 11 11 11 11 11 11 11 11 10 10 10 10 10 10 9 9 9
110099 +9 9 9 8 8 8 7 7 7 7 7 7 6 6 6 5 5 5
110100 +5 5 5 4 4 4 3 3 3 3 3 3 2 2 2 1 1 1
110101 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110134 +0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 3 3 3
110135 +3 3 3 4 4 4 4 4 4 5 5 5 6 6 6 7 7 7
110136 +8 8 8 9 9 9 9 9 9 10 10 10 11 11 11 11 11 11
110137 +12 12 12 12 12 12 13 13 13 13 13 13 13 13 13 14 14 14
110138 +14 14 14 14 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110139 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110140 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110141 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
110142 +13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14
110143 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110144 +14 14 14 14 14 14 14 14 14 13 13 13 13 13 13 13 13 13
110145 +13 13 13 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
110146 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
110147 +12 12 12 12 12 12 12 12 12 12 12 12 13 13 13 13 13 13
110148 +13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14
110149 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110150 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110151 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110152 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110153 +14 14 14 14 14 14 14 14 14 15 14 14 15 14 14 15 14 14
110154 +15 14 14 15 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110155 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110156 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110157 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110158 +14 14 14 14 14 14 14 14 14 16 16 16 14 14 14 16 16 16
110159 +16 16 16 16 16 16 14 14 14 16 16 16 16 16 16 16 16 16
110160 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110161 +14 14 14 16 16 16 16 16 16 14 14 14 16 16 16 16 16 16
110162 +14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 13 13 13
110163 +13 13 13 13 13 13 13 13 13 12 12 12 12 12 12 12 12 12
110164 +12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
110165 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
110166 +13 13 13 14 14 14 14 14 14 14 14 14 14 14 14 15 14 14
110167 +15 14 14 15 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110168 +15 14 14 15 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110169 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110170 +14 14 14 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
110171 +13 13 13 13 13 13 13 13 13 13 13 13 14 14 14 14 14 14
110172 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
110173 +14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 13 13 13
110174 +14 14 14 14 14 14 14 14 14 14 14 14 15 14 14 15 14 14
110175 +15 14 14 15 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110176 +15 14 14 15 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110177 +15 14 14 15 14 14 15 14 14 14 14 14 14 14 14 14 14 14
110178 +13 13 13 13 13 13 13 13 13 12 12 12 12 12 12 11 11 11
110179 +11 11 11 10 10 10 9 9 9 8 8 8 8 8 8 7 7 7
110180 +6 6 6 5 5 5 4 4 4 4 4 4 3 3 3 3 3 3
110181 +2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
110182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110214 +0 0 0 1 1 1 1 1 1 2 2 2 3 3 3 3 3 3
110215 +4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9
110216 +9 9 9 10 10 10 11 11 11 12 12 12 13 13 13 13 13 13
110217 +14 14 14 15 14 14 15 14 14 16 16 16 16 16 16 16 16 16
110218 +16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
110219 +17 17 17 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110220 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110221 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110222 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110223 +16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
110224 +17 17 17 16 16 16 16 16 16 16 16 16 16 16 16 15 14 14
110225 +15 14 14 15 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110226 +15 14 14 15 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110227 +15 14 14 15 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110228 +15 14 14 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110229 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110230 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110231 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110232 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110233 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
110234 +17 17 17 17 17 17 17 17 17 16 16 16 16 16 16 16 16 16
110235 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110236 +16 16 16 16 16 16 17 17 17 16 16 16 16 16 16 17 17 17
110237 +16 16 16 16 16 16 17 17 17 16 16 16 16 16 16 16 16 16
110238 +17 17 17 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17
110239 +17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
110240 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
110241 +18 18 18 18 18 18 17 17 17 17 17 17 17 17 17 17 17 17
110242 +17 17 17 16 16 16 16 16 16 16 16 16 16 16 16 15 14 14
110243 +15 14 14 15 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110244 +15 14 14 15 14 14 15 14 14 15 14 14 15 14 14 15 14 14
110245 +15 14 14 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110246 +16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17
110247 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
110248 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
110249 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 16 16 16
110250 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110251 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110252 +16 16 16 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16
110253 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
110254 +16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17
110255 +17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18
110256 +18 18 18 18 18 18 18 18 18 17 17 17 17 17 17 17 17 17
110257 +17 17 17 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16
110258 +16 16 16 16 16 16 15 14 14 15 14 14 14 14 14 13 13 13
110259 +13 13 13 12 12 12 11 11 11 10 10 10 9 9 9 9 9 9
110260 +8 8 8 7 7 7 6 6 6 5 5 5 4 4 4 3 3 3
110261 +3 3 3 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0
110262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110294 +1 1 1 1 1 1 2 2 2 3 3 3 4 4 4 4 4 4
110295 +5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10
110296 +11 11 11 12 12 12 13 13 13 14 14 14 15 14 14 16 16 16
110297 +16 16 16 17 17 17 17 17 17 18 18 18 18 18 18 19 19 19
110298 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110299 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110300 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110301 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110302 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110303 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110304 +19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18
110305 +18 18 18 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
110306 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
110307 +17 17 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18
110308 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
110309 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110310 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110311 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110312 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110313 +19 19 19 19 19 19 19 19 19 20 20 20 20 20 20 20 20 20
110314 +20 20 20 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110315 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110316 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110317 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110318 +19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20
110319 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110320 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110321 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 19 19 19
110322 +19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18
110323 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
110324 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
110325 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
110326 +18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 19
110327 +19 19 19 19 19 19 20 20 20 20 20 20 20 20 20 20 20 20
110328 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110329 +20 20 20 20 20 20 20 20 20 19 19 19 19 19 19 19 19 19
110330 +19 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
110331 +18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19
110332 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110333 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
110334 +19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20
110335 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110336 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110337 +20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 19 19 19
110338 +18 18 18 18 18 18 17 17 17 17 17 17 16 16 16 16 16 16
110339 +15 14 14 14 14 14 13 13 13 12 12 12 11 11 11 10 10 10
110340 +9 9 9 8 8 8 7 7 7 6 6 6 5 5 5 4 4 4
110341 +4 4 4 3 3 3 2 2 2 1 1 1 1 1 1 0 0 0
110342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
110374 +1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6
110375 +7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 12 12 12
110376 +13 13 13 14 14 14 15 14 14 16 16 16 17 17 17 18 18 18
110377 +18 18 18 19 19 19 20 20 20 20 20 20 21 21 21 21 21 21
110378 +21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22
110379 +22 22 22 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110380 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110381 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110382 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110383 +21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22
110384 +21 21 21 21 21 21 21 21 21 21 21 21 20 20 20 20 20 20
110385 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110386 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110387 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110388 +20 20 20 20 20 20 20 20 20 21 21 21 21 21 21 21 21 21
110389 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110390 +21 21 21 21 21 21 21 21 21 22 22 22 22 22 22 22 22 22
110391 +22 22 22 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21
110392 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110393 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
110394 +22 22 22 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21
110395 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110396 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110397 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110398 +21 21 21 22 22 22 22 22 22 22 22 22 22 22 22 24 24 24
110399 +24 24 24 24 24 24 22 22 22 24 24 24 24 24 24 24 24 24
110400 +22 22 22 24 24 24 22 22 22 24 24 24 24 24 24 24 24 24
110401 +22 22 22 24 24 24 24 24 24 22 22 22 22 22 22 22 22 22
110402 +21 21 21 21 21 21 21 21 21 21 21 21 20 20 20 20 20 20
110403 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110404 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
110405 +20 20 20 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21
110406 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22
110407 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
110408 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
110409 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 21 21 21
110410 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110411 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110412 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 21 21 21
110413 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
110414 +21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 24 24 24
110415 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110416 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110417 +22 22 22 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21
110418 +21 21 21 20 20 20 20 20 20 19 19 19 18 18 18 18 18 18
110419 +17 17 17 16 16 16 15 14 14 14 14 14 13 13 13 12 12 12
110420 +11 11 11 10 10 10 9 9 9 8 8 8 7 7 7 6 6 6
110421 +5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 1 1 1
110422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110453 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
110454 +2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7
110455 +8 8 8 9 9 9 10 10 10 12 12 12 13 13 13 14 14 14
110456 +15 14 14 16 16 16 17 17 17 18 18 18 19 19 19 20 20 20
110457 +21 21 21 21 21 21 22 22 22 24 24 24 24 24 24 24 24 24
110458 +24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25
110459 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110460 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110461 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110462 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110463 +24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25
110464 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110465 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110466 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110467 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110468 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110469 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110470 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110471 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110472 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110473 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110474 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110475 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110476 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110477 +24 24 24 24 24 24 24 24 24 24 24 24 25 25 25 25 25 25
110478 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110479 +24 24 24 25 25 25 26 26 26 26 26 26 25 25 25 26 26 26
110480 +26 26 26 26 26 26 26 26 26 26 26 26 25 25 25 26 26 26
110481 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110482 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110483 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110484 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110485 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110486 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25
110487 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110488 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110489 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110490 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110491 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 25 25 25
110492 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110493 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
110494 +24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
110495 +25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26
110496 +26 26 26 26 26 26 25 25 25 25 25 25 25 25 25 25 25 25
110497 +25 25 25 25 25 25 25 25 25 24 24 24 24 24 24 24 24 24
110498 +24 24 24 24 24 24 22 22 22 21 21 21 21 21 21 20 20 20
110499 +19 19 19 18 18 18 17 17 17 16 16 16 15 14 14 14 14 14
110500 +13 13 13 12 12 12 10 10 10 9 9 9 8 8 8 7 7 7
110501 +6 6 6 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1
110502 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110533 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2
110534 +3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8
110535 +10 10 10 11 11 11 12 12 12 13 13 13 15 14 14 16 16 16
110536 +17 17 17 18 18 18 19 19 19 20 20 20 21 21 21 22 22 22
110537 +24 24 24 24 24 24 25 25 25 25 25 25 26 26 26 26 26 26
110538 +26 26 26 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110539 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110540 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110541 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110542 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110543 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110544 +27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
110545 +26 26 26 26 26 26 26 26 26 25 25 25 25 25 25 25 25 25
110546 +25 25 25 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26
110547 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
110548 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
110549 +26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27
110550 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110551 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110552 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110553 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110554 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110555 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110556 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110557 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110558 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28
110559 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110560 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110561 +28 28 28 28 28 28 28 28 28 28 28 28 27 27 27 27 27 27
110562 +27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
110563 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
110564 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
110565 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
110566 +26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27
110567 +27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28
110568 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110569 +28 28 28 28 28 28 27 27 27 27 27 27 27 27 27 27 27 27
110570 +27 27 27 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
110571 +26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27
110572 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110573 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
110574 +27 27 27 27 27 27 27 27 27 27 27 27 28 28 28 28 28 28
110575 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110576 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110577 +28 28 28 27 27 27 27 27 27 27 27 27 26 26 26 26 26 26
110578 +26 26 26 25 25 25 25 25 25 24 24 24 24 24 24 22 22 22
110579 +21 21 21 20 20 20 19 19 19 18 18 18 17 17 17 16 16 16
110580 +15 14 14 13 13 13 12 12 12 11 11 11 10 10 10 8 8 8
110581 +7 7 7 6 6 6 5 5 5 4 4 4 3 3 3 2 2 2
110582 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110613 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3
110614 +4 4 4 5 5 5 6 6 6 7 7 7 9 9 9 10 10 10
110615 +11 11 11 13 13 13 14 14 14 15 14 14 16 16 16 18 18 18
110616 +19 19 19 20 20 20 21 21 21 22 22 22 24 24 24 25 25 25
110617 +25 25 25 26 26 26 27 27 27 28 28 28 28 28 28 30 30 30
110618 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110619 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110620 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110621 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110622 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110623 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110624 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 28 28 28
110625 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110626 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110627 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110628 +28 28 28 28 28 28 28 28 28 28 28 28 30 30 30 30 30 30
110629 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110630 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110631 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110632 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110633 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110634 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110635 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110636 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110637 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110638 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 32 32
110639 +30 30 30 32 32 32 30 30 30 32 32 32 30 30 30 32 32 32
110640 +30 30 30 30 30 30 30 30 30 32 32 32 30 30 30 32 32 32
110641 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110642 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 28 28 28
110643 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
110644 +28 28 28 28 28 28 28 28 28 30 30 30 30 30 30 30 30 30
110645 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110646 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110647 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110648 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110649 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110650 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110651 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110652 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110653 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110654 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110655 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110656 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110657 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110658 +28 28 28 28 28 28 27 27 27 26 26 26 25 25 25 25 25 25
110659 +24 24 24 22 22 22 21 21 21 20 20 20 19 19 19 18 18 18
110660 +16 16 16 15 14 14 14 14 14 13 13 13 11 11 11 10 10 10
110661 +9 9 9 7 7 7 6 6 6 5 5 5 4 4 4 3 3 3
110662 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
110663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110693 +0 0 0 0 0 0 1 1 1 1 1 1 3 3 3 3 3 3
110694 +4 4 4 6 6 6 7 7 7 8 8 8 10 10 10 11 11 11
110695 +13 13 13 14 14 14 16 16 16 17 17 17 18 18 18 20 20 20
110696 +21 21 21 22 22 22 24 24 24 25 25 25 26 26 26 27 27 27
110697 +28 28 28 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110698 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33
110699 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110700 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110701 +33 33 33 33 33 33 32 32 32 32 32 32 32 32 32 32 32 32
110702 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
110703 +32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 32 32 32
110704 +32 32 32 32 32 32 32 32 32 32 32 32 30 30 30 30 30 30
110705 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110706 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110707 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110708 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 32 32
110709 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33
110710 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110711 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110712 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110713 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110714 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110715 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110716 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110717 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110718 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110719 +33 33 33 35 35 35 35 35 35 35 35 35 35 35 35 33 33 33
110720 +35 35 35 35 35 35 35 35 35 33 33 33 35 35 35 35 35 35
110721 +35 35 35 35 35 35 35 35 35 33 33 33 33 33 33 33 33 33
110722 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 30 30 30
110723 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
110724 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 32 32
110725 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
110726 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
110727 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110728 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110729 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32
110730 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
110731 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33
110732 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110733 +33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
110734 +32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
110735 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110736 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 33 33 33
110737 +33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 30 30 30
110738 +30 30 30 30 30 30 30 30 30 30 30 30 28 28 28 27 27 27
110739 +26 26 26 25 25 25 24 24 24 22 22 22 21 21 21 20 20 20
110740 +18 18 18 17 17 17 16 16 16 14 14 14 13 13 13 11 11 11
110741 +10 10 10 8 8 8 7 7 7 6 6 6 4 4 4 3 3 3
110742 +3 3 3 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
110743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110773 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
110774 +5 5 5 7 7 7 8 8 8 10 10 10 11 11 11 13 13 13
110775 +14 14 14 16 16 16 17 17 17 19 19 19 20 20 20 21 21 21
110776 +24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 30 30 30
110777 +30 30 30 30 30 30 32 32 32 33 33 33 35 35 35 35 35 35
110778 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110779 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110780 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110781 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110782 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110783 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110784 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110785 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110786 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110787 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110788 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110789 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110790 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110791 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110792 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110793 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110794 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110795 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110796 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110797 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110798 +35 35 35 35 35 35 35 35 35 35 35 35 37 37 37 35 35 35
110799 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110800 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110801 +37 37 37 37 37 37 35 35 35 35 35 35 35 35 35 35 35 35
110802 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110803 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110804 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110805 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110806 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110807 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110808 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110809 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110810 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110811 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110812 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110813 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110814 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110815 +35 35 35 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110816 +37 37 37 37 37 37 37 37 37 37 37 37 35 35 35 35 35 35
110817 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
110818 +35 35 35 33 33 33 32 32 32 30 30 30 30 30 30 30 30 30
110819 +28 28 28 27 27 27 26 26 26 25 25 25 24 24 24 21 21 21
110820 +20 20 20 19 19 19 17 17 17 16 16 16 14 14 14 13 13 13
110821 +11 11 11 10 10 10 8 8 8 7 7 7 5 5 5 4 4 4
110822 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
110823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110853 +0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
110854 +6 6 6 8 8 8 9 9 9 11 11 11 13 13 13 14 14 14
110855 +16 16 16 17 17 17 19 19 19 20 20 20 22 22 22 24 24 24
110856 +25 25 25 26 26 26 28 28 28 30 30 30 30 30 30 32 32 32
110857 +33 33 33 35 35 35 35 35 35 35 35 35 35 35 35 37 37 37
110858 +37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110859 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110860 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110861 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110862 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110863 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110864 +38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37
110865 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110866 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110867 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110868 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110869 +37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110870 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110871 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110872 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110873 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110874 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110875 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110876 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110877 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110878 +38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39
110879 +39 39 39 39 39 39 39 39 39 39 39 39 41 41 41 39 39 39
110880 +41 41 41 39 39 39 41 41 41 41 41 41 41 41 41 41 41 41
110881 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38
110882 +38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37
110883 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110884 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110885 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
110886 +37 37 37 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110887 +38 38 38 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39
110888 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
110889 +39 39 39 39 39 39 39 39 39 39 39 39 38 38 38 38 38 38
110890 +38 38 38 38 38 38 38 38 38 37 37 37 37 37 37 37 37 37
110891 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110892 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110893 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
110894 +38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39
110895 +39 39 39 39 39 39 39 39 39 41 41 41 41 41 41 41 41 41
110896 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
110897 +39 39 39 39 39 39 38 38 38 38 38 38 37 37 37 37 37 37
110898 +35 35 35 35 35 35 35 35 35 35 35 35 33 33 33 32 32 32
110899 +30 30 30 30 30 30 28 28 28 26 26 26 25 25 25 24 24 24
110900 +22 22 22 20 20 20 19 19 19 17 17 17 16 16 16 14 14 14
110901 +13 13 13 11 11 11 9 9 9 8 8 8 6 6 6 5 5 5
110902 +4 4 4 3 3 3 2 2 2 1 1 1 0 0 0 0 0 0
110903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110933 +1 1 1 1 1 1 3 3 3 3 3 3 5 5 5 6 6 6
110934 +7 7 7 9 9 9 11 11 11 12 12 12 14 14 14 16 16 16
110935 +17 17 17 19 19 19 21 21 21 22 22 22 24 24 24 26 26 26
110936 +27 27 27 30 30 30 30 30 30 32 32 32 33 33 33 35 35 35
110937 +35 35 35 37 37 37 37 37 37 38 38 38 39 39 39 41 41 41
110938 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110939 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110940 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110941 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110942 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110943 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110944 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110945 +41 41 41 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
110946 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
110947 +39 39 39 39 39 39 39 39 39 39 39 39 41 41 41 41 41 41
110948 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110949 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110950 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110951 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110952 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110953 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110954 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110955 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110956 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110957 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110958 +41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42
110959 +42 42 42 42 42 42 42 42 42 43 43 43 43 43 43 43 43 43
110960 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42
110961 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 41 41 41
110962 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110963 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110964 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110965 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110966 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110967 +41 41 41 41 41 41 41 41 41 42 42 42 42 42 42 42 42 42
110968 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
110969 +42 42 42 42 42 42 42 42 42 41 41 41 41 41 41 41 41 41
110970 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110971 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110972 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110973 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110974 +41 41 41 41 41 41 41 41 41 41 41 41 42 42 42 42 42 42
110975 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
110976 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
110977 +42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
110978 +39 39 39 38 38 38 37 37 37 37 37 37 35 35 35 35 35 35
110979 +33 33 33 32 32 32 30 30 30 30 30 30 27 27 27 26 26 26
110980 +24 24 24 22 22 22 21 21 21 19 19 19 17 17 17 16 16 16
110981 +14 14 14 12 12 12 11 11 11 9 9 9 7 7 7 6 6 6
110982 +5 5 5 3 3 3 2 2 2 1 1 1 1 1 1 0 0 0
110983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111013 +1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 7 7 7
111014 +8 8 8 10 10 10 12 12 12 13 13 13 16 16 16 17 17 17
111015 +19 19 19 20 20 20 22 22 22 24 24 24 26 26 26 27 27 27
111016 +30 30 30 30 30 30 32 32 32 35 35 35 35 35 35 37 37 37
111017 +38 38 38 39 39 39 41 41 41 41 41 41 42 42 42 42 42 42
111018 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111019 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111020 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111021 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111022 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111023 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111024 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111025 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
111026 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
111027 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
111028 +42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111029 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111030 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111031 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111032 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111033 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111034 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111035 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111036 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111037 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111038 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 45 45 45
111039 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111040 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111041 +45 45 45 45 45 45 45 45 45 43 43 43 43 43 43 43 43 43
111042 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111043 +43 43 43 43 43 43 42 42 42 42 42 42 42 42 42 42 42 42
111044 +42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 43 43 43
111045 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111046 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111047 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111048 +43 43 43 45 45 45 45 45 45 45 45 45 45 45 45 43 43 43
111049 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111050 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111051 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111052 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111053 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
111054 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 45 45 45
111055 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111056 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111057 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 42 42 42
111058 +42 42 42 41 41 41 41 41 41 39 39 39 38 38 38 37 37 37
111059 +35 35 35 35 35 35 32 32 32 30 30 30 30 30 30 27 27 27
111060 +26 26 26 24 24 24 22 22 22 20 20 20 19 19 19 17 17 17
111061 +16 16 16 13 13 13 12 12 12 10 10 10 8 8 8 7 7 7
111062 +5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 0 0 0
111063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111093 +1 1 1 3 3 3 3 3 3 5 5 5 6 6 6 8 8 8
111094 +9 9 9 11 11 11 13 13 13 15 14 14 17 17 17 18 18 18
111095 +20 20 20 22 22 22 24 24 24 26 26 26 28 28 28 30 30 30
111096 +30 30 30 33 33 33 35 35 35 35 35 35 38 38 38 39 39 39
111097 +41 41 41 42 42 42 43 43 43 43 43 43 43 43 43 45 45 45
111098 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111099 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111100 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111101 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111102 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111103 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111104 +46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45
111105 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111106 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111107 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111108 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111109 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111110 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111111 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111112 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111113 +46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
111114 +47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 46 46 46
111115 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111116 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111117 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111118 +46 46 46 46 46 46 47 47 47 47 47 47 47 47 47 47 47 47
111119 +47 47 47 48 48 47 48 48 47 48 48 47 48 48 47 48 48 47
111120 +48 48 47 48 48 47 48 48 47 48 48 47 48 48 47 48 48 47
111121 +48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46
111122 +46 46 46 46 46 46 46 46 46 45 45 45 45 45 45 45 45 45
111123 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111124 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
111125 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46
111126 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111127 +46 46 46 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
111128 +47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
111129 +47 47 47 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46
111130 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111131 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111132 +46 46 46 47 47 47 47 47 47 47 47 47 46 46 46 46 46 46
111133 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
111134 +46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 47
111135 +47 47 47 47 47 47 48 48 47 48 48 47 48 48 47 48 48 47
111136 +48 48 47 48 48 47 48 48 47 47 47 47 47 47 47 47 47 47
111137 +47 47 47 47 47 47 46 46 46 46 46 46 46 46 46 45 45 45
111138 +43 43 43 43 43 43 43 43 43 42 42 42 41 41 41 39 39 39
111139 +38 38 38 35 35 35 35 35 35 33 33 33 30 30 30 30 30 30
111140 +28 28 28 26 26 26 24 24 24 22 22 22 20 20 20 18 18 18
111141 +17 17 17 15 14 14 13 13 13 11 11 11 9 9 9 8 8 8
111142 +6 6 6 5 5 5 3 3 3 3 3 3 1 1 1 0 0 0
111143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
111173 +2 2 2 3 3 3 4 4 4 5 5 5 7 7 7 9 9 9
111174 +10 10 10 12 12 12 14 14 14 16 16 16 18 18 18 20 20 20
111175 +22 22 22 24 24 24 26 26 26 27 27 27 30 30 30 30 30 30
111176 +33 33 33 35 35 35 37 37 37 38 38 38 41 41 41 42 42 42
111177 +43 43 43 43 43 43 45 45 45 46 46 46 47 47 47 48 48 47
111178 +48 48 47 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111179 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111180 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111181 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111182 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111183 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111184 +49 49 49 48 48 47 48 48 47 48 48 47 48 48 47 48 48 47
111185 +48 48 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
111186 +47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
111187 +47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 48 48 47
111188 +48 48 47 48 48 47 48 48 47 48 48 47 48 48 47 48 48 47
111189 +48 48 47 48 48 47 49 49 49 49 49 49 49 49 49 49 49 49
111190 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111191 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111192 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111193 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111194 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111195 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111196 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111197 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111198 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50
111199 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111200 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111201 +50 50 50 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49
111202 +49 49 49 48 48 47 48 48 47 48 48 47 48 48 47 48 48 47
111203 +48 48 47 48 48 47 48 48 47 47 47 47 47 47 47 47 47 47
111204 +47 47 47 48 48 47 48 48 47 48 48 47 48 48 47 48 48 47
111205 +48 48 47 48 48 47 48 48 47 48 48 47 48 48 47 48 48 47
111206 +48 48 47 48 48 47 48 48 47 48 48 47 49 49 49 49 49 49
111207 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111208 +49 49 49 50 50 50 50 50 50 50 50 50 49 49 49 49 49 49
111209 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111210 +48 48 47 48 48 47 48 48 47 48 48 47 48 48 47 48 48 47
111211 +48 48 47 48 48 47 48 48 47 48 48 47 49 49 49 49 49 49
111212 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111213 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
111214 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50
111215 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111216 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111217 +49 49 49 49 49 49 49 49 49 49 49 49 48 48 47 48 48 47
111218 +47 47 47 46 46 46 45 45 45 43 43 43 43 43 43 42 42 42
111219 +41 41 41 38 38 38 37 37 37 35 35 35 33 33 33 30 30 30
111220 +30 30 30 27 27 27 26 26 26 24 24 24 22 22 22 20 20 20
111221 +18 18 18 16 16 16 14 14 14 12 12 12 10 10 10 9 9 9
111222 +7 7 7 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1
111223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
111253 +2 2 2 3 3 3 5 5 5 6 6 6 8 8 8 10 10 10
111254 +11 11 11 13 13 13 15 14 14 17 17 17 19 19 19 21 21 21
111255 +24 24 24 25 25 25 27 27 27 30 30 30 30 30 30 33 33 33
111256 +35 35 35 37 37 37 39 39 39 41 41 41 42 42 42 43 43 43
111257 +45 45 45 47 47 47 48 48 47 66 66 66 140 134 120 140 134 120
111258 +192 187 164 200 196 176 231 230 220 230 228 210 230 228 210 230 228 210
111259 +230 228 210 192 187 164 192 187 164 140 134 120 138 129 110 65 65 65
111260 +50 50 50 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111261 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111262 +52 52 52 52 52 52 135 101 60 140 134 120 140 134 120 140 134 120
111263 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111264 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 66 66 66
111265 +52 52 52 52 52 52 50 50 50 50 50 50 50 50 50 50 50 50
111266 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111267 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111268 +50 50 50 66 66 66 138 129 110 140 134 120 140 134 120 192 187 164
111269 +192 187 164 192 187 164 192 187 164 176 168 138 140 134 120 140 134 120
111270 +66 66 66 65 65 65 50 50 50 52 52 52 52 52 52 52 52 52
111271 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111272 +52 52 52 52 52 52 63 58 50 138 129 110 140 134 120 140 134 120
111273 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111274 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111275 +138 129 110 66 66 66 52 52 52 52 52 52 52 52 52 52 52 52
111276 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111277 +52 52 52 52 52 52 52 52 52 52 52 52 138 129 110 140 134 120
111278 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111279 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111280 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111281 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111282 +140 134 120 140 134 120 140 134 120 140 134 120 138 129 110 52 52 52
111283 +52 52 52 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111284 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111285 +50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
111286 +66 66 66 140 134 120 176 168 138 192 187 164 200 196 176 231 230 220
111287 +230 228 210 230 228 210 230 228 210 230 228 210 185 178 149 176 168 138
111288 +140 134 120 138 129 110 45 45 45 52 52 52 52 52 52 52 52 52
111289 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111290 +52 52 52 52 52 52 140 134 120 140 134 120 140 134 120 140 134 120
111291 +140 134 120 140 134 120 66 66 66 65 65 65 50 50 50 52 52 52
111292 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111293 +52 52 52 52 52 52 66 66 66 140 134 120 140 134 120 140 134 120
111294 +140 134 120 140 134 120 140 134 120 140 134 120 66 66 66 52 52 52
111295 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111296 +65 65 65 138 129 110 140 134 120 192 187 164 192 187 164 231 229 217
111297 +230 228 210 230 228 210 230 228 210 230 228 210 200 196 176 192 187 164
111298 +140 134 120 140 134 120 66 66 66 50 50 50 45 45 45 43 43 43
111299 +42 42 42 41 41 41 39 39 39 37 37 37 35 35 35 33 33 33
111300 +30 30 30 30 30 30 27 27 27 25 25 25 24 24 24 21 21 21
111301 +19 19 19 17 17 17 15 14 14 13 13 13 11 11 11 10 10 10
111302 +8 8 8 6 6 6 5 5 5 3 3 3 2 2 2 1 1 1
111303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111332 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
111333 +3 3 3 4 4 4 5 5 5 7 7 7 9 9 9 10 10 10
111334 +12 12 12 14 14 14 16 16 16 18 18 18 20 20 20 24 24 24
111335 +25 25 25 27 27 27 30 30 30 30 30 30 33 33 33 35 35 35
111336 +37 37 37 39 39 39 41 41 41 43 43 43 45 45 45 46 46 46
111337 +66 66 66 140 134 120 231 230 220 255 255 255 255 255 255 255 255 255
111338 +249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 238 238 238
111339 +249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249
111340 +200 196 176 140 134 120 52 52 52 52 52 52 52 52 52 52 52 52
111341 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 65 65 65
111342 +66 66 66 231 230 220 249 249 249 249 249 249 249 249 249 249 249 249
111343 +255 255 255 249 249 249 255 255 255 249 249 249 255 255 255 249 249 249
111344 +255 255 255 249 249 249 255 255 255 249 249 249 255 255 255 255 255 255
111345 +238 238 238 192 187 164 66 66 66 52 52 52 52 52 52 52 52 52
111346 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111347 +52 52 52 52 52 52 52 52 52 65 65 65 66 66 66 185 178 149
111348 +238 238 238 255 255 255 249 249 249 249 249 249 255 255 255 249 249 249
111349 +249 249 249 238 238 238 249 249 249 249 249 249 249 249 249 255 255 255
111350 +255 255 255 238 238 238 200 196 176 138 129 110 52 52 52 52 52 52
111351 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111352 +52 52 52 140 134 120 249 249 249 249 249 249 249 249 249 249 249 249
111353 +255 255 255 249 249 249 255 255 255 249 249 249 255 255 255 249 249 249
111354 +255 255 255 249 249 249 255 255 255 249 249 249 255 255 255 249 249 249
111355 +249 249 249 255 255 255 238 238 238 192 187 164 66 66 66 52 52 52
111356 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111357 +52 52 52 52 52 52 138 129 110 238 238 238 249 249 249 249 249 249
111358 +249 249 249 249 249 249 255 255 255 249 249 249 255 255 255 249 249 249
111359 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111360 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111361 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
111362 +255 255 255 255 255 255 249 249 249 249 249 249 249 249 249 249 249 249
111363 +231 230 220 140 134 120 65 65 65 52 52 52 52 52 52 52 52 52
111364 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111365 +52 52 52 52 52 52 65 65 65 66 66 66 185 178 149 238 238 238
111366 +255 255 255 255 255 255 249 249 249 249 249 249 249 249 249 249 249 249
111367 +249 249 249 249 249 249 238 238 238 249 249 249 249 249 249 249 249 249
111368 +249 249 249 249 249 249 238 238 238 192 187 164 138 129 110 52 52 52
111369 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111370 +52 52 52 52 52 52 238 238 238 255 255 255 249 249 249 255 255 255
111371 +255 255 255 255 255 255 140 134 120 52 52 52 52 52 52 52 52 52
111372 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111373 +52 52 52 52 52 52 230 228 210 255 255 255 255 255 255 255 255 255
111374 +249 249 249 255 255 255 249 249 249 176 168 138 52 52 52 65 65 65
111375 +52 52 52 52 52 52 52 52 52 52 52 52 140 134 120 200 196 176
111376 +249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249
111377 +249 249 249 238 238 238 249 249 249 249 249 249 249 249 249 249 249 249
111378 +255 255 255 249 249 249 255 255 255 238 238 238 140 134 120 63 58 50
111379 +45 45 45 43 43 43 41 41 41 39 39 39 37 37 37 35 35 35
111380 +33 33 33 30 30 30 30 30 30 27 27 27 25 25 25 24 24 24
111381 +20 20 20 18 18 18 16 16 16 14 14 14 12 12 12 10 10 10
111382 +9 9 9 7 7 7 5 5 5 4 4 4 3 3 3 1 1 1
111383 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111412 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2
111413 +3 3 3 4 4 4 6 6 6 8 8 8 9 9 9 11 11 11
111414 +13 13 13 16 16 16 17 17 17 20 20 20 21 21 21 24 24 24
111415 +26 26 26 28 28 28 30 30 30 32 32 32 35 35 35 37 37 37
111416 +39 39 39 41 41 41 43 43 43 45 45 45 47 47 47 138 129 110
111417 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111418 +255 255 255 255 255 255 255 255 255 249 249 249 255 255 255 255 255 255
111419 +249 249 249 255 255 255 255 255 255 249 249 249 255 255 255 255 255 255
111420 +255 255 255 249 249 249 231 229 217 66 66 66 65 65 65 52 52 52
111421 +63 58 50 52 52 52 65 65 65 52 52 52 52 52 52 66 66 66
111422 +249 249 249 255 255 255 249 249 249 255 255 255 255 255 255 255 255 255
111423 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111424 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111425 +255 255 255 255 255 255 255 255 255 185 178 149 65 65 65 52 52 52
111426 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111427 +52 52 52 52 52 52 66 66 66 192 187 164 255 255 255 255 255 255
111428 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111429 +255 255 255 255 255 255 255 255 255 249 249 249 255 255 255 255 255 255
111430 +255 255 255 255 255 255 255 255 255 249 249 249 230 228 210 66 66 66
111431 +65 65 65 52 52 52 65 65 65 52 52 52 63 58 50 52 52 52
111432 +66 66 66 255 255 255 249 249 249 255 255 255 255 255 255 255 255 255
111433 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111434 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111435 +255 255 255 255 255 255 255 255 255 249 249 249 249 249 249 140 134 120
111436 +65 65 65 52 52 52 65 65 65 52 52 52 63 58 50 52 52 52
111437 +65 65 65 66 66 66 255 255 255 255 255 255 255 255 255 255 255 255
111438 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111439 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111440 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111441 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111442 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111443 +249 249 249 255 255 255 238 238 238 66 66 66 66 66 66 52 52 52
111444 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
111445 +52 52 52 63 58 50 176 168 138 249 249 249 255 255 255 255 255 255
111446 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111447 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 255 255 255
111448 +249 249 249 255 255 255 249 249 249 249 249 249 249 249 249 200 196 176
111449 +66 66 66 65 65 65 52 52 52 65 65 65 52 52 52 63 58 50
111450 +52 52 52 65 65 65 238 238 238 255 255 255 255 255 255 255 255 255
111451 +255 255 255 255 255 255 140 134 120 65 65 65 52 52 52 65 65 65
111452 +52 52 52 63 58 50 52 52 52 65 65 65 52 52 52 63 58 50
111453 +65 65 65 200 196 176 255 255 255 249 249 249 255 255 255 255 255 255
111454 +255 255 255 255 255 255 192 187 164 52 52 52 65 65 65 52 52 52
111455 +65 65 65 52 52 52 66 66 66 238 238 238 249 249 249 255 255 255
111456 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 255 255 255
111457 +249 249 249 255 255 255 255 255 255 249 249 249 255 255 255 255 255 255
111458 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238
111459 +138 129 110 43 43 43 43 43 43 41 41 41 39 39 39 37 37 37
111460 +35 35 35 32 32 32 30 30 30 28 28 28 26 26 26 24 24 24
111461 +21 21 21 20 20 20 17 17 17 16 16 16 13 13 13 11 11 11
111462 +9 9 9 8 8 8 6 6 6 4 4 4 3 3 3 2 2 2
111463 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111492 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2
111493 +3 3 3 5 5 5 6 6 6 8 8 8 10 10 10 12 12 12
111494 +14 14 14 16 16 16 18 18 18 20 20 20 24 24 24 25 25 25
111495 +27 27 27 30 30 30 32 32 32 35 35 35 35 35 35 39 39 39
111496 +41 41 41 43 43 43 46 46 46 43 43 43 176 168 138 249 249 249
111497 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111498 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111499 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111500 +255 255 255 255 255 255 255 255 255 238 238 238 138 129 110 65 65 65
111501 +52 52 52 65 65 65 52 52 52 65 65 65 65 65 65 163 154 123
111502 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111503 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111504 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111505 +255 255 255 255 255 255 249 249 249 249 249 249 230 228 210 66 66 66
111506 +52 52 52 65 65 65 52 52 52 65 65 65 52 52 52 65 65 65
111507 +65 65 65 66 66 66 231 230 220 255 255 255 255 255 255 255 255 255
111508 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111509 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111510 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 255 255 255
111511 +66 66 66 52 52 52 65 65 65 52 52 52 65 65 65 65 65 65
111512 +185 178 149 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111513 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111514 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111515 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111516 +163 154 123 52 52 52 65 65 65 52 52 52 65 65 65 52 52 52
111517 +65 65 65 200 196 176 255 255 255 255 255 255 255 255 255 255 255 255
111518 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111519 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111520 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111521 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111522 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111523 +255 255 255 255 255 255 255 255 255 255 255 255 66 66 66 65 65 65
111524 +52 52 52 65 65 65 63 58 50 65 65 65 52 52 52 65 65 65
111525 +66 66 66 200 196 176 249 249 249 255 255 255 255 255 255 255 255 255
111526 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111527 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111528 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 249 249 249
111529 +231 230 220 66 66 66 52 52 52 65 65 65 52 52 52 65 65 65
111530 +52 52 52 65 65 65 238 238 238 255 255 255 255 255 255 255 255 255
111531 +255 255 255 255 255 255 140 134 120 52 52 52 65 65 65 52 52 52
111532 +65 65 65 52 52 52 65 65 65 52 52 52 65 65 65 52 52 52
111533 +200 196 176 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111534 +249 249 249 200 196 176 65 65 65 52 52 52 65 65 65 52 52 52
111535 +49 49 49 138 129 110 255 255 255 255 255 255 255 255 255 255 255 255
111536 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111537 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111538 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111539 +249 249 249 163 154 123 45 45 45 43 43 43 41 41 41 39 39 39
111540 +35 35 35 35 35 35 32 32 32 30 30 30 27 27 27 25 25 25
111541 +24 24 24 20 20 20 18 18 18 16 16 16 14 14 14 12 12 12
111542 +10 10 10 8 8 8 6 6 6 5 5 5 3 3 3 2 2 2
111543 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111572 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 3
111573 +4 4 4 5 5 5 7 7 7 9 9 9 11 11 11 13 13 13
111574 +15 14 14 17 17 17 19 19 19 21 21 21 24 24 24 26 26 26
111575 +28 28 28 30 30 30 33 33 33 35 35 35 38 38 38 41 41 41
111576 +43 43 43 45 45 45 47 47 47 140 134 120 249 249 249 249 249 249
111577 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111578 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111579 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111580 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 66 66 66
111581 +65 65 65 65 65 65 52 52 52 65 65 65 52 52 52 200 196 176
111582 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111583 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111584 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111585 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
111586 +65 65 65 52 52 52 65 65 65 52 52 52 65 65 65 52 52 52
111587 +65 65 65 231 230 220 255 255 255 255 255 255 255 255 255 255 255 255
111588 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111589 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111590 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111591 +238 238 238 66 66 66 66 66 66 65 65 65 52 52 52 65 65 65
111592 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
111593 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111594 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111595 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111596 +255 255 255 138 129 110 50 50 50 65 65 65 65 65 65 65 65 65
111597 +52 52 52 231 230 220 255 255 255 255 255 255 255 255 255 255 255 255
111598 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111599 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111600 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111601 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111602 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111603 +255 255 255 255 255 255 255 255 255 255 255 255 231 229 217 65 65 65
111604 +52 52 52 65 65 65 52 52 52 65 65 65 52 52 52 65 65 65
111605 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
111606 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111607 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111608 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111609 +255 255 255 230 228 210 65 65 65 65 65 65 65 65 65 52 52 52
111610 +65 65 65 52 52 52 249 249 249 255 255 255 255 255 255 255 255 255
111611 +255 255 255 255 255 255 140 134 120 66 66 66 65 65 65 52 52 52
111612 +65 65 65 65 65 65 52 52 52 65 65 65 65 65 65 192 187 164
111613 +249 249 249 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
111614 +200 196 176 66 66 66 65 65 65 65 65 65 65 65 65 65 65 65
111615 +66 66 66 238 238 238 249 249 249 255 255 255 255 255 255 255 255 255
111616 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111617 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111618 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111619 +255 255 255 249 249 249 138 129 110 43 43 43 43 43 43 41 41 41
111620 +38 38 38 35 35 35 33 33 33 30 30 30 28 28 28 26 26 26
111621 +24 24 24 21 21 21 19 19 19 17 17 17 15 14 14 13 13 13
111622 +11 11 11 9 9 9 7 7 7 5 5 5 4 4 4 3 3 3
111623 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111652 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3
111653 +4 4 4 6 6 6 8 8 8 9 9 9 11 11 11 13 13 13
111654 +16 16 16 18 18 18 20 20 20 22 22 22 25 25 25 27 27 27
111655 +30 30 30 32 32 32 35 35 35 37 37 37 39 39 39 42 42 42
111656 +43 43 43 45 45 45 65 65 65 238 238 238 255 255 255 255 255 255
111657 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238
111658 +185 178 149 140 134 120 138 129 110 66 66 66 138 129 110 66 66 66
111659 +138 129 110 140 134 120 200 196 176 249 249 249 255 255 255 255 255 255
111660 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 196 176
111661 +52 52 52 65 65 65 65 65 65 65 65 65 66 66 66 200 196 176
111662 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
111663 +200 196 176 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111664 +140 134 120 140 134 120 192 187 164 231 230 220 255 255 255 255 255 255
111665 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
111666 +140 134 120 52 52 52 65 65 65 65 65 65 52 52 52 65 65 65
111667 +176 168 138 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111668 +255 255 255 249 249 249 249 249 249 200 196 176 176 168 138 140 134 120
111669 +140 134 120 140 134 120 140 134 120 176 168 138 230 228 210 255 255 255
111670 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111671 +255 255 255 192 187 164 65 65 65 65 65 65 65 65 65 52 52 52
111672 +200 196 176 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111673 +249 249 249 192 187 164 140 134 120 140 134 120 140 134 120 140 134 120
111674 +140 134 120 140 134 120 140 134 120 176 168 138 200 196 176 238 238 238
111675 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111676 +249 249 249 200 196 176 65 65 65 65 65 65 52 52 52 65 65 65
111677 +65 65 65 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
111678 +255 255 255 238 238 238 185 178 149 140 134 120 140 134 120 140 134 120
111679 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111680 +230 227 205 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111681 +238 238 238 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
111682 +140 134 120 140 134 120 200 196 176 238 238 238 255 255 255 255 255 255
111683 +255 255 255 255 255 255 255 255 255 249 249 249 249 249 249 138 129 110
111684 +65 65 65 52 52 52 65 65 65 65 65 65 52 52 52 138 129 110
111685 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111686 +255 255 255 249 249 249 231 230 220 176 168 138 140 134 120 138 129 110
111687 +66 66 66 138 129 110 66 66 66 138 129 110 176 168 138 200 196 176
111688 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111689 +249 249 249 255 255 255 140 134 120 52 52 52 65 65 65 65 65 65
111690 +65 65 65 65 65 65 238 238 238 255 255 255 255 255 255 255 255 255
111691 +255 255 255 255 255 255 140 134 120 65 65 65 65 65 65 65 65 65
111692 +65 65 65 65 65 65 65 65 65 66 66 66 140 134 120 249 249 249
111693 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 231 230 220
111694 +66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 66 66 66
111695 +200 196 176 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111696 +255 255 255 255 255 255 249 249 249 200 196 176 140 134 120 140 134 120
111697 +66 66 66 138 129 110 66 66 66 138 129 110 140 134 120 185 178 149
111698 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111699 +255 255 255 249 249 249 238 238 238 65 65 65 43 43 43 42 42 42
111700 +39 39 39 37 37 37 35 35 35 32 32 32 30 30 30 27 27 27
111701 +25 25 25 22 22 22 20 20 20 18 18 18 16 16 16 13 13 13
111702 +11 11 11 9 9 9 8 8 8 6 6 6 4 4 4 3 3 3
111703 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
111704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111732 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3
111733 +5 5 5 6 6 6 8 8 8 10 10 10 12 12 12 14 14 14
111734 +16 16 16 18 18 18 21 21 21 24 24 24 26 26 26 28 28 28
111735 +30 30 30 33 33 33 35 35 35 38 38 38 41 41 41 43 43 43
111736 +45 45 45 48 48 47 176 168 138 249 249 249 255 255 255 255 255 255
111737 +255 255 255 255 255 255 255 255 255 255 255 255 163 154 123 66 66 66
111738 +65 65 65 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66
111739 +66 66 66 65 65 65 65 65 65 66 66 66 230 228 210 249 249 249
111740 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111741 +138 129 110 52 52 52 65 65 65 65 65 65 65 65 65 200 196 176
111742 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 196 176
111743 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111744 +66 66 66 66 66 66 66 66 66 65 65 65 140 134 120 238 238 238
111745 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111746 +238 238 238 65 65 65 65 65 65 65 65 65 65 65 65 66 66 66
111747 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111748 +255 255 255 200 196 176 66 66 66 66 66 66 65 65 65 66 66 66
111749 +66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 66 66 66
111750 +231 230 220 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111751 +255 255 255 238 238 238 66 66 66 65 65 65 65 65 65 65 65 65
111752 +200 196 176 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
111753 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111754 +66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 66 66 66
111755 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
111756 +255 255 255 255 255 255 66 66 66 66 66 66 66 66 66 65 65 65
111757 +65 65 65 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
111758 +255 255 255 176 168 138 65 65 65 66 66 66 66 66 66 66 66 66
111759 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111760 +192 187 164 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
111761 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111762 +66 66 66 66 66 66 66 66 66 66 66 66 230 228 210 249 249 249
111763 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 192 187 164
111764 +65 65 65 65 65 65 65 65 65 52 52 52 65 65 65 200 196 176
111765 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111766 +238 238 238 138 129 110 65 65 65 52 52 52 65 65 65 65 65 65
111767 +66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 66 66 66
111768 +138 129 110 231 230 220 249 249 249 255 255 255 255 255 255 255 255 255
111769 +255 255 255 255 255 255 238 238 238 66 66 66 66 66 66 65 65 65
111770 +65 65 65 65 65 65 249 249 249 255 255 255 255 255 255 255 255 255
111771 +255 255 255 255 255 255 140 134 120 66 66 66 65 65 65 65 65 65
111772 +52 52 52 65 65 65 65 65 65 140 134 120 255 255 255 255 255 255
111773 +255 255 255 255 255 255 255 255 255 255 255 255 231 230 220 66 66 66
111774 +66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 138 129 110
111775 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111776 +255 255 255 200 196 176 66 66 66 66 66 66 66 66 66 65 65 65
111777 +66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65
111778 +66 66 66 176 168 138 249 249 249 255 255 255 255 255 255 255 255 255
111779 +255 255 255 255 255 255 255 255 255 163 154 123 47 47 47 43 43 43
111780 +41 41 41 38 38 38 35 35 35 33 33 33 30 30 30 28 28 28
111781 +26 26 26 24 24 24 21 21 21 18 18 18 16 16 16 14 14 14
111782 +12 12 12 10 10 10 8 8 8 6 6 6 5 5 5 3 3 3
111783 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
111784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111812 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3
111813 +5 5 5 7 7 7 9 9 9 10 10 10 13 13 13 15 14 14
111814 +17 17 17 19 19 19 21 21 21 24 24 24 26 26 26 30 30 30
111815 +32 32 32 35 35 35 37 37 37 39 39 39 42 42 42 43 43 43
111816 +47 47 47 47 47 47 238 238 238 255 255 255 255 255 255 255 255 255
111817 +255 255 255 255 255 255 249 249 249 140 134 120 66 66 66 66 66 66
111818 +65 65 65 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66
111819 +66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 200 196 176
111820 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 249 249 249
111821 +192 187 164 65 65 65 65 65 65 65 65 65 66 66 66 200 196 176
111822 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
111823 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111824 +66 66 66 66 66 66 65 65 65 65 65 65 66 66 66 66 66 66
111825 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
111826 +249 249 249 138 129 110 52 52 52 65 65 65 65 65 65 140 134 120
111827 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
111828 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111829 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111830 +66 66 66 231 230 220 255 255 255 255 255 255 255 255 255 255 255 255
111831 +255 255 255 249 249 249 140 134 120 65 65 65 65 65 65 52 52 52
111832 +200 196 176 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
111833 +231 229 217 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111834 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
111835 +65 65 65 200 196 176 255 255 255 255 255 255 255 255 255 255 255 255
111836 +255 255 255 255 255 255 176 168 138 66 66 66 65 65 65 65 65 65
111837 +65 65 65 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
111838 +249 249 249 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
111839 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
111840 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
111841 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111842 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 238 238 238
111843 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 238 238 238
111844 +52 52 52 65 65 65 66 66 66 66 66 66 66 66 66 255 255 255
111845 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111846 +66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
111847 +66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65
111848 +65 65 65 66 66 66 231 230 220 255 255 255 255 255 255 255 255 255
111849 +255 255 255 255 255 255 255 255 255 140 134 120 65 65 65 65 65 65
111850 +65 65 65 65 65 65 238 238 238 255 255 255 255 255 255 255 255 255
111851 +255 255 255 255 255 255 140 134 120 66 66 66 65 65 65 65 65 65
111852 +65 65 65 65 65 65 140 134 120 255 255 255 255 255 255 255 255 255
111853 +255 255 255 255 255 255 255 255 255 238 238 238 66 66 66 66 66 66
111854 +65 65 65 65 65 65 65 65 65 65 65 65 52 52 52 192 187 164
111855 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111856 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111857 +66 66 66 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
111858 +65 65 65 66 66 66 140 134 120 255 255 255 255 255 255 255 255 255
111859 +255 255 255 255 255 255 249 249 249 238 238 238 50 50 50 43 43 43
111860 +42 42 42 39 39 39 37 37 37 35 35 35 32 32 32 30 30 30
111861 +26 26 26 24 24 24 21 21 21 19 19 19 17 17 17 15 14 14
111862 +13 13 13 10 10 10 9 9 9 7 7 7 5 5 5 3 3 3
111863 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
111864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111892 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 4 4 4
111893 +5 5 5 7 7 7 9 9 9 11 11 11 13 13 13 16 16 16
111894 +17 17 17 20 20 20 22 22 22 25 25 25 27 27 27 30 30 30
111895 +32 32 32 35 35 35 38 38 38 41 41 41 43 43 43 45 45 45
111896 +49 49 49 138 129 110 238 238 238 249 249 249 255 255 255 255 255 255
111897 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
111898 +66 66 66 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
111899 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111900 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111901 +238 238 238 65 65 65 65 65 65 65 65 65 65 65 65 200 196 176
111902 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 196 176
111903 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111904 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111905 +140 134 120 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111906 +255 255 255 185 178 149 65 65 65 65 65 65 65 65 65 192 187 164
111907 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
111908 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111909 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111910 +66 66 66 140 134 120 249 249 249 255 255 255 255 255 255 255 255 255
111911 +255 255 255 255 255 255 176 168 138 65 65 65 65 65 65 66 66 66
111912 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
111913 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111914 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111915 +65 65 65 138 129 110 238 238 238 255 255 255 255 255 255 255 255 255
111916 +255 255 255 255 255 255 192 187 164 65 65 65 65 65 65 65 65 65
111917 +65 65 65 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
111918 +249 249 249 176 168 138 65 65 65 66 66 66 66 66 66 66 66 66
111919 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111920 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
111921 +231 230 220 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
111922 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 185 178 149
111923 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111924 +66 66 66 66 66 66 65 65 65 66 66 66 185 178 149 255 255 255
111925 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 163 154 123
111926 +66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 65 65 65
111927 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
111928 +65 65 65 66 66 66 138 129 110 249 249 249 255 255 255 255 255 255
111929 +255 255 255 255 255 255 255 255 255 200 196 176 65 65 65 65 65 65
111930 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
111931 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 66 66 66
111932 +65 65 65 138 129 110 238 238 238 249 249 249 255 255 255 255 255 255
111933 +255 255 255 255 255 255 238 238 238 66 66 66 66 66 66 66 66 66
111934 +66 66 66 66 66 66 65 65 65 65 65 65 65 65 65 238 238 238
111935 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238
111936 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111937 +66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65
111938 +65 65 65 65 65 65 66 66 66 200 196 176 255 255 255 255 255 255
111939 +255 255 255 255 255 255 255 255 255 255 255 255 66 66 66 52 52 52
111940 +45 45 45 41 41 41 38 38 38 35 35 35 32 32 32 30 30 30
111941 +27 27 27 25 25 25 22 22 22 20 20 20 17 17 17 15 14 14
111942 +13 13 13 11 11 11 9 9 9 7 7 7 5 5 5 4 4 4
111943 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
111944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111972 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 3 4 4 4
111973 +5 5 5 7 7 7 9 9 9 11 11 11 13 13 13 16 16 16
111974 +18 18 18 20 20 20 24 24 24 25 25 25 28 28 28 30 30 30
111975 +33 33 33 35 35 35 39 39 39 41 41 41 43 43 43 46 46 46
111976 +47 47 47 140 134 120 255 255 255 255 255 255 255 255 255 255 255 255
111977 +255 255 255 249 249 249 140 134 120 66 66 66 66 66 66 66 66 66
111978 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111979 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111980 +185 178 149 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
111981 +255 255 255 66 66 66 66 66 66 66 66 66 66 66 66 200 196 176
111982 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
111983 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111984 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111985 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
111986 +249 249 249 200 196 176 65 65 65 65 65 65 52 52 52 230 228 210
111987 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 230 228 210
111988 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111989 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111990 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
111991 +255 255 255 249 249 249 192 187 164 65 65 65 65 65 65 65 65 65
111992 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
111993 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111994 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
111995 +65 65 65 52 52 52 238 238 238 255 255 255 255 255 255 255 255 255
111996 +255 255 255 249 249 249 200 196 176 66 66 66 65 65 65 66 66 66
111997 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
111998 +249 249 249 140 134 120 66 66 66 66 66 66 66 66 66 66 66 66
111999 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112000 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112001 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112002 +66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 140 134 120
112003 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112004 +66 66 66 66 66 66 66 66 66 66 66 66 200 196 176 255 255 255
112005 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 66 66 66
112006 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112007 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112008 +66 66 66 66 66 66 52 52 52 230 228 210 255 255 255 255 255 255
112009 +255 255 255 255 255 255 249 249 249 238 238 238 66 66 66 66 66 66
112010 +66 66 66 66 66 66 238 238 238 255 255 255 255 255 255 255 255 255
112011 +255 255 255 249 249 249 176 168 138 66 66 66 66 66 66 66 66 66
112012 +66 66 66 238 238 238 249 249 249 255 255 255 255 255 255 255 255 255
112013 +255 255 255 238 238 238 138 129 110 66 66 66 66 66 66 66 66 66
112014 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 249 249 249
112015 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 192 187 164
112016 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112017 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112018 +66 66 66 66 66 66 52 52 52 138 129 110 255 255 255 255 255 255
112019 +255 255 255 255 255 255 255 255 255 255 255 255 176 168 138 49 49 49
112020 +45 45 45 41 41 41 38 38 38 35 35 35 33 33 33 30 30 30
112021 +28 28 28 25 25 25 24 24 24 20 20 20 18 18 18 16 16 16
112022 +13 13 13 11 11 11 9 9 9 7 7 7 5 5 5 4 4 4
112023 +3 3 3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
112024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112052 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 3 4 4 4
112053 +6 6 6 8 8 8 10 10 10 12 12 12 14 14 14 16 16 16
112054 +18 18 18 21 21 21 24 24 24 26 26 26 28 28 28 30 30 30
112055 +35 35 35 37 37 37 39 39 39 42 42 42 45 45 45 47 47 47
112056 +52 52 52 200 196 176 249 249 249 255 255 255 255 255 255 255 255 255
112057 +255 255 255 249 249 249 66 66 66 65 65 65 66 66 66 66 66 66
112058 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112059 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112060 +138 129 110 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112061 +255 255 255 140 134 120 66 66 66 66 66 66 66 66 66 231 229 217
112062 +249 249 249 249 249 249 255 255 255 255 255 255 255 255 255 200 196 176
112063 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112064 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112065 +66 66 66 231 229 217 249 249 249 255 255 255 255 255 255 255 255 255
112066 +255 255 255 238 238 238 66 66 66 66 66 66 66 66 66 238 238 238
112067 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 192 187 164
112068 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112069 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112070 +66 66 66 66 66 66 238 238 238 255 255 255 255 255 255 255 255 255
112071 +255 255 255 249 249 249 200 196 176 66 66 66 66 66 66 65 65 65
112072 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112073 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112074 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112075 +66 66 66 66 66 66 200 196 176 255 255 255 255 255 255 255 255 255
112076 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
112077 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112078 +255 255 255 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
112079 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112080 +192 187 164 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
112081 +231 230 220 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112082 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
112083 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112084 +138 129 110 65 65 65 66 66 66 66 66 66 238 238 238 255 255 255
112085 +255 255 255 255 255 255 255 255 255 255 255 255 230 228 210 65 65 65
112086 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112087 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112088 +66 66 66 66 66 66 66 66 66 176 168 138 249 249 249 255 255 255
112089 +255 255 255 255 255 255 255 255 255 255 255 255 66 66 66 66 66 66
112090 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
112091 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 66 66 66
112092 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112093 +249 249 249 138 129 110 50 50 50 66 66 66 66 66 66 66 66 66
112094 +66 66 66 66 66 66 66 66 66 66 66 66 140 134 120 255 255 255
112095 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 140 134 120
112096 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112097 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112098 +66 66 66 66 66 66 66 66 66 65 65 65 238 238 238 249 249 249
112099 +255 255 255 255 255 255 255 255 255 255 255 255 192 187 164 47 47 47
112100 +45 45 45 42 42 42 39 39 39 37 37 37 35 35 35 30 30 30
112101 +28 28 28 26 26 26 24 24 24 21 21 21 18 18 18 16 16 16
112102 +14 14 14 12 12 12 10 10 10 8 8 8 6 6 6 4 4 4
112103 +3 3 3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
112104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112132 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112133 +6 6 6 8 8 8 10 10 10 12 12 12 14 14 14 16 16 16
112134 +19 19 19 21 21 21 24 24 24 26 26 26 30 30 30 32 32 32
112135 +35 35 35 37 37 37 41 41 41 43 43 43 45 45 45 47 47 47
112136 +45 45 45 231 229 217 255 255 255 255 255 255 255 255 255 255 255 255
112137 +249 249 249 231 230 220 66 66 66 66 66 66 66 66 66 66 66 66
112138 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112139 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112140 +66 66 66 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112141 +249 249 249 185 178 149 66 66 66 66 66 66 65 65 65 200 196 176
112142 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112143 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112144 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112145 +66 66 66 192 187 164 255 255 255 255 255 255 255 255 255 255 255 255
112146 +255 255 255 249 249 249 66 66 66 66 66 66 65 65 65 249 249 249
112147 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 185 178 149
112148 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112149 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112150 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
112151 +255 255 255 249 249 249 200 196 176 66 66 66 66 66 66 65 65 65
112152 +200 196 176 249 249 249 255 255 255 255 255 255 249 249 249 249 249 249
112153 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112154 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112155 +66 66 66 66 66 66 200 196 176 255 255 255 255 255 255 255 255 255
112156 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
112157 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 249 249 249
112158 +249 249 249 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
112159 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112160 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112161 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112162 +66 66 66 66 66 66 66 66 66 66 66 66 52 52 52 138 129 110
112163 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112164 +66 66 66 66 66 66 66 66 66 66 66 66 255 255 255 255 255 255
112165 +255 255 255 255 255 255 255 255 255 249 249 249 185 178 149 66 66 66
112166 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112167 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112168 +66 66 66 66 66 66 65 65 65 140 134 120 249 249 249 255 255 255
112169 +255 255 255 255 255 255 255 255 255 249 249 249 138 129 110 66 66 66
112170 +66 66 66 65 65 65 249 249 249 255 255 255 255 255 255 255 255 255
112171 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 231 229 217
112172 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238
112173 +138 129 110 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112174 +66 66 66 66 66 66 66 66 66 66 66 66 176 168 138 255 255 255
112175 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 66 66 66
112176 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112177 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112178 +66 66 66 66 66 66 66 66 66 66 66 66 200 196 176 255 255 255
112179 +255 255 255 255 255 255 255 255 255 249 249 249 231 230 220 49 49 49
112180 +45 45 45 43 43 43 41 41 41 37 37 37 35 35 35 32 32 32
112181 +30 30 30 26 26 26 24 24 24 21 21 21 19 19 19 16 16 16
112182 +14 14 14 12 12 12 10 10 10 8 8 8 6 6 6 4 4 4
112183 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112212 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112213 +6 6 6 8 8 8 10 10 10 12 12 12 14 14 14 17 17 17
112214 +19 19 19 21 21 21 24 24 24 27 27 27 30 30 30 32 32 32
112215 +35 35 35 38 38 38 41 41 41 43 43 43 46 46 46 49 49 49
112216 +50 50 50 238 238 238 249 249 249 255 255 255 255 255 255 255 255 255
112217 +255 255 255 200 196 176 65 65 65 66 66 66 66 66 66 66 66 66
112218 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112219 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112220 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112221 +255 255 255 192 187 164 66 66 66 66 66 66 66 66 66 200 196 176
112222 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112223 +65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112224 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112225 +66 66 66 192 187 164 249 249 249 255 255 255 255 255 255 255 255 255
112226 +255 255 255 255 255 255 66 66 66 66 66 66 66 66 66 255 255 255
112227 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 238 238 238
112228 +231 230 220 231 230 220 231 230 220 231 230 220 231 230 220 231 230 220
112229 +231 230 220 231 230 220 231 230 220 231 230 220 231 230 220 231 230 220
112230 +231 230 220 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112231 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
112232 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112233 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112234 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112235 +66 66 66 66 66 66 200 196 176 249 249 249 255 255 255 255 255 255
112236 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
112237 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112238 +249 249 249 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
112239 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112240 +192 187 164 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
112241 +231 230 220 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112242 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
112243 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112244 +138 129 110 65 65 65 66 66 66 138 129 110 249 249 249 249 249 249
112245 +255 255 255 255 255 255 255 255 255 249 249 249 140 134 120 66 66 66
112246 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112247 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112248 +66 66 66 66 66 66 65 65 65 138 129 110 238 238 238 255 255 255
112249 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 65 65 65
112250 +66 66 66 66 66 66 238 238 238 255 255 255 255 255 255 255 255 255
112251 +255 255 255 255 255 255 140 134 120 66 66 66 140 134 120 249 249 249
112252 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 140 134 120
112253 +65 65 65 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66
112254 +66 66 66 66 66 66 66 66 66 66 66 66 192 187 164 249 249 249
112255 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 66 66 66
112256 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112257 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112258 +66 66 66 66 66 66 66 66 66 66 66 66 200 196 176 249 249 249
112259 +255 255 255 255 255 255 255 255 255 249 249 249 238 238 238 43 43 43
112260 +46 46 46 43 43 43 41 41 41 38 38 38 35 35 35 32 32 32
112261 +30 30 30 27 27 27 24 24 24 21 21 21 19 19 19 17 17 17
112262 +14 14 14 12 12 12 10 10 10 8 8 8 6 6 6 4 4 4
112263 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112292 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112293 +6 6 6 8 8 8 10 10 10 12 12 12 15 14 14 17 17 17
112294 +19 19 19 22 22 22 25 25 25 27 27 27 30 30 30 32 32 32
112295 +35 35 35 38 38 38 41 41 41 43 43 43 46 46 46 49 49 49
112296 +50 50 50 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112297 +249 249 249 192 187 164 66 66 66 66 66 66 66 66 66 66 66 66
112298 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112299 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112300 +65 65 65 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112301 +249 249 249 200 196 176 66 66 66 66 66 66 66 66 66 200 196 176
112302 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112303 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112304 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112305 +65 65 65 176 168 138 249 249 249 255 255 255 255 255 255 255 255 255
112306 +255 255 255 255 255 255 66 66 66 66 66 66 66 66 66 255 255 255
112307 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
112308 +249 249 249 238 238 238 249 249 249 238 238 238 249 249 249 238 238 238
112309 +249 249 249 238 238 238 249 249 249 238 238 238 249 249 249 249 249 249
112310 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112311 +255 255 255 249 249 249 200 196 176 66 66 66 66 66 66 66 66 66
112312 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112313 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112314 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112315 +66 66 66 66 66 66 200 196 176 255 255 255 255 255 255 255 255 255
112316 +249 249 249 249 249 249 231 229 217 66 66 66 66 66 66 66 66 66
112317 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112318 +249 249 249 140 134 120 66 66 66 66 66 66 66 66 66 66 66 66
112319 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112320 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112321 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112322 +66 66 66 66 66 66 66 66 66 66 66 66 52 52 52 138 129 110
112323 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112324 +66 66 66 66 66 66 66 66 66 66 66 66 249 249 249 255 255 255
112325 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 66 66 66
112326 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112327 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112328 +66 66 66 66 66 66 66 66 66 66 66 66 249 249 249 255 255 255
112329 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 66 66 66
112330 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
112331 +255 255 255 255 255 255 140 134 120 66 66 66 192 187 164 255 255 255
112332 +255 255 255 255 255 255 255 255 255 249 249 249 231 230 220 66 66 66
112333 +65 65 65 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112334 +66 66 66 66 66 66 66 66 66 66 66 66 200 196 176 255 255 255
112335 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 66 66 66
112336 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112337 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112338 +66 66 66 66 66 66 66 66 66 65 65 65 192 187 164 255 255 255
112339 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 49 49 49
112340 +46 46 46 43 43 43 41 41 41 38 38 38 35 35 35 32 32 32
112341 +30 30 30 27 27 27 25 25 25 22 22 22 19 19 19 17 17 17
112342 +15 14 14 12 12 12 10 10 10 8 8 8 6 6 6 4 4 4
112343 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112372 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112373 +6 6 6 8 8 8 10 10 10 13 13 13 15 14 14 17 17 17
112374 +20 20 20 22 22 22 25 25 25 27 27 27 30 30 30 32 32 32
112375 +35 35 35 38 38 38 41 41 41 43 43 43 46 46 46 49 49 49
112376 +52 52 52 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112377 +255 255 255 192 187 164 65 65 65 66 66 66 66 66 66 66 66 66
112378 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112379 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112380 +66 66 66 238 238 238 249 249 249 255 255 255 255 255 255 255 255 255
112381 +249 249 249 200 196 176 66 66 66 66 66 66 66 66 66 231 230 220
112382 +238 238 238 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112383 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112384 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112385 +66 66 66 176 168 138 249 249 249 255 255 255 255 255 255 255 255 255
112386 +255 255 255 255 255 255 66 66 66 66 66 66 66 66 66 255 255 255
112387 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112388 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 255 255 255
112389 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 255 255 255
112390 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112391 +255 255 255 249 249 249 140 134 120 65 65 65 66 66 66 66 66 66
112392 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112393 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112394 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112395 +66 66 66 66 66 66 200 196 176 249 249 249 255 255 255 255 255 255
112396 +255 255 255 249 249 249 200 196 176 66 66 66 66 66 66 66 66 66
112397 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112398 +255 255 255 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
112399 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112400 +192 187 164 249 249 249 249 249 249 255 255 255 255 255 255 249 249 249
112401 +231 230 220 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112402 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
112403 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112404 +138 129 110 65 65 65 66 66 66 140 134 120 255 255 255 255 255 255
112405 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 66 66 66
112406 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112407 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112408 +66 66 66 66 66 66 66 66 66 66 66 66 255 255 255 255 255 255
112409 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 66 66 66
112410 +66 66 66 66 66 66 238 238 238 255 255 255 255 255 255 255 255 255
112411 +255 255 255 255 255 255 140 134 120 66 66 66 200 196 176 249 249 249
112412 +255 255 255 255 255 255 255 255 255 255 255 255 200 196 176 66 66 66
112413 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112414 +66 66 66 66 66 66 66 66 66 66 66 66 200 196 176 249 249 249
112415 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 66 66 66
112416 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112417 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112418 +66 66 66 66 66 66 66 66 66 65 65 65 192 187 164 249 249 249
112419 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 47 47 47
112420 +46 46 46 43 43 43 41 41 41 38 38 38 35 35 35 32 32 32
112421 +30 30 30 27 27 27 25 25 25 22 22 22 19 19 19 17 17 17
112422 +15 14 14 13 13 13 10 10 10 8 8 8 6 6 6 4 4 4
112423 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112452 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112453 +6 6 6 8 8 8 10 10 10 13 13 13 15 14 14 17 17 17
112454 +20 20 20 22 22 22 25 25 25 27 27 27 30 30 30 33 33 33
112455 +35 35 35 38 38 38 41 41 41 43 43 43 46 46 46 49 49 49
112456 +50 50 50 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
112457 +249 249 249 192 187 164 65 65 65 66 66 66 66 66 66 66 66 66
112458 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112459 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112460 +65 65 65 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112461 +249 249 249 200 196 176 66 66 66 66 66 66 66 66 66 200 196 176
112462 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112463 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112464 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112465 +66 66 66 140 134 120 249 249 249 255 255 255 255 255 255 255 255 255
112466 +255 255 255 249 249 249 138 129 110 66 66 66 66 66 66 255 255 255
112467 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112468 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112469 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112470 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112471 +255 255 255 200 196 176 65 65 65 65 65 65 66 66 66 65 65 65
112472 +200 196 176 249 249 249 255 255 255 255 255 255 249 249 249 249 249 249
112473 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112474 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112475 +66 66 66 65 65 65 200 196 176 255 255 255 255 255 255 255 255 255
112476 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
112477 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112478 +238 238 238 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
112479 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112480 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112481 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112482 +66 66 66 66 66 66 66 66 66 66 66 66 52 52 52 138 129 110
112483 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112484 +66 66 66 66 66 66 52 52 52 138 129 110 255 255 255 255 255 255
112485 +255 255 255 255 255 255 255 255 255 249 249 249 140 134 120 66 66 66
112486 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112487 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112488 +66 66 66 66 66 66 65 65 65 138 129 110 255 255 255 255 255 255
112489 +255 255 255 255 255 255 255 255 255 249 249 249 163 154 123 66 66 66
112490 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
112491 +255 255 255 255 255 255 140 134 120 66 66 66 192 187 164 255 255 255
112492 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 66 66 66
112493 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112494 +66 66 66 66 66 66 66 66 66 66 66 66 200 196 176 255 255 255
112495 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 66 66 66
112496 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112497 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112498 +66 66 66 66 66 66 65 65 65 65 65 65 192 187 164 249 249 249
112499 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 49 49 49
112500 +46 46 46 43 43 43 41 41 41 38 38 38 35 35 35 32 32 32
112501 +30 30 30 27 27 27 25 25 25 22 22 22 20 20 20 17 17 17
112502 +15 14 14 13 13 13 10 10 10 8 8 8 6 6 6 4 4 4
112503 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112532 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112533 +6 6 6 8 8 8 10 10 10 13 13 13 15 14 14 17 17 17
112534 +20 20 20 22 22 22 25 25 25 27 27 27 30 30 30 32 32 32
112535 +35 35 35 38 38 38 41 41 41 43 43 43 46 46 46 49 49 49
112536 +52 52 52 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112537 +249 249 249 192 187 164 65 65 65 66 66 66 66 66 66 66 66 66
112538 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112539 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112540 +65 65 65 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112541 +255 255 255 200 196 176 66 66 66 66 66 66 66 66 66 200 196 176
112542 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112543 +65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112544 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112545 +66 66 66 192 187 164 249 249 249 255 255 255 255 255 255 255 255 255
112546 +255 255 255 255 255 255 66 66 66 66 66 66 66 66 66 255 255 255
112547 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112548 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112549 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112550 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
112551 +192 187 164 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112552 +200 196 176 249 249 249 249 249 249 255 255 255 255 255 255 249 249 249
112553 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112554 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112555 +66 66 66 66 66 66 200 196 176 249 249 249 249 249 249 255 255 255
112556 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
112557 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112558 +255 255 255 176 168 138 65 65 65 66 66 66 66 66 66 66 66 66
112559 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112560 +192 187 164 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
112561 +231 230 220 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66
112562 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
112563 +238 238 238 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112564 +138 129 110 65 65 65 66 66 66 138 129 110 238 238 238 255 255 255
112565 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 66 66 66
112566 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112567 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112568 +66 66 66 66 66 66 66 66 66 66 66 66 255 255 255 255 255 255
112569 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 66 66 66
112570 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
112571 +255 255 255 255 255 255 140 134 120 66 66 66 140 134 120 238 238 238
112572 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 196 176
112573 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112574 +66 66 66 66 66 66 66 66 66 66 66 66 200 196 176 249 249 249
112575 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 66 66 66
112576 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112577 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112578 +66 66 66 66 66 66 66 66 66 65 65 65 192 187 164 249 249 249
112579 +249 249 249 255 255 255 255 255 255 255 255 255 238 238 238 50 50 50
112580 +46 46 46 43 43 43 41 41 41 38 38 38 35 35 35 32 32 32
112581 +30 30 30 27 27 27 25 25 25 22 22 22 19 19 19 17 17 17
112582 +15 14 14 13 13 13 10 10 10 8 8 8 6 6 6 4 4 4
112583 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112612 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112613 +6 6 6 8 8 8 10 10 10 12 12 12 15 14 14 17 17 17
112614 +19 19 19 22 22 22 25 25 25 27 27 27 30 30 30 32 32 32
112615 +35 35 35 38 38 38 41 41 41 43 43 43 46 46 46 49 49 49
112616 +52 52 52 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112617 +249 249 249 200 196 176 66 66 66 66 66 66 66 66 66 66 66 66
112618 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112619 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112620 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112621 +249 249 249 192 187 164 66 66 66 66 66 66 66 66 66 200 196 176
112622 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112623 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112624 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112625 +65 65 65 192 187 164 255 255 255 255 255 255 255 255 255 255 255 255
112626 +255 255 255 255 255 255 66 66 66 66 66 66 66 66 66 255 255 255
112627 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 185 178 149
112628 +65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
112629 +65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
112630 +65 65 65 66 66 66 65 65 65 66 66 66 66 66 66 66 66 66
112631 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112632 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112633 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112634 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112635 +66 66 66 65 65 65 200 196 176 255 255 255 255 255 255 255 255 255
112636 +249 249 249 249 249 249 231 229 217 66 66 66 66 66 66 66 66 66
112637 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112638 +249 249 249 140 134 120 66 66 66 66 66 66 66 66 66 66 66 66
112639 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112640 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112641 +231 230 220 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112642 +66 66 66 66 66 66 66 66 66 66 66 66 52 52 52 138 129 110
112643 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112644 +66 66 66 66 66 66 66 66 66 66 66 66 249 249 249 255 255 255
112645 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 66 66 66
112646 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112647 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112648 +66 66 66 66 66 66 66 66 66 138 129 110 255 255 255 255 255 255
112649 +255 255 255 255 255 255 255 255 255 249 249 249 140 134 120 66 66 66
112650 +66 66 66 66 66 66 238 238 238 255 255 255 255 255 255 255 255 255
112651 +255 255 255 255 255 255 140 134 120 66 66 66 52 52 52 230 228 210
112652 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
112653 +192 187 164 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112654 +66 66 66 66 66 66 66 66 66 66 66 66 192 187 164 255 255 255
112655 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 66 66 66
112656 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112657 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112658 +66 66 66 66 66 66 65 65 65 65 65 65 200 196 176 249 249 249
112659 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 49 49 49
112660 +46 46 46 43 43 43 41 41 41 38 38 38 35 35 35 32 32 32
112661 +30 30 30 27 27 27 25 25 25 22 22 22 19 19 19 17 17 17
112662 +15 14 14 12 12 12 10 10 10 8 8 8 6 6 6 4 4 4
112663 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112692 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112693 +6 6 6 8 8 8 10 10 10 12 12 12 14 14 14 17 17 17
112694 +19 19 19 21 21 21 24 24 24 27 27 27 30 30 30 32 32 32
112695 +35 35 35 38 38 38 41 41 41 43 43 43 46 46 46 48 48 47
112696 +50 50 50 230 228 210 249 249 249 255 255 255 255 255 255 255 255 255
112697 +255 255 255 231 230 220 65 65 65 66 66 66 66 66 66 66 66 66
112698 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112699 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112700 +66 66 66 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112701 +249 249 249 140 134 120 66 66 66 66 66 66 66 66 66 231 230 220
112702 +238 238 238 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112703 +65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112704 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112705 +66 66 66 200 196 176 249 249 249 249 249 249 255 255 255 255 255 255
112706 +255 255 255 238 238 238 66 66 66 66 66 66 66 66 66 255 255 255
112707 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 192 187 164
112708 +65 65 65 65 65 65 66 66 66 65 65 65 66 66 66 66 66 66
112709 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112710 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112711 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112712 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112713 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112714 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112715 +66 66 66 66 66 66 200 196 176 249 249 249 255 255 255 255 255 255
112716 +255 255 255 249 249 249 200 196 176 66 66 66 66 66 66 66 66 66
112717 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112718 +255 255 255 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
112719 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112720 +192 187 164 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
112721 +231 230 220 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66
112722 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
112723 +238 238 238 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112724 +138 129 110 65 65 65 66 66 66 66 66 66 255 255 255 255 255 255
112725 +255 255 255 255 255 255 255 255 255 255 255 255 192 187 164 66 66 66
112726 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112727 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112728 +66 66 66 66 66 66 66 66 66 140 134 120 249 249 249 255 255 255
112729 +255 255 255 255 255 255 255 255 255 255 255 255 138 129 110 65 65 65
112730 +65 65 65 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
112731 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 66 66 66
112732 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112733 +249 249 249 185 178 149 66 66 66 66 66 66 66 66 66 66 66 66
112734 +66 66 66 66 66 66 66 66 66 66 66 66 185 178 149 249 249 249
112735 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 66 66 66
112736 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112737 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112738 +66 66 66 66 66 66 66 66 66 65 65 65 231 230 220 249 249 249
112739 +255 255 255 255 255 255 255 255 255 255 255 255 200 196 176 52 52 52
112740 +47 47 47 43 43 43 41 41 41 37 37 37 35 35 35 32 32 32
112741 +30 30 30 27 27 27 24 24 24 21 21 21 19 19 19 17 17 17
112742 +14 14 14 12 12 12 10 10 10 8 8 8 6 6 6 4 4 4
112743 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112772 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
112773 +6 6 6 8 8 8 10 10 10 12 12 12 14 14 14 16 16 16
112774 +19 19 19 21 21 21 24 24 24 26 26 26 30 30 30 32 32 32
112775 +35 35 35 37 37 37 41 41 41 43 43 43 45 45 45 49 49 49
112776 +47 47 47 200 196 176 255 255 255 255 255 255 255 255 255 255 255 255
112777 +249 249 249 238 238 238 66 66 66 66 66 66 66 66 66 66 66 66
112778 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112779 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112780 +140 134 120 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112781 +249 249 249 140 134 120 66 66 66 66 66 66 66 66 66 200 196 176
112782 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112783 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112784 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112785 +65 65 65 231 230 220 255 255 255 255 255 255 255 255 255 255 255 255
112786 +249 249 249 231 229 217 66 66 66 66 66 66 66 66 66 238 238 238
112787 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112788 +65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112789 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112790 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112791 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112792 +200 196 176 249 249 249 255 255 255 255 255 255 249 249 249 249 249 249
112793 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112794 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112795 +66 66 66 65 65 65 200 196 176 249 249 249 255 255 255 255 255 255
112796 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
112797 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112798 +238 238 238 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
112799 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112800 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112801 +231 230 220 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112802 +66 66 66 66 66 66 66 66 66 66 66 66 52 52 52 138 129 110
112803 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112804 +66 66 66 66 66 66 66 66 66 66 66 66 238 238 238 255 255 255
112805 +255 255 255 255 255 255 255 255 255 249 249 249 231 230 220 66 66 66
112806 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112807 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112808 +66 66 66 66 66 66 65 65 65 192 187 164 255 255 255 255 255 255
112809 +255 255 255 255 255 255 255 255 255 249 249 249 66 66 66 65 65 65
112810 +66 66 66 66 66 66 238 238 238 255 255 255 255 255 255 255 255 255
112811 +255 255 255 249 249 249 176 168 138 66 66 66 66 66 66 65 65 65
112812 +138 129 110 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112813 +249 249 249 238 238 238 176 168 138 66 66 66 66 66 66 66 66 66
112814 +66 66 66 66 66 66 66 66 66 66 66 66 140 134 120 255 255 255
112815 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 140 134 120
112816 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112817 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112818 +66 66 66 66 66 66 66 66 66 66 66 66 238 238 238 249 249 249
112819 +255 255 255 255 255 255 255 255 255 255 255 255 192 187 164 49 49 49
112820 +45 45 45 43 43 43 41 41 41 37 37 37 35 35 35 32 32 32
112821 +30 30 30 26 26 26 24 24 24 21 21 21 19 19 19 16 16 16
112822 +14 14 14 12 12 12 10 10 10 8 8 8 6 6 6 4 4 4
112823 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
112824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112852 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 3 4 4 4
112853 +6 6 6 8 8 8 10 10 10 12 12 12 14 14 14 16 16 16
112854 +18 18 18 21 21 21 24 24 24 26 26 26 28 28 28 30 30 30
112855 +35 35 35 37 37 37 39 39 39 42 42 42 45 45 45 47 47 47
112856 +50 50 50 163 154 123 249 249 249 255 255 255 255 255 255 255 255 255
112857 +255 255 255 255 255 255 140 134 120 65 65 65 66 66 66 66 66 66
112858 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112859 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112860 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112861 +255 255 255 66 66 66 66 66 66 66 66 66 66 66 66 200 196 176
112862 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112863 +65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112864 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112865 +66 66 66 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
112866 +255 255 255 200 196 176 66 66 66 66 66 66 66 66 66 230 228 210
112867 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 231 230 220
112868 +65 65 65 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112869 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112870 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112871 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112872 +200 196 176 249 249 249 249 249 249 255 255 255 255 255 255 249 249 249
112873 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112874 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112875 +66 66 66 66 66 66 200 196 176 249 249 249 255 255 255 255 255 255
112876 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
112877 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112878 +255 255 255 176 168 138 65 65 65 66 66 66 66 66 66 66 66 66
112879 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112880 +192 187 164 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
112881 +231 230 220 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66
112882 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
112883 +238 238 238 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
112884 +138 129 110 65 65 65 66 66 66 66 66 66 230 228 210 249 249 249
112885 +255 255 255 255 255 255 255 255 255 249 249 249 249 249 249 66 66 66
112886 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112887 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112888 +66 66 66 66 66 66 66 66 66 238 238 238 249 249 249 255 255 255
112889 +255 255 255 255 255 255 255 255 255 231 230 220 66 66 66 66 66 66
112890 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
112891 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 66 66 66
112892 +65 65 65 138 129 110 238 238 238 255 255 255 255 255 255 255 255 255
112893 +255 255 255 255 255 255 249 249 249 140 134 120 66 66 66 66 66 66
112894 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 255 255 255
112895 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 196 176
112896 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112897 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112898 +66 66 66 66 66 66 66 66 66 140 134 120 249 249 249 255 255 255
112899 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 50 50 50
112900 +46 46 46 42 42 42 39 39 39 35 35 35 35 35 35 30 30 30
112901 +28 28 28 26 26 26 24 24 24 21 21 21 18 18 18 16 16 16
112902 +14 14 14 11 11 11 9 9 9 8 8 8 6 6 6 4 4 4
112903 +3 3 3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
112904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112932 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 3 4 4 4
112933 +5 5 5 7 7 7 9 9 9 11 11 11 13 13 13 16 16 16
112934 +18 18 18 20 20 20 24 24 24 25 25 25 28 28 28 30 30 30
112935 +33 33 33 35 35 35 38 38 38 41 41 41 45 45 45 46 46 46
112936 +39 39 39 138 129 110 255 255 255 255 255 255 255 255 255 255 255 255
112937 +255 255 255 249 249 249 231 230 220 66 66 66 66 66 66 66 66 66
112938 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112939 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112940 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112941 +238 238 238 66 66 66 66 66 66 66 66 66 66 66 66 200 196 176
112942 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
112943 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112944 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112945 +185 178 149 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112946 +249 249 249 176 168 138 65 65 65 65 65 65 65 65 65 192 187 164
112947 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 249 249 249
112948 +66 66 66 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112949 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112950 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112951 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112952 +200 196 176 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
112953 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112954 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112955 +66 66 66 65 65 65 200 196 176 249 249 249 255 255 255 255 255 255
112956 +249 249 249 249 249 249 231 229 217 66 66 66 66 66 66 66 66 66
112957 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
112958 +249 249 249 140 134 120 66 66 66 66 66 66 66 66 66 66 66 66
112959 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
112960 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
112961 +231 230 220 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
112962 +66 66 66 66 66 66 66 66 66 66 66 66 52 52 52 138 129 110
112963 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112964 +66 66 66 66 66 66 66 66 66 66 66 66 163 154 123 255 255 255
112965 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 192 187 164
112966 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112967 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112968 +66 66 66 66 66 66 140 134 120 249 249 249 255 255 255 255 255 255
112969 +255 255 255 255 255 255 249 249 249 192 187 164 66 66 66 66 66 66
112970 +66 66 66 66 66 66 238 238 238 255 255 255 255 255 255 255 255 255
112971 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 65 65 65
112972 +65 65 65 50 50 50 138 129 110 249 249 249 255 255 255 255 255 255
112973 +255 255 255 255 255 255 255 255 255 255 255 255 140 134 120 66 66 66
112974 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 238 238 238
112975 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
112976 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112977 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
112978 +66 66 66 66 66 66 65 65 65 231 230 220 255 255 255 255 255 255
112979 +255 255 255 255 255 255 255 255 255 255 255 255 66 66 66 47 47 47
112980 +43 43 43 41 41 41 38 38 38 35 35 35 33 33 33 30 30 30
112981 +28 28 28 25 25 25 24 24 24 20 20 20 18 18 18 16 16 16
112982 +13 13 13 11 11 11 9 9 9 7 7 7 5 5 5 4 4 4
112983 +3 3 3 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
112984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
112999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113012 +0 0 0 0 0 0 0 0 0 1 1 1 3 3 3 4 4 4
113013 +5 5 5 7 7 7 9 9 9 11 11 11 13 13 13 15 14 14
113014 +17 17 17 20 20 20 22 22 22 25 25 25 27 27 27 30 30 30
113015 +32 32 32 35 35 35 38 38 38 41 41 41 43 43 43 45 45 45
113016 +47 47 47 45 45 45 238 238 238 249 249 249 255 255 255 255 255 255
113017 +255 255 255 249 249 249 249 249 249 185 178 149 65 65 65 66 66 66
113018 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113019 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 238 238 238
113020 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113021 +185 178 149 66 66 66 66 66 66 66 66 66 66 66 66 231 230 220
113022 +238 238 238 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
113023 +65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113024 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
113025 +238 238 238 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113026 +255 255 255 66 66 66 66 66 66 66 66 66 65 65 65 140 134 120
113027 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113028 +192 187 164 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113029 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113030 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113031 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113032 +200 196 176 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
113033 +200 196 176 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113034 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113035 +66 66 66 65 65 65 200 196 176 249 249 249 255 255 255 255 255 255
113036 +255 255 255 249 249 249 200 196 176 65 65 65 66 66 66 66 66 66
113037 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113038 +255 255 255 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
113039 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113040 +192 187 164 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
113041 +231 230 220 65 65 65 65 65 65 66 66 66 66 66 66 66 66 66
113042 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 138 129 110
113043 +238 238 238 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113044 +138 129 110 65 65 65 66 66 66 66 66 66 66 66 66 255 255 255
113045 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
113046 +140 134 120 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
113047 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113048 +66 66 66 138 129 110 238 238 238 249 249 249 255 255 255 255 255 255
113049 +255 255 255 255 255 255 255 255 255 138 129 110 65 65 65 66 66 66
113050 +66 66 66 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
113051 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 66 66 66
113052 +65 65 65 65 65 65 65 65 65 140 134 120 249 249 249 249 249 249
113053 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 140 134 120
113054 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 200 196 176
113055 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113056 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113057 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113058 +66 66 66 65 65 65 192 187 164 249 249 249 249 249 249 255 255 255
113059 +255 255 255 255 255 255 255 255 255 231 230 220 52 52 52 49 49 49
113060 +43 43 43 41 41 41 38 38 38 35 35 35 32 32 32 30 30 30
113061 +27 27 27 25 25 25 22 22 22 20 20 20 17 17 17 15 14 14
113062 +13 13 13 11 11 11 9 9 9 7 7 7 5 5 5 4 4 4
113063 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
113064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113092 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3
113093 +5 5 5 7 7 7 9 9 9 10 10 10 13 13 13 15 14 14
113094 +17 17 17 19 19 19 21 21 21 24 24 24 26 26 26 30 30 30
113095 +30 30 30 35 35 35 37 37 37 39 39 39 42 42 42 43 43 43
113096 +49 49 49 52 52 52 140 134 120 255 255 255 255 255 255 255 255 255
113097 +255 255 255 255 255 255 249 249 249 249 249 249 200 196 176 66 66 66
113098 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113099 +66 66 66 65 65 65 65 65 65 138 129 110 238 238 238 255 255 255
113100 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113101 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 200 196 176
113102 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
113103 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113104 +66 66 66 66 66 66 66 66 66 66 66 66 140 134 120 238 238 238
113105 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
113106 +231 230 220 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113107 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
113108 +249 249 249 185 178 149 66 66 66 66 66 66 66 66 66 66 66 66
113109 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113110 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113111 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
113112 +200 196 176 249 249 249 255 255 255 255 255 255 249 249 249 249 249 249
113113 +231 229 217 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113114 +66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65
113115 +65 65 65 65 65 65 200 196 176 249 249 249 255 255 255 255 255 255
113116 +255 255 255 249 249 249 200 196 176 66 66 66 66 66 66 66 66 66
113117 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
113118 +238 238 238 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
113119 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
113120 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
113121 +231 230 220 65 65 65 66 66 66 66 66 66 66 66 66 66 66 66
113122 +66 66 66 66 66 66 66 66 66 66 66 66 52 52 52 138 129 110
113123 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113124 +66 66 66 65 65 65 66 66 66 66 66 66 66 66 66 230 227 205
113125 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
113126 +238 238 238 176 168 138 66 66 66 66 66 66 66 66 66 66 66 66
113127 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113128 +140 134 120 238 238 238 249 249 249 255 255 255 255 255 255 255 255 255
113129 +255 255 255 249 249 249 238 238 238 65 65 65 65 65 65 65 65 65
113130 +66 66 66 66 66 66 238 238 238 255 255 255 255 255 255 255 255 255
113131 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 65 65 65
113132 +65 65 65 65 65 65 65 65 65 52 52 52 140 134 120 255 255 255
113133 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238
113134 +140 134 120 66 66 66 66 66 66 66 66 66 52 52 52 138 129 110
113135 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113136 +249 249 249 231 230 220 138 129 110 66 66 66 66 66 66 66 66 66
113137 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 66
113138 +66 66 66 200 196 176 249 249 249 249 249 249 255 255 255 255 255 255
113139 +255 255 255 255 255 255 255 255 255 140 134 120 47 47 47 45 45 45
113140 +42 42 42 39 39 39 37 37 37 35 35 35 30 30 30 30 30 30
113141 +26 26 26 24 24 24 21 21 21 19 19 19 17 17 17 15 14 14
113142 +13 13 13 10 10 10 8 8 8 6 6 6 5 5 5 3 3 3
113143 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
113144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113172 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3
113173 +5 5 5 6 6 6 8 8 8 10 10 10 12 12 12 14 14 14
113174 +16 16 16 18 18 18 21 21 21 24 24 24 26 26 26 28 28 28
113175 +30 30 30 33 33 33 35 35 35 38 38 38 41 41 41 43 43 43
113176 +45 45 45 50 50 50 65 65 65 238 238 238 255 255 255 255 255 255
113177 +255 255 255 255 255 255 255 255 255 249 249 249 249 249 249 249 249 249
113178 +200 196 176 140 134 120 140 134 120 66 66 66 138 129 110 66 66 66
113179 +140 134 120 176 168 138 231 230 220 238 238 238 249 249 249 255 255 255
113180 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 200 196 176
113181 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 200 196 176
113182 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 238 238 238
113183 +192 187 164 192 187 164 200 196 176 192 187 164 200 196 176 192 187 164
113184 +192 187 164 200 196 176 200 196 176 238 238 238 255 255 255 255 255 255
113185 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113186 +138 129 110 65 65 65 65 65 65 65 65 65 65 65 65 66 66 66
113187 +200 196 176 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113188 +255 255 255 249 249 249 249 249 249 200 196 176 192 187 164 192 187 164
113189 +192 187 164 192 187 164 192 187 164 192 187 164 192 187 164 192 187 164
113190 +192 187 164 192 187 164 192 187 164 192 187 164 192 187 164 192 187 164
113191 +192 187 164 176 168 138 65 65 65 65 65 65 65 65 65 65 65 65
113192 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
113193 +200 196 176 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
113194 +65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
113195 +65 65 65 65 65 65 200 196 176 249 249 249 249 249 249 255 255 255
113196 +255 255 255 255 255 255 200 196 176 66 66 66 66 66 66 66 66 66
113197 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113198 +255 255 255 140 134 120 66 66 66 66 66 66 66 66 66 66 66 66
113199 +66 66 66 66 66 66 66 66 66 65 65 65 65 65 65 65 65 65
113200 +192 187 164 238 238 238 255 255 255 255 255 255 255 255 255 249 249 249
113201 +231 230 220 52 52 52 66 66 66 65 65 65 65 65 65 65 65 65
113202 +65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 138 129 110
113203 +238 238 238 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113204 +138 129 110 65 65 65 65 65 65 66 66 66 65 65 65 138 129 110
113205 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113206 +249 249 249 249 249 249 238 238 238 200 196 176 140 134 120 138 129 110
113207 +66 66 66 140 134 120 66 66 66 140 134 120 192 187 164 238 238 238
113208 +249 249 249 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113209 +255 255 255 255 255 255 140 134 120 65 65 65 65 65 65 65 65 65
113210 +65 65 65 65 65 65 249 249 249 255 255 255 255 255 255 255 255 255
113211 +255 255 255 255 255 255 140 134 120 66 66 66 66 66 66 65 65 65
113212 +65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 140 134 120
113213 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113214 +249 249 249 138 129 110 65 65 65 65 65 65 66 66 66 52 52 52
113215 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113216 +255 255 255 249 249 249 249 249 249 230 228 210 163 154 123 140 134 120
113217 +138 129 110 66 66 66 138 129 110 138 129 110 140 134 120 200 196 176
113218 +249 249 249 255 255 255 249 249 249 255 255 255 255 255 255 255 255 255
113219 +255 255 255 255 255 255 238 238 238 52 52 52 47 47 47 43 43 43
113220 +41 41 41 38 38 38 35 35 35 33 33 33 30 30 30 28 28 28
113221 +25 25 25 24 24 24 21 21 21 18 18 18 16 16 16 14 14 14
113222 +12 12 12 10 10 10 8 8 8 6 6 6 4 4 4 3 3 3
113223 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
113224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113252 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3
113253 +4 4 4 6 6 6 8 8 8 9 9 9 11 11 11 13 13 13
113254 +16 16 16 18 18 18 20 20 20 22 22 22 25 25 25 27 27 27
113255 +30 30 30 32 32 32 33 33 33 37 37 37 39 39 39 41 41 41
113256 +45 45 45 46 46 46 41 41 41 138 129 110 249 249 249 255 255 255
113257 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113258 +255 255 255 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113259 +249 249 249 249 249 249 249 249 249 249 249 249 255 255 255 255 255 255
113260 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 66 66 66
113261 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 200 196 176
113262 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 249 249 249
113263 +249 249 249 238 238 238 249 249 249 238 238 238 249 249 249 238 238 238
113264 +249 249 249 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
113265 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 192 187 164
113266 +52 52 52 65 65 65 52 52 52 65 65 65 65 65 65 66 66 66
113267 +66 66 66 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113268 +255 255 255 255 255 255 255 255 255 249 249 249 249 249 249 249 249 249
113269 +249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249
113270 +249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249
113271 +238 238 238 231 230 220 65 65 65 65 65 65 65 65 65 65 65 65
113272 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
113273 +200 196 176 65 65 65 52 52 52 65 65 65 65 65 65 52 52 52
113274 +65 65 65 52 52 52 65 65 65 52 52 52 65 65 65 52 52 52
113275 +65 65 65 52 52 52 200 196 176 255 255 255 255 255 255 255 255 255
113276 +255 255 255 255 255 255 200 196 176 66 66 66 65 65 65 65 65 65
113277 +65 65 65 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
113278 +249 249 249 176 168 138 66 66 66 65 65 65 65 65 65 65 65 65
113279 +65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 52 52 52
113280 +192 187 164 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
113281 +231 230 220 65 65 65 65 65 65 65 65 65 65 65 65 65 65 65
113282 +65 65 65 65 65 65 65 65 65 65 65 65 47 47 47 138 129 110
113283 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113284 +66 66 66 52 52 52 65 65 65 65 65 65 65 65 65 52 52 52
113285 +176 168 138 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113286 +255 255 255 255 255 255 249 249 249 249 249 249 249 249 249 249 249 249
113287 +255 255 255 255 255 255 255 255 255 249 249 249 249 249 249 249 249 249
113288 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113289 +255 255 255 200 196 176 52 52 52 65 65 65 52 52 52 65 65 65
113290 +65 65 65 65 65 65 238 238 238 255 255 255 255 255 255 255 255 255
113291 +255 255 255 255 255 255 140 134 120 65 65 65 65 65 65 65 65 65
113292 +65 65 65 65 65 65 52 52 52 65 65 65 65 65 65 66 66 66
113293 +140 134 120 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113294 +238 238 238 238 238 238 138 129 110 65 65 65 66 66 66 66 66 66
113295 +66 66 66 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
113296 +255 255 255 255 255 255 249 249 249 249 249 249 249 249 249 249 249 249
113297 +249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 255 255 255
113298 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113299 +255 255 255 238 238 238 138 129 110 47 47 47 43 43 43 42 42 42
113300 +39 39 39 37 37 37 35 35 35 32 32 32 30 30 30 27 27 27
113301 +25 25 25 22 22 22 20 20 20 18 18 18 16 16 16 13 13 13
113302 +11 11 11 9 9 9 8 8 8 6 6 6 4 4 4 3 3 3
113303 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
113304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113332 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 3 3 3
113333 +4 4 4 5 5 5 7 7 7 9 9 9 11 11 11 13 13 13
113334 +15 14 14 17 17 17 19 19 19 21 21 21 24 24 24 26 26 26
113335 +28 28 28 30 30 30 33 33 33 35 35 35 38 38 38 39 39 39
113336 +42 42 42 45 45 45 46 46 46 45 45 45 140 134 120 249 249 249
113337 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113338 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113339 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113340 +255 255 255 255 255 255 255 255 255 238 238 238 138 129 110 52 52 52
113341 +66 66 66 66 66 66 66 66 66 66 66 66 66 66 66 231 230 220
113342 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
113343 +249 249 249 255 255 255 249 249 249 255 255 255 249 249 249 255 255 255
113344 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113345 +255 255 255 255 255 255 255 255 255 255 255 255 200 196 176 66 66 66
113346 +65 65 65 52 52 52 65 65 65 52 52 52 65 65 65 65 65 65
113347 +66 66 66 140 134 120 255 255 255 255 255 255 255 255 255 255 255 255
113348 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113349 +255 255 255 249 249 249 255 255 255 249 249 249 255 255 255 249 249 249
113350 +255 255 255 249 249 249 255 255 255 249 249 249 249 249 249 249 249 249
113351 +249 249 249 231 230 220 52 52 52 65 65 65 52 52 52 65 65 65
113352 +200 196 176 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
113353 +200 196 176 65 65 65 65 65 65 52 52 52 65 65 65 65 65 65
113354 +52 52 52 65 65 65 65 65 65 65 65 65 52 52 52 65 65 65
113355 +65 65 65 52 52 52 200 196 176 249 249 249 249 249 249 255 255 255
113356 +255 255 255 255 255 255 200 196 176 66 66 66 65 65 65 65 65 65
113357 +52 52 52 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113358 +249 249 249 140 134 120 66 66 66 65 65 65 65 65 65 52 52 52
113359 +65 65 65 52 52 52 65 65 65 65 65 65 52 52 52 65 65 65
113360 +192 187 164 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
113361 +231 230 220 52 52 52 65 65 65 52 52 52 65 65 65 52 52 52
113362 +65 65 65 52 52 52 65 65 65 65 65 65 52 52 52 66 66 66
113363 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113364 +138 129 110 52 52 52 65 65 65 52 52 52 52 52 52 65 65 65
113365 +65 65 65 192 187 164 249 249 249 255 255 255 255 255 255 255 255 255
113366 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 255 255 255
113367 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
113368 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113369 +230 227 205 66 66 66 65 65 65 65 65 65 52 52 52 65 65 65
113370 +52 52 52 65 65 65 238 238 238 255 255 255 255 255 255 255 255 255
113371 +255 255 255 255 255 255 140 134 120 66 66 66 65 65 65 52 52 52
113372 +52 52 52 65 65 65 65 65 65 52 52 52 65 65 65 65 65 65
113373 +65 65 65 176 168 138 249 249 249 255 255 255 255 255 255 255 255 255
113374 +249 249 249 249 249 249 238 238 238 66 66 66 66 66 66 65 65 65
113375 +65 65 65 66 66 66 249 249 249 255 255 255 255 255 255 255 255 255
113376 +255 255 255 255 255 255 255 255 255 249 249 249 255 255 255 249 249 249
113377 +255 255 255 255 255 255 249 249 249 249 249 249 255 255 255 255 255 255
113378 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113379 +249 249 249 140 134 120 39 39 39 41 41 41 42 42 42 41 41 41
113380 +38 38 38 35 35 35 33 33 33 30 30 30 28 28 28 26 26 26
113381 +24 24 24 21 21 21 19 19 19 17 17 17 15 14 14 13 13 13
113382 +11 11 11 9 9 9 7 7 7 5 5 5 4 4 4 3 3 3
113383 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113412 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2
113413 +3 3 3 5 5 5 6 6 6 8 8 8 10 10 10 12 12 12
113414 +14 14 14 16 16 16 18 18 18 20 20 20 24 24 24 25 25 25
113415 +27 27 27 30 30 30 32 32 32 35 35 35 35 35 35 38 38 38
113416 +41 41 41 43 43 43 45 45 45 45 45 45 65 65 65 66 66 66
113417 +231 230 220 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113418 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113419 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113420 +255 255 255 255 255 255 200 196 176 66 66 66 52 52 52 66 66 66
113421 +66 66 66 66 66 66 66 66 66 66 66 66 65 65 65 200 196 176
113422 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113423 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113424 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113425 +255 255 255 255 255 255 249 249 249 176 168 138 65 65 65 52 52 52
113426 +52 52 52 65 65 65 52 52 52 65 65 65 52 52 52 52 52 52
113427 +52 52 52 52 52 52 138 129 110 249 249 249 255 255 255 255 255 255
113428 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113429 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113430 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113431 +249 249 249 231 230 220 65 65 65 52 52 52 65 65 65 52 52 52
113432 +200 196 176 249 249 249 255 255 255 255 255 255 255 255 255 249 249 249
113433 +200 196 176 65 65 65 52 52 52 65 65 65 52 52 52 65 65 65
113434 +52 52 52 65 65 65 52 52 52 52 52 52 65 65 65 52 52 52
113435 +65 65 65 52 52 52 200 196 176 255 255 255 255 255 255 255 255 255
113436 +255 255 255 255 255 255 200 196 176 52 52 52 65 65 65 52 52 52
113437 +65 65 65 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255
113438 +249 249 249 176 168 138 65 65 65 65 65 65 52 52 52 65 65 65
113439 +65 65 65 52 52 52 65 65 65 52 52 52 65 65 65 52 52 52
113440 +192 187 164 255 255 255 255 255 255 255 255 255 255 255 255 249 249 249
113441 +231 230 220 65 65 65 52 52 52 65 65 65 65 65 65 52 52 52
113442 +65 65 65 65 65 65 52 52 52 52 52 52 65 65 65 138 129 110
113443 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113444 +66 66 66 52 52 52 52 52 52 65 65 65 65 65 65 52 52 52
113445 +52 52 52 65 65 65 140 134 120 238 238 238 255 255 255 255 255 255
113446 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113447 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113448 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 176 168 138
113449 +65 65 65 52 52 52 65 65 65 52 52 52 65 65 65 52 52 52
113450 +65 65 65 52 52 52 249 249 249 255 255 255 255 255 255 255 255 255
113451 +255 255 255 255 255 255 140 134 120 52 52 52 65 65 65 52 52 52
113452 +65 65 65 52 52 52 52 52 52 65 65 65 52 52 52 52 52 52
113453 +65 65 65 52 52 52 185 178 149 255 255 255 255 255 255 255 255 255
113454 +255 255 255 249 249 249 249 249 249 249 249 249 66 66 66 65 65 65
113455 +66 66 66 66 66 66 66 66 66 200 196 176 255 255 255 255 255 255
113456 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113457 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113458 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238
113459 +66 66 66 47 47 47 45 45 45 42 42 42 41 41 41 38 38 38
113460 +35 35 35 33 33 33 32 32 32 30 30 30 27 27 27 25 25 25
113461 +24 24 24 20 20 20 18 18 18 16 16 16 14 14 14 12 12 12
113462 +10 10 10 8 8 8 6 6 6 5 5 5 3 3 3 2 2 2
113463 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113492 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2
113493 +3 3 3 4 4 4 6 6 6 8 8 8 9 9 9 11 11 11
113494 +13 13 13 15 14 14 17 17 17 20 20 20 21 21 21 24 24 24
113495 +26 26 26 28 28 28 30 30 30 32 32 32 35 35 35 37 37 37
113496 +39 39 39 41 41 41 43 43 43 45 45 45 47 47 47 52 52 52
113497 +52 52 52 140 134 120 200 196 176 255 255 255 255 255 255 255 255 255
113498 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113499 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238
113500 +192 187 164 138 129 110 52 52 52 66 66 66 66 66 66 65 65 65
113501 +65 65 65 65 65 65 66 66 66 66 66 66 66 66 66 200 196 176
113502 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113503 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113504 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113505 +231 230 220 185 178 149 66 66 66 65 65 65 52 52 52 52 52 52
113506 +65 65 65 50 50 50 52 52 52 52 52 52 52 52 52 65 65 65
113507 +52 52 52 52 52 52 52 52 52 66 66 66 185 178 149 238 238 238
113508 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113509 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113510 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113511 +249 249 249 231 230 220 50 50 50 52 52 52 65 65 65 52 52 52
113512 +200 196 176 249 249 249 249 249 249 255 255 255 255 255 255 255 255 255
113513 +200 196 176 65 65 65 52 52 52 52 52 52 52 52 52 52 52 52
113514 +65 65 65 52 52 52 52 52 52 65 65 65 52 52 52 52 52 52
113515 +52 52 52 52 52 52 200 196 176 249 249 249 249 249 249 255 255 255
113516 +255 255 255 255 255 255 200 196 176 65 65 65 52 52 52 65 65 65
113517 +52 52 52 249 249 249 255 255 255 255 255 255 255 255 255 255 255 255
113518 +249 249 249 140 134 120 65 65 65 52 52 52 52 52 52 52 52 52
113519 +52 52 52 65 65 65 52 52 52 52 52 52 52 52 52 52 52 52
113520 +192 187 164 238 238 238 255 255 255 255 255 255 255 255 255 249 249 249
113521 +231 230 220 47 47 47 52 52 52 52 52 52 52 52 52 65 65 65
113522 +52 52 52 52 52 52 65 65 65 52 52 52 52 52 52 138 129 110
113523 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113524 +66 66 66 66 66 66 65 65 65 52 52 52 52 52 52 65 65 65
113525 +52 52 52 52 52 52 65 65 65 66 66 66 163 154 123 231 230 220
113526 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113527 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113528 +255 255 255 255 255 255 231 230 220 176 168 138 66 66 66 65 65 65
113529 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113530 +52 52 52 52 52 52 249 249 249 255 255 255 255 255 255 255 255 255
113531 +255 255 255 255 255 255 140 134 120 65 65 65 52 52 52 52 52 52
113532 +65 65 65 52 52 52 52 52 52 52 52 52 65 65 65 52 52 52
113533 +52 52 52 52 52 52 65 65 65 192 187 164 249 249 249 255 255 255
113534 +255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 66 66 66
113535 +65 65 65 65 65 65 65 65 65 52 52 52 138 129 110 192 187 164
113536 +238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113537 +255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
113538 +255 255 255 255 255 255 255 255 255 200 196 176 140 134 120 49 49 49
113539 +52 52 52 52 52 52 43 43 43 41 41 41 39 39 39 37 37 37
113540 +35 35 35 32 32 32 30 30 30 28 28 28 26 26 26 24 24 24
113541 +21 21 21 19 19 19 17 17 17 15 14 14 13 13 13 11 11 11
113542 +9 9 9 8 8 8 6 6 6 4 4 4 3 3 3 2 2 2
113543 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113572 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
113573 +3 3 3 4 4 4 5 5 5 7 7 7 9 9 9 10 10 10
113574 +12 12 12 14 14 14 16 16 16 18 18 18 20 20 20 22 22 22
113575 +25 25 25 27 27 27 30 30 30 30 30 30 33 33 33 35 35 35
113576 +37 37 37 39 39 39 41 41 41 43 43 43 45 45 45 49 49 49
113577 +47 47 47 49 49 49 52 52 52 66 66 66 66 66 66 140 134 120
113578 +176 168 138 192 187 164 192 187 164 231 229 217 231 230 220 200 196 176
113579 +192 187 164 192 187 164 140 134 120 140 134 120 66 66 66 65 65 65
113580 +52 52 52 52 52 52 65 65 65 65 65 65 65 65 65 65 65 65
113581 +65 65 65 65 65 65 65 65 65 66 66 66 66 66 66 200 196 176
113582 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 231 230 220
113583 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
113584 +140 134 120 140 134 120 140 134 120 140 134 120 138 129 110 66 66 66
113585 +52 52 52 52 52 52 65 65 65 52 52 52 52 52 52 52 52 52
113586 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113587 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113588 +66 66 66 138 129 110 140 134 120 140 134 120 140 134 120 140 134 120
113589 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
113590 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
113591 +140 134 120 140 134 120 52 52 52 52 52 52 52 52 52 43 43 43
113592 +138 129 110 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
113593 +140 134 120 52 52 52 52 52 52 52 52 52 65 65 65 52 52 52
113594 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 65 65 65
113595 +52 52 52 47 47 47 138 129 110 140 134 120 140 134 120 140 134 120
113596 +140 134 120 140 134 120 138 129 110 65 65 65 52 52 52 52 52 52
113597 +52 52 52 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
113598 +140 134 120 66 66 66 52 52 52 52 52 52 65 65 65 52 52 52
113599 +65 65 65 52 52 52 52 52 52 52 52 52 65 65 65 66 66 66
113600 +66 66 66 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
113601 +140 134 120 52 52 52 52 52 52 65 65 65 52 52 52 52 52 52
113602 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 66 66 66
113603 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 140 134 120
113604 +66 66 66 65 65 65 52 52 52 52 52 52 52 52 52 52 52 52
113605 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113606 +65 65 65 138 129 110 140 134 120 185 178 149 192 187 164 192 187 164
113607 +230 228 210 231 230 220 200 196 176 192 187 164 192 187 164 140 134 120
113608 +140 134 120 66 66 66 52 52 52 65 65 65 52 52 52 52 52 52
113609 +52 52 52 52 52 52 52 52 52 65 65 65 52 52 52 65 65 65
113610 +52 52 52 52 52 52 140 134 120 140 134 120 140 134 120 140 134 120
113611 +140 134 120 140 134 120 66 66 66 52 52 52 52 52 52 52 52 52
113612 +52 52 52 52 52 52 65 65 65 52 52 52 52 52 52 52 52 52
113613 +52 52 52 52 52 52 52 52 52 52 52 52 140 134 120 140 134 120
113614 +140 134 120 140 134 120 140 134 120 140 134 120 140 134 120 138 129 110
113615 +52 52 52 52 52 52 52 52 52 52 52 52 46 46 46 50 50 50
113616 +65 65 65 66 66 66 140 134 120 140 134 120 192 187 164 192 187 164
113617 +200 196 176 230 228 210 231 229 217 192 187 164 192 187 164 176 168 138
113618 +140 134 120 138 129 110 52 52 52 49 49 49 45 45 45 46 46 46
113619 +45 45 45 43 43 43 41 41 41 39 39 39 37 37 37 35 35 35
113620 +33 33 33 30 30 30 28 28 28 26 26 26 25 25 25 22 22 22
113621 +20 20 20 18 18 18 16 16 16 14 14 14 12 12 12 10 10 10
113622 +9 9 9 7 7 7 5 5 5 4 4 4 3 3 3 1 1 1
113623 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
113653 +2 2 2 3 3 3 5 5 5 6 6 6 8 8 8 10 10 10
113654 +11 11 11 13 13 13 15 14 14 17 17 17 19 19 19 21 21 21
113655 +24 24 24 25 25 25 27 27 27 30 30 30 30 30 30 33 33 33
113656 +35 35 35 37 37 37 39 39 39 41 41 41 42 42 42 43 43 43
113657 +45 45 45 46 46 46 47 47 47 52 52 52 65 65 65 52 52 52
113658 +47 47 47 45 45 45 46 46 46 46 46 46 49 49 49 52 52 52
113659 +52 52 52 52 52 52 65 65 65 65 65 65 65 65 65 65 65 65
113660 +52 52 52 65 65 65 52 52 52 52 52 52 65 65 65 52 52 52
113661 +65 65 65 52 52 52 65 65 65 65 65 65 65 65 65 200 196 176
113662 +249 249 249 255 255 255 255 255 255 255 255 255 255 255 255 200 196 176
113663 +65 65 65 66 66 66 66 66 66 66 66 66 66 66 66 65 65 65
113664 +65 65 65 65 65 65 52 52 52 52 52 52 49 49 49 52 52 52
113665 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113666 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113667 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113668 +52 52 52 49 49 49 49 49 49 52 52 52 52 52 52 52 52 52
113669 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113670 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113671 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113672 +46 46 46 49 49 49 52 52 52 52 52 52 52 52 52 49 49 49
113673 +45 45 45 49 49 49 52 52 52 52 52 52 50 50 50 52 52 52
113674 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 49 49 49
113675 +52 52 52 50 50 50 45 45 45 49 49 49 52 52 52 52 52 52
113676 +52 52 52 52 52 52 47 47 47 47 47 47 52 52 52 52 52 52
113677 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 65 65 65
113678 +65 65 65 65 65 65 52 52 52 52 52 52 52 52 52 52 52 52
113679 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113680 +65 65 65 65 65 65 52 52 52 52 52 52 52 52 52 50 50 50
113681 +47 47 47 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113682 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113683 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 65 65 65
113684 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113685 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113686 +52 52 52 46 46 46 49 49 49 49 49 49 49 49 49 50 50 50
113687 +47 47 47 45 45 45 49 49 49 49 49 49 47 47 47 50 50 50
113688 +50 50 50 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113689 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113690 +52 52 52 52 52 52 50 50 50 52 52 52 52 52 52 52 52 52
113691 +52 52 52 65 65 65 52 52 52 65 65 65 52 52 52 52 52 52
113692 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113693 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113694 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 49 49 49
113695 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113696 +52 52 52 65 65 65 52 52 52 65 65 65 50 50 50 50 50 50
113697 +52 52 52 49 49 49 43 43 43 45 45 45 45 45 45 45 45 45
113698 +43 43 43 39 39 39 43 43 43 47 47 47 45 45 45 43 43 43
113699 +43 43 43 41 41 41 39 39 39 37 37 37 35 35 35 33 33 33
113700 +32 32 32 30 30 30 27 27 27 25 25 25 24 24 24 21 21 21
113701 +19 19 19 17 17 17 15 14 14 13 13 13 11 11 11 9 9 9
113702 +8 8 8 6 6 6 5 5 5 3 3 3 2 2 2 1 1 1
113703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
113733 +2 2 2 3 3 3 4 4 4 5 5 5 7 7 7 9 9 9
113734 +10 10 10 12 12 12 14 14 14 16 16 16 18 18 18 20 20 20
113735 +21 21 21 24 24 24 25 25 25 27 27 27 30 30 30 32 32 32
113736 +33 33 33 35 35 35 37 37 37 38 38 38 39 39 39 41 41 41
113737 +43 43 43 45 45 45 45 45 45 45 45 45 46 46 46 46 46 46
113738 +49 49 49 49 49 49 49 49 49 49 49 49 52 52 52 52 52 52
113739 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113740 +52 52 52 52 52 52 52 52 52 65 65 65 52 52 52 65 65 65
113741 +52 52 52 65 65 65 65 65 65 65 65 65 66 66 66 200 196 176
113742 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
113743 +65 65 65 65 65 65 65 65 65 65 65 65 65 65 65 52 52 52
113744 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113745 +52 52 52 52 52 52 52 52 52 50 50 50 50 50 50 49 49 49
113746 +49 49 49 47 47 47 49 49 49 49 49 49 49 49 49 49 49 49
113747 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
113748 +49 49 49 49 49 49 49 49 49 49 49 49 52 52 52 52 52 52
113749 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113750 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113751 +52 52 52 50 50 50 52 52 52 52 52 52 50 50 50 50 50 50
113752 +50 50 50 49 49 49 50 50 50 49 49 49 47 47 47 49 49 49
113753 +47 47 47 49 49 49 49 49 49 49 49 49 47 47 47 49 49 49
113754 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 47 47 47
113755 +49 49 49 49 49 49 47 47 47 49 49 49 49 49 49 50 50 50
113756 +50 50 50 49 49 49 49 49 49 50 50 50 50 50 50 50 50 50
113757 +52 52 52 50 50 50 52 52 52 52 52 52 50 50 50 47 47 47
113758 +47 47 47 49 49 49 52 52 52 50 50 50 49 49 49 49 49 49
113759 +49 49 49 50 50 50 52 52 52 50 50 50 50 50 50 50 50 50
113760 +49 49 49 47 47 47 49 49 49 49 49 49 49 49 49 50 50 50
113761 +49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 50 50 50
113762 +52 52 52 52 52 52 52 52 52 52 52 52 50 50 50 50 50 50
113763 +49 49 49 49 49 49 49 49 49 50 50 50 49 49 49 47 47 47
113764 +49 49 49 50 50 50 50 50 50 52 52 52 50 50 50 52 52 52
113765 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 50 50 50
113766 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 50 50 50
113767 +49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
113768 +49 49 49 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50
113769 +52 52 52 52 52 52 52 52 52 49 49 49 49 49 49 49 49 49
113770 +49 49 49 49 49 49 47 47 47 49 49 49 49 49 49 49 49 49
113771 +49 49 49 47 47 47 49 49 49 47 47 47 47 47 47 49 49 49
113772 +50 50 50 50 50 50 49 49 49 50 50 50 50 50 50 52 52 52
113773 +52 52 52 49 49 49 49 49 49 49 49 49 47 47 47 49 49 49
113774 +49 49 49 49 49 49 50 50 50 50 50 50 50 50 50 49 49 49
113775 +50 50 50 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113776 +50 50 50 50 50 50 50 50 50 49 49 49 50 50 50 50 50 50
113777 +49 49 49 49 49 49 49 49 49 47 47 47 49 49 49 47 47 47
113778 +47 47 47 46 46 46 45 45 45 45 45 45 43 43 43 41 41 41
113779 +41 41 41 38 38 38 37 37 37 35 35 35 33 33 33 30 30 30
113780 +30 30 30 27 27 27 25 25 25 24 24 24 21 21 21 20 20 20
113781 +18 18 18 16 16 16 14 14 14 12 12 12 10 10 10 9 9 9
113782 +7 7 7 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1
113783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113813 +1 1 1 3 3 3 3 3 3 5 5 5 6 6 6 8 8 8
113814 +9 9 9 11 11 11 13 13 13 15 14 14 16 16 16 18 18 18
113815 +20 20 20 22 22 22 24 24 24 26 26 26 27 27 27 28 28 28
113816 +32 32 32 33 33 33 35 35 35 35 35 35 37 37 37 39 39 39
113817 +41 41 41 41 41 41 43 43 43 43 43 43 43 43 43 46 46 46
113818 +45 45 45 46 46 46 47 47 47 47 47 47 49 49 49 50 50 50
113819 +50 50 50 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113820 +65 65 65 52 52 52 52 52 52 52 52 52 65 65 65 52 52 52
113821 +65 65 65 52 52 52 65 65 65 52 52 52 66 66 66 200 196 176
113822 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
113823 +52 52 52 65 65 65 52 52 52 52 52 52 52 52 52 65 65 65
113824 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113825 +50 50 50 49 49 49 46 46 46 47 47 47 46 46 46 46 46 46
113826 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
113827 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
113828 +45 45 45 46 46 46 45 45 45 46 46 46 46 46 46 46 46 46
113829 +47 47 47 49 49 49 49 49 49 49 49 49 49 49 49 49 49 49
113830 +50 50 50 50 50 50 49 49 49 49 49 49 49 49 49 49 49 49
113831 +49 49 49 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
113832 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
113833 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
113834 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
113835 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
113836 +46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 47 47 47
113837 +47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
113838 +47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
113839 +47 47 47 47 47 47 47 47 47 46 46 46 46 46 46 46 46 46
113840 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
113841 +46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 47
113842 +47 47 47 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
113843 +46 46 46 46 46 46 47 47 47 46 46 46 46 46 46 46 46 46
113844 +46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 47
113845 +47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
113846 +47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 46 46 46
113847 +46 46 46 46 46 46 46 46 46 47 47 47 47 47 47 47 47 47
113848 +47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47
113849 +47 47 47 46 46 46 47 47 47 47 47 47 46 46 46 46 46 46
113850 +46 46 46 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
113851 +45 45 45 45 45 45 45 45 45 46 46 46 46 46 46 47 47 47
113852 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
113853 +46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46 46
113854 +46 46 46 46 46 46 46 46 46 46 46 46 47 47 47 47 47 47
113855 +47 47 47 47 47 47 49 49 49 47 47 47 49 49 49 49 49 49
113856 +49 49 49 49 49 49 49 49 49 47 47 47 47 47 47 47 47 47
113857 +47 47 47 47 47 47 46 46 46 46 46 46 45 45 45 45 45 45
113858 +43 43 43 43 43 43 43 43 43 41 41 41 41 41 41 39 39 39
113859 +37 37 37 35 35 35 35 35 35 33 33 33 30 30 30 30 30 30
113860 +27 27 27 26 26 26 24 24 24 22 22 22 20 20 20 18 18 18
113861 +16 16 16 15 14 14 13 13 13 11 11 11 9 9 9 8 8 8
113862 +6 6 6 5 5 5 3 3 3 2 2 2 1 1 1 0 0 0
113863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113893 +1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 7 7 7
113894 +8 8 8 10 10 10 12 12 12 13 13 13 15 14 14 17 17 17
113895 +19 19 19 20 20 20 22 22 22 24 24 24 26 26 26 27 27 27
113896 +30 30 30 30 30 30 32 32 32 35 35 35 35 35 35 37 37 37
113897 +38 38 38 39 39 39 39 39 39 42 42 42 42 42 42 42 42 42
113898 +43 43 43 43 43 43 43 43 43 46 46 46 45 45 45 46 46 46
113899 +47 47 47 47 47 47 49 49 49 50 50 50 52 52 52 52 52 52
113900 +52 52 52 52 52 52 65 65 65 52 52 52 52 52 52 52 52 52
113901 +52 52 52 65 65 65 52 52 52 65 65 65 66 66 66 200 196 176
113902 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
113903 +52 52 52 65 65 65 52 52 52 65 65 65 52 52 52 52 52 52
113904 +52 52 52 52 52 52 52 52 52 50 50 50 49 49 49 47 47 47
113905 +47 47 47 46 46 46 45 45 45 45 45 45 45 45 45 43 43 43
113906 +43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 42 42 42
113907 +42 42 42 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113908 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113909 +45 45 45 43 43 43 45 45 45 45 45 45 45 45 45 45 45 45
113910 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
113911 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 43 43 43
113912 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113913 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113914 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113915 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113916 +43 43 43 43 43 43 43 43 43 43 43 43 45 45 45 45 45 45
113917 +43 43 43 45 45 45 43 43 43 45 45 45 43 43 43 45 45 45
113918 +45 45 45 43 43 43 45 45 45 45 45 45 43 43 43 45 45 45
113919 +43 43 43 45 45 45 43 43 43 45 45 45 43 43 43 43 43 43
113920 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113921 +43 43 43 43 43 43 43 43 43 45 45 45 43 43 43 45 45 45
113922 +43 43 43 45 45 45 43 43 43 43 43 43 43 43 43 43 43 43
113923 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113924 +43 43 43 43 43 43 43 43 43 43 43 43 45 45 45 43 43 43
113925 +45 45 45 43 43 43 45 45 45 43 43 43 45 45 45 43 43 43
113926 +45 45 45 45 45 45 45 45 45 43 43 43 45 45 45 43 43 43
113927 +43 43 43 43 43 43 43 43 43 45 45 45 43 43 43 45 45 45
113928 +43 43 43 45 45 45 43 43 43 45 45 45 43 43 43 45 45 45
113929 +45 45 45 43 43 43 45 45 45 43 43 43 43 43 43 43 43 43
113930 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113931 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113932 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113933 +43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43
113934 +43 43 43 43 43 43 43 43 43 43 43 43 45 45 45 43 43 43
113935 +45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45
113936 +43 43 43 45 45 45 45 45 45 45 45 45 45 45 45 46 46 46
113937 +43 43 43 45 45 45 43 43 43 43 43 43 43 43 43 42 42 42
113938 +43 43 43 41 41 41 41 41 41 39 39 39 38 38 38 35 35 35
113939 +35 35 35 35 35 35 32 32 32 30 30 30 30 30 30 27 27 27
113940 +26 26 26 24 24 24 22 22 22 20 20 20 19 19 19 17 17 17
113941 +15 14 14 13 13 13 12 12 12 10 10 10 8 8 8 7 7 7
113942 +5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 0 0 0
113943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
113973 +0 0 0 1 1 1 2 2 2 3 3 3 5 5 5 6 6 6
113974 +7 7 7 9 9 9 10 10 10 12 12 12 14 14 14 16 16 16
113975 +17 17 17 19 19 19 20 20 20 22 22 22 24 24 24 25 25 25
113976 +27 27 27 28 28 28 30 30 30 30 30 30 33 33 33 35 35 35
113977 +35 35 35 35 35 35 38 38 38 38 38 38 39 39 39 39 39 39
113978 +41 41 41 41 41 41 43 43 43 42 42 42 43 43 43 45 45 45
113979 +45 45 45 45 45 45 46 46 46 47 47 47 47 47 47 49 49 49
113980 +49 49 49 50 50 50 52 52 52 52 52 52 52 52 52 52 52 52
113981 +65 65 65 52 52 52 52 52 52 65 65 65 52 52 52 200 196 176
113982 +255 255 255 255 255 255 255 255 255 255 255 255 249 249 249 200 196 176
113983 +52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52 52
113984 +52 52 52 52 52 52 49 49 49 47 47 47 46 46 46 45 45 45
113985 +43 43 43 43 43 43 43 43 43 42 42 42 42 42 42 41 41 41
113986 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
113987 +41 41 41 41 41 41 41 41 41 39 39 39 41 41 41 39 39 39
113988 +41 41 41 39 39 39 41 41 41 41 41 41 41 41 41 42 42 42
113989 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
113990 +42 42 42 42 42 42 43 43 43 43 43 43 43 43 43 42 42 42
113991 +42 42 42 42 42 42 42 42 42 42 42 42 41 41 41 42 42 42
113992 +42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
113993 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
113994 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
113995 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
113996 +42 42 42 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
113997 +41 41 41 42 42 42 43 43 43 42 42 42 42 42 42 42 42 42
113998 +42 42 42 42 42 42 42 42 42 42 42 42 43 43 43 42 42 42
113999 +42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41
114000 +41 41 41 42 42 42 41 41 41 42 42 42 41 41 41 42 42 42
114001 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 42 42 42
114002 +43 43 43 41 41 41 42 42 42 41 41 41 41 41 41 41 41 41
114003 +41 41 41 41 41 41 39 39 39 41 41 41 39 39 39 41 41 41
114004 +41 41 41 41 41 41 42 42 42 42 42 42 42 42 42 42 42 42
114005 +42 42 42 43 43 43 42 42 42 43 43 43 42 42 42 42 42 42
114006 +42 42 42 42 42 42 41 41 41 41 41 41 41 41 41 41 41 41
114007 +42 42 42 41 41 41 42 42 42 41 41 41 42 42 42 42 42 42
114008 +43 43 43 42 42 42 42 42 42 42 42 42 43 43 43 42 42 42
114009 +42 42 42 42 42 42 41 41 41 42 42 42 41 41 41 41 41 41
114010 +41 41 41 39 39 39 41 41 41 41 41 41 41 41 41 41 41 41
114011 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 39 39 39
114012 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
114013 +41 41 41 41 41 41 42 42 42 41 41 41 39 39 39 41 41 41
114014 +41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 43 43
114015 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
114016 +43 43 43 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
114017 +43 43 43 41 41 41 41 41 41 41 41 41 41 41 41 39 39 39
114018 +39 39 39 38 38 38 37 37 37 37 37 37 35 35 35 33 33 33
114019 +33 33 33 30 30 30 30 30 30 28 28 28 27 27 27 25 25 25
114020 +24 24 24 22 22 22 20 20 20 19 19 19 17 17 17 16 16 16
114021 +14 14 14 12 12 12 10 10 10 9 9 9 7 7 7 6 6 6
114022 +4 4 4 3 3 3 2 2 2 1 1 1 0 0 0 0 0 0
114023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114053 +0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5
114054 +6 6 6 8 8 8 9 9 9 11 11 11 13 13 13 14 14 14
114055 +16 16 16 17 17 17 19 19 19 20 20 20 22 22 22 24 24 24
114056 +25 25 25 26 26 26 28 28 28 30 30 30 30 30 30 32 32 32
114057 +33 33 33 35 35 35 35 35 35 35 35 35 37 37 37 37 37 37
114058 +37 37 37 38 38 38 39 39 39 39 39 39 41 41 41 41 41 41
114059 +42 42 42 43 43 43 45 45 45 45 45 45 46 46 46 47 47 47
114060 +47 47 47 47 47 47 49 49 49 52 52 52 52 52 52 52 52 52
114061 +52 52 52 52 52 52 52 52 52 52 52 52 65 65 65 200 196 176
114062 +255 255 255 255 255 255 255 255 255 249 249 249 249 249 249 200 196 176
114063 +65 65 65 52 52 52 52 52 52 52 52 52 52 52 52 50 50 50
114064 +49 49 49 47 47 47 46 46 46 45 45 45 45 45 45 43 43 43
114065 +42 42 42 42 42 42 39 39 39 41 41 41 39 39 39 39 39 39
114066 +38 38 38 38 38 38 37 37 37 37 37 37 37 37 37 37 37 37
114067 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
114068 +37 37 37 37 37 37 38 38 38 38 38 38 38 38 38 38 38 38
114069 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
114070 +39 39 39 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
114071 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 38 38 38
114072 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
114073 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
114074 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
114075 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
114076 +38 38 38 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38
114077 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
114078 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
114079 +39 39 39 39 39 39 38 38 38 38 38 38 39 39 39 38 38 38
114080 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39
114081 +38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39
114082 +39 39 39 39 39 39 38 38 38 38 38 38 38 38 38 38 38 38
114083 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
114084 +38 38 38 38 38 38 38 38 38 38 38 38 39 39 39 39 39 39
114085 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
114086 +39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38
114087 +38 38 38 38 38 38 39 39 39 38 38 38 39 39 39 39 39 39
114088 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
114089 +39 39 39 39 39 39 39 39 39 38 38 38 38 38 38 38 38 38
114090 +38 38 38 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
114091 +37 37 37 37 37 37 37 37 37 37 37 37 38 38 38 38 38 38
114092 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
114093 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38
114094 +38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 39 39 39
114095 +39 39 39 39 39 39 39 39 39 39 39 39 41 41 41 39 39 39
114096 +41 41 41 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
114097 +39 39 39 38 38 38 38 38 38 38 38 38 37 37 37 37 37 37
114098 +37 37 37 35 35 35 35 35 35 35 35 35 33 33 33 32 32 32
114099 +30 30 30 30 30 30 28 28 28 26 26 26 25 25 25 24 24 24
114100 +22 22 22 20 20 20 19 19 19 17 17 17 16 16 16 14 14 14
114101 +12 12 12 11 11 11 9 9 9 8 8 8 6 6 6 5 5 5
114102 +4 4 4 3 3 3 2 2 2 1 1 1 0 0 0 0 0 0
114103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114133 +0 0 0 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4
114134 +5 5 5 7 7 7 8 8 8 10 10 10 11 11 11 13 13 13
114135 +14 14 14 16 16 16 17 17 17 18 18 18 20 20 20 21 21 21
114136 +24 24 24 24 24 24 25 25 25 27 27 27 28 28 28 28 28 28
114137 +30 30 30 30 30 30 32 32 32 33 33 33 33 33 33 35 35 35
114138 +35 35 35 35 35 35 37 37 37 37 37 37 38 38 38 39 39 39
114139 +41 41 41 39 39 39 42 42 42 42 42 42 43 43 43 45 45 45
114140 +45 45 45 46 46 46 47 47 47 47 47 47 49 49 49 50 50 50
114141 +50 50 50 52 52 52 52 52 52 52 52 52 52 52 52 200 196 176
114142 +249 249 249 255 255 255 255 255 255 255 255 255 249 249 249 192 187 164
114143 +49 49 49 52 52 52 52 52 52 52 52 52 49 49 49 47 47 47
114144 +46 46 46 45 45 45 43 43 43 43 43 43 42 42 42 41 41 41
114145 +41 41 41 39 39 39 38 38 38 37 37 37 37 37 37 37 37 37
114146 +35 35 35 35 35 35 35 35 35 33 33 33 35 35 35 33 33 33
114147 +35 35 35 33 33 33 35 35 35 35 35 35 33 33 33 35 35 35
114148 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114149 +37 37 37 35 35 35 37 37 37 37 37 37 37 37 37 37 37 37
114150 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
114151 +37 37 37 37 37 37 37 37 37 35 35 35 37 37 37 35 35 35
114152 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114153 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114154 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114155 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114156 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 37 37 37
114157 +35 35 35 37 37 37 37 37 37 35 35 35 37 37 37 35 35 35
114158 +37 37 37 35 35 35 37 37 37 35 35 35 37 37 37 35 35 35
114159 +37 37 37 35 35 35 37 37 37 35 35 35 35 35 35 35 35 35
114160 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114161 +35 35 35 35 35 35 35 35 35 35 35 35 37 37 37 35 35 35
114162 +37 37 37 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114163 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114164 +35 35 35 35 35 35 35 35 35 35 35 35 37 37 37 35 35 35
114165 +37 37 37 35 35 35 37 37 37 35 35 35 37 37 37 35 35 35
114166 +37 37 37 37 37 37 35 35 35 37 37 37 35 35 35 35 35 35
114167 +35 35 35 35 35 35 35 35 35 35 35 35 37 37 37 37 37 37
114168 +35 35 35 37 37 37 35 35 35 37 37 37 35 35 35 37 37 37
114169 +37 37 37 35 35 35 37 37 37 35 35 35 35 35 35 35 35 35
114170 +35 35 35 35 35 35 35 35 35 35 35 35 33 33 33 33 33 33
114171 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114172 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114173 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114174 +35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35
114175 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37
114176 +37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 35 35 35
114177 +37 37 37 35 35 35 35 35 35 35 35 35 35 35 35 33 33 33
114178 +33 33 33 33 33 33 32 32 32 30 30 30 30 30 30 30 30 30
114179 +28 28 28 27 27 27 25 25 25 24 24 24 24 24 24 21 21 21
114180 +20 20 20 18 18 18 17 17 17 16 16 16 14 14 14 13 13 13
114181 +11 11 11 10 10 10 8 8 8 7 7 7 5 5 5 4 4 4
114182 +3 3 3 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
114183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114213 +0 0 0 0 0 0 1 1 1 1 1 1 3 3 3 3 3 3
114214 +4 4 4 6 6 6 7 7 7 8 8 8 10 10 10 11 11 11
114215 +13 13 13 14 14 14 16 16 16 17 17 17 18 18 18 20 20 20
114216 +21 21 21 22 22 22 22 22 22 25 25 25 26 26 26 27 27 27
114217 +28 28 28 28 28 28 30 30 30 30 30 30 30 30 30 32 32 32
114218 +32 32 32 33 33 33 33 33 33 35 35 35 35 35 35 35 35 35
114219 +37 37 37 38 38 38 39 39 39 41 41 41 41 41 41 42 42 42
114220 +43 43 43 43 43 43 45 45 45 45 45 45 46 46 46 47 47 47
114221 +47 47 47 49 49 49 50 50 50 52 52 52 52 52 52 200 196 176
114222 +255 255 255 255 255 255 255 255 255 249 249 249 249 249 249 200 196 176
114223 +49 49 49 50 50 50 49 49 49 47 47 47 46 46 46 45 45 45
114224 +43 43 43 42 42 42 41 41 41 41 41 41 39 39 39 38 38 38
114225 +37 37 37 35 35 35 35 35 35 35 35 35 33 33 33 33 33 33
114226 +33 33 33 32 32 32 32 32 32 32 32 32 30 30 30 32 32 32
114227 +30 30 30 32 32 32 30 30 30 30 30 30 30 30 30 32 32 32
114228 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33
114229 +33 33 33 33 33 33 33 33 33 35 35 35 33 33 33 35 35 35
114230 +33 33 33 35 35 35 33 33 33 35 35 35 33 33 33 35 35 35
114231 +35 35 35 35 35 35 35 35 35 33 33 33 33 33 33 33 33 33
114232 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 33 33 33
114233 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
114234 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
114235 +33 33 33 32 32 32 32 32 32 33 33 33 33 33 33 32 32 32
114236 +32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 33 33 33
114237 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
114238 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
114239 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32
114240 +33 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
114241 +32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
114242 +33 33 33 33 33 33 33 33 33 33 33 33 32 32 32 32 32 32
114243 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
114244 +32 32 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33
114245 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
114246 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
114247 +32 32 32 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
114248 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33
114249 +33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 32 32 32
114250 +32 32 32 32 32 32 32 32 32 30 30 30 30 30 30 32 32 32
114251 +30 30 30 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
114252 +32 32 32 32 32 32 33 33 33 33 33 33 32 32 32 32 32 32
114253 +32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
114254 +32 32 32 32 32 32 32 32 32 33 33 33 33 33 33 33 33 33
114255 +33 33 33 35 35 35 33 33 33 35 35 35 33 33 33 35 35 35
114256 +35 35 35 35 35 35 35 35 35 33 33 33 35 35 35 33 33 33
114257 +33 33 33 33 33 33 33 33 33 32 32 32 32 32 32 32 32 32
114258 +30 30 30 30 30 30 30 30 30 28 28 28 28 28 28 27 27 27
114259 +26 26 26 25 25 25 22 22 22 22 22 22 21 21 21 20 20 20
114260 +18 18 18 17 17 17 16 16 16 14 14 14 13 13 13 11 11 11
114261 +10 10 10 8 8 8 7 7 7 6 6 6 4 4 4 3 3 3
114262 +2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
114263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114293 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 3 3 3
114294 +4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 10 10 10
114295 +11 11 11 12 12 12 14 14 14 15 14 14 16 16 16 18 18 18
114296 +19 19 19 20 20 20 21 21 21 22 22 22 24 24 24 25 25 25
114297 +25 25 25 26 26 26 27 27 27 27 27 27 28 28 28 28 28 28
114298 +28 28 28 30 30 30 32 32 32 32 32 32 33 33 33 35 35 35
114299 +35 35 35 35 35 35 35 35 35 37 37 37 38 38 38 39 39 39
114300 +41 41 41 41 41 41 42 42 42 43 43 43 43 43 43 45 45 45
114301 +45 45 45 47 47 47 46 46 46 47 47 47 47 47 47 140 134 120
114302 +192 187 164 192 187 164 185 178 149 192 187 164 192 187 164 140 134 120
114303 +41 41 41 46 46 46 45 45 45 43 43 43 43 43 43 42 42 42
114304 +41 41 41 41 41 41 39 39 39 38 38 38 37 37 37 35 35 35
114305 +35 35 35 35 35 35 33 33 33 32 32 32 30 30 30 32 32 32
114306 +30 30 30 30 30 30 28 28 28 30 30 30 28 28 28 28 28 28
114307 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 30 30 30
114308 +28 28 28 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114309 +30 30 30 32 32 32 30 30 30 32 32 32 30 30 30 32 32 32
114310 +30 30 30 32 32 32 30 30 30 32 32 32 30 30 30 32 32 32
114311 +30 30 30 30 30 30 32 32 32 32 32 32 30 30 30 30 30 30
114312 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114313 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114314 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114315 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114316 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114317 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114318 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114319 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114320 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114321 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114322 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114323 +30 30 30 30 30 30 30 30 30 30 30 30 28 28 28 30 30 30
114324 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114325 +30 30 30 32 32 32 32 32 32 30 30 30 32 32 32 30 30 30
114326 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114327 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114328 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114329 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114330 +30 30 30 30 30 30 28 28 28 30 30 30 28 28 28 30 30 30
114331 +28 28 28 30 30 30 28 28 28 30 30 30 28 28 28 30 30 30
114332 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114333 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114334 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
114335 +30 30 30 30 30 30 32 32 32 30 30 30 32 32 32 30 30 30
114336 +30 30 30 30 30 30 30 30 30 32 32 32 30 30 30 32 32 32
114337 +30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 28 28 28
114338 +28 28 28 27 27 27 27 27 27 26 26 26 25 25 25 25 25 25
114339 +24 24 24 22 22 22 21 21 21 20 20 20 19 19 19 17 17 17
114340 +16 16 16 15 14 14 13 13 13 12 12 12 11 11 11 10 10 10
114341 +8 8 8 7 7 7 6 6 6 5 5 5 3 3 3 3 3 3
114342 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
114343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114373 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2
114374 +3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8
114375 +10 10 10 11 11 11 12 12 12 13 13 13 15 14 14 16 16 16
114376 +17 17 17 18 18 18 19 19 19 20 20 20 21 21 21 21 21 21
114377 +24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 26 26 26
114378 +27 27 27 27 27 27 28 28 28 30 30 30 30 30 30 32 32 32
114379 +32 32 32 33 33 33 35 35 35 35 35 35 35 35 35 37 37 37
114380 +37 37 37 38 38 38 39 39 39 41 41 41 41 41 41 42 42 42
114381 +42 42 42 43 43 43 45 45 45 43 43 43 46 46 46 45 45 45
114382 +41 41 41 39 39 39 41 41 41 38 38 38 37 37 37 39 39 39
114383 +43 43 43 43 43 43 43 43 43 43 43 43 41 41 41 39 39 39
114384 +38 38 38 37 37 37 35 35 35 35 35 35 35 35 35 33 33 33
114385 +32 32 32 30 30 30 30 30 30 30 30 30 30 30 30 28 28 28
114386 +27 27 27 27 27 27 26 26 26 26 26 26 26 26 26 26 26 26
114387 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
114388 +26 26 26 26 26 26 26 26 26 27 27 27 27 27 27 27 27 27
114389 +27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
114390 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
114391 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 27 27 27
114392 +28 28 28 27 27 27 28 28 28 27 27 27 27 27 27 27 27 27
114393 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114394 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114395 +27 27 27 27 27 27 28 28 28 27 27 27 27 27 27 27 27 27
114396 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114397 +27 27 27 27 27 27 28 28 28 28 28 28 28 28 28 28 28 28
114398 +28 28 28 30 30 30 28 28 28 28 28 28 28 28 28 27 27 27
114399 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114400 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114401 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114402 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114403 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114404 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114405 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
114406 +28 28 28 28 28 28 27 27 27 28 28 28 28 28 28 28 28 28
114407 +27 27 27 27 27 27 27 27 27 28 28 28 27 27 27 28 28 28
114408 +27 27 27 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
114409 +28 28 28 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114410 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
114411 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 27 27 27
114412 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114413 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 27
114414 +27 27 27 27 27 27 27 27 27 27 27 27 27 27 27 28 28 28
114415 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
114416 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
114417 +28 28 28 27 27 27 27 27 27 27 27 27 26 26 26 26 26 26
114418 +25 25 25 25 25 25 25 25 25 24 24 24 22 22 22 22 22 22
114419 +21 21 21 20 20 20 19 19 19 18 18 18 17 17 17 16 16 16
114420 +15 14 14 13 13 13 12 12 12 11 11 11 9 9 9 8 8 8
114421 +7 7 7 6 6 6 5 5 5 4 4 4 3 3 3 2 2 2
114422 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
114454 +2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7
114455 +8 8 8 9 9 9 10 10 10 11 11 11 13 13 13 14 14 14
114456 +15 14 14 16 16 16 17 17 17 18 18 18 19 19 19 20 20 20
114457 +20 20 20 21 21 21 22 22 22 22 22 22 22 22 22 24 24 24
114458 +24 24 24 25 25 25 26 26 26 26 26 26 27 27 27 28 28 28
114459 +30 30 30 30 30 30 30 30 30 33 33 33 33 33 33 35 35 35
114460 +35 35 35 35 35 35 37 37 37 37 37 37 38 38 38 39 39 39
114461 +41 41 41 39 39 39 41 41 41 42 42 42 43 43 43 42 42 42
114462 +42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
114463 +41 41 41 41 41 41 41 41 41 39 39 39 38 38 38 37 37 37
114464 +37 37 37 35 35 35 33 33 33 32 32 32 32 32 32 30 30 30
114465 +30 30 30 28 28 28 28 28 28 27 27 27 26 26 26 25 25 25
114466 +25 25 25 24 24 24 24 24 24 22 22 22 24 24 24 22 22 22
114467 +24 24 24 22 22 22 24 24 24 22 22 22 24 24 24 22 22 22
114468 +24 24 24 22 22 22 24 24 24 24 24 24 25 25 25 25 25 25
114469 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 26
114470 +26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26
114471 +26 26 26 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
114472 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
114473 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
114474 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
114475 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
114476 +25 25 25 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25
114477 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
114478 +25 25 25 25 25 25 25 25 25 26 26 26 25 25 25 25 25 25
114479 +25 25 25 25 25 25 25 25 25 25 25 25 24 24 24 24 24 24
114480 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
114481 +24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25
114482 +25 25 25 25 25 25 25 25 25 25 25 25 24 24 24 24 24 24
114483 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
114484 +24 24 24 24 24 24 25 25 25 25 25 25 25 25 25 25 25 25
114485 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
114486 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
114487 +24 24 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
114488 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
114489 +25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 24 24
114490 +24 24 24 24 24 24 22 22 22 24 24 24 22 22 22 24 24 24
114491 +22 22 22 24 24 24 22 22 22 24 24 24 24 24 24 24 24 24
114492 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
114493 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
114494 +24 24 24 24 24 24 24 24 24 25 25 25 25 25 25 25 25 25
114495 +25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26
114496 +26 26 26 26 26 26 25 25 25 25 25 25 25 25 25 25 25 25
114497 +25 25 25 25 25 25 25 25 25 24 24 24 24 24 24 24 24 24
114498 +24 24 24 22 22 22 22 22 22 21 21 21 20 20 20 20 20 20
114499 +19 19 19 18 18 18 17 17 17 16 16 16 15 14 14 14 14 14
114500 +13 13 13 11 11 11 10 10 10 9 9 9 8 8 8 7 7 7
114501 +6 6 6 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1
114502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
114534 +1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 5 5 5
114535 +6 6 6 8 8 8 9 9 9 10 10 10 11 11 11 12 12 12
114536 +13 13 13 14 14 14 15 14 14 16 16 16 17 17 17 17 17 17
114537 +18 18 18 19 19 19 20 20 20 20 20 20 20 20 20 21 21 21
114538 +21 21 21 22 22 22 24 24 24 24 24 24 25 25 25 26 26 26
114539 +27 27 27 28 28 28 28 28 28 30 30 30 30 30 30 30 30 30
114540 +32 32 32 33 33 33 35 35 35 35 35 35 35 35 35 35 35 35
114541 +37 37 37 38 38 38 38 38 38 39 39 39 39 39 39 39 39 39
114542 +39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39
114543 +39 39 39 38 38 38 37 37 37 37 37 37 35 35 35 35 35 35
114544 +33 33 33 33 33 33 30 30 30 30 30 30 30 30 30 28 28 28
114545 +27 27 27 26 26 26 25 25 25 24 24 24 22 22 22 24 24 24
114546 +22 22 22 21 21 21 21 21 21 20 20 20 20 20 20 20 20 20
114547 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114548 +20 20 20 21 21 21 21 21 21 21 21 21 21 21 21 22 22 22
114549 +22 22 22 22 22 22 22 22 22 24 24 24 22 22 22 24 24 24
114550 +24 24 24 22 22 22 24 24 24 24 24 24 24 24 24 22 22 22
114551 +24 24 24 22 22 22 24 24 24 24 24 24 22 22 22 22 22 22
114552 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
114553 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
114554 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
114555 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
114556 +21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22
114557 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
114558 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
114559 +22 22 22 22 22 22 22 22 22 22 22 22 21 21 21 21 21 21
114560 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
114561 +21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22
114562 +22 22 22 22 22 22 22 22 22 21 21 21 21 21 21 21 21 21
114563 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
114564 +21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22
114565 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
114566 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
114567 +21 21 21 21 21 21 22 22 22 22 22 22 22 22 22 22 22 22
114568 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
114569 +22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 21 21 21
114570 +21 21 21 21 21 21 20 20 20 20 20 20 20 20 20 20 20 20
114571 +20 20 20 20 20 20 21 21 21 21 21 21 21 21 21 21 21 21
114572 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
114573 +21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21
114574 +21 21 21 21 21 21 21 21 21 21 21 21 22 22 22 22 22 22
114575 +24 24 24 22 22 22 24 24 24 22 22 22 24 24 24 22 22 22
114576 +24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 22 22 22
114577 +22 22 22 22 22 22 22 22 22 21 21 21 21 21 21 20 20 20
114578 +20 20 20 20 20 20 20 20 20 19 19 19 18 18 18 17 17 17
114579 +17 17 17 16 16 16 15 14 14 14 14 14 13 13 13 12 12 12
114580 +11 11 11 10 10 10 9 9 9 8 8 8 6 6 6 5 5 5
114581 +5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 1 1 1
114582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114614 +1 1 1 1 1 1 2 2 2 3 3 3 3 3 3 4 4 4
114615 +5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10
114616 +11 11 11 12 12 12 13 13 13 14 14 14 15 14 14 15 14 14
114617 +16 16 16 16 16 16 17 17 17 18 18 18 18 18 18 18 18 18
114618 +19 19 19 20 20 20 20 20 20 21 21 21 22 22 22 24 24 24
114619 +24 24 24 25 25 25 26 26 26 27 27 27 28 28 28 28 28 28
114620 +30 30 30 30 30 30 32 32 32 32 32 32 33 33 33 35 35 35
114621 +35 35 35 35 35 35 35 35 35 35 35 35 37 37 37 35 35 35
114622 +37 37 37 37 37 37 37 37 37 35 35 35 37 37 37 35 35 35
114623 +37 37 37 35 35 35 35 35 35 33 33 33 33 33 33 32 32 32
114624 +30 30 30 30 30 30 28 28 28 27 27 27 26 26 26 25 25 25
114625 +24 24 24 24 24 24 22 22 22 21 21 21 21 21 21 20 20 20
114626 +19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18
114627 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
114628 +18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 20 20 20
114629 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114630 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114631 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114632 +19 19 19 19 19 19 19 19 19 19 19 19 18 18 18 18 18 18
114633 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19
114634 +19 19 19 19 19 19 19 19 19 18 18 18 18 18 18 18 18 18
114635 +18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19
114636 +19 19 19 19 19 19 19 19 19 21 21 21 20 20 20 20 20 20
114637 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114638 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114639 +20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 19 19 19
114640 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
114641 +19 19 19 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20
114642 +20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 19 19 19
114643 +19 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
114644 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20
114645 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114646 +20 20 20 20 20 20 20 20 20 19 19 19 19 19 19 19 19 19
114647 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 20 20 20
114648 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114649 +20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 19 19 19
114650 +19 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
114651 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19
114652 +19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19
114653 +19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18
114654 +18 18 18 19 19 19 19 19 19 19 19 19 20 20 20 20 20 20
114655 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114656 +20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
114657 +20 20 20 20 20 20 19 19 19 19 19 19 19 19 19 18 18 18
114658 +18 18 18 18 18 18 17 17 17 16 16 16 16 16 16 16 16 16
114659 +14 14 14 14 14 14 13 13 13 12 12 12 11 11 11 10 10 10
114660 +9 9 9 8 8 8 7 7 7 6 6 6 5 5 5 4 4 4
114661 +3 3 3 3 3 3 2 2 2 1 1 1 1 1 1 0 0 0
114662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114694 +0 0 0 1 1 1 1 1 1 2 2 2 3 3 3 3 3 3
114695 +4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 8 8 8
114696 +9 9 9 10 10 10 11 11 11 12 12 12 13 13 13 13 13 13
114697 +14 14 14 14 14 14 16 16 16 16 16 16 16 16 16 16 16 16
114698 +16 16 16 17 17 17 18 18 18 19 19 19 20 20 20 20 20 20
114699 +21 21 21 22 22 22 24 24 24 24 24 24 25 25 25 26 26 26
114700 +27 27 27 28 28 28 28 28 28 30 30 30 30 30 30 30 30 30
114701 +32 32 32 32 32 32 33 33 33 33 33 33 33 33 33 33 33 33
114702 +33 33 33 33 33 33 33 33 33 35 35 35 35 35 35 33 33 33
114703 +33 33 33 33 33 33 33 33 33 30 30 30 30 30 30 30 30 30
114704 +28 28 28 27 27 27 26 26 26 25 25 25 24 24 24 24 24 24
114705 +21 21 21 21 21 21 20 20 20 19 19 19 18 18 18 17 17 17
114706 +16 16 16 16 16 16 16 16 16 16 16 16 14 14 14 16 16 16
114707 +14 14 14 16 16 16 14 14 14 16 16 16 14 14 14 16 16 16
114708 +16 16 16 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17
114709 +17 17 17 17 17 17 17 17 17 17 17 17 18 18 18 18 18 18
114710 +18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
114711 +18 18 18 18 18 18 17 17 17 17 17 17 17 17 17 17 17 17
114712 +17 17 17 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114713 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114714 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114715 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114716 +16 16 16 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
114717 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
114718 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
114719 +17 17 17 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16
114720 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114721 +16 16 16 16 16 16 17 17 17 17 17 17 17 17 17 17 17 17
114722 +17 17 17 17 17 17 17 17 17 16 16 16 16 16 16 16 16 16
114723 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114724 +16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17
114725 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
114726 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
114727 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
114728 +17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
114729 +17 17 17 17 17 17 17 17 17 17 17 17 16 16 16 16 16 16
114730 +16 16 16 16 16 16 16 16 16 16 16 16 14 14 14 16 16 16
114731 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114732 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114733 +16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
114734 +16 16 16 16 16 16 16 16 16 17 17 17 17 17 17 17 17 17
114735 +17 17 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18
114736 +18 18 18 18 18 18 18 18 18 17 17 17 17 17 17 17 17 17
114737 +17 17 17 17 17 17 17 17 17 16 16 16 16 16 16 16 16 16
114738 +16 16 16 16 16 16 16 16 16 14 14 14 14 14 14 13 13 13
114739 +13 13 13 12 12 12 11 11 11 10 10 10 9 9 9 8 8 8
114740 +8 8 8 7 7 7 6 6 6 5 5 5 4 4 4 3 3 3
114741 +3 3 3 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0
114742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114774 +0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 2 2 2
114775 +3 3 3 4 4 4 4 4 4 5 5 5 6 6 6 7 7 7
114776 +8 8 8 8 8 8 9 9 9 10 10 10 10 10 10 11 11 11
114777 +11 11 11 12 12 12 13 13 13 13 13 13 13 13 13 14 14 14
114778 +14 14 14 14 14 14 16 16 16 16 16 16 17 17 17 18 18 18
114779 +19 19 19 20 20 20 21 21 21 21 21 21 24 24 24 22 22 22
114780 +24 24 24 25 25 25 26 26 26 27 27 27 27 27 27 28 28 28
114781 +30 30 30 30 30 30 30 30 30 32 32 32 32 32 32 30 30 30
114782 +32 32 32 30 30 30 32 32 32 30 30 30 30 30 30 32 32 32
114783 +30 30 30 30 30 30 30 30 30 28 28 28 28 28 28 27 27 27
114784 +26 26 26 25 25 25 24 24 24 22 22 22 21 21 21 20 20 20
114785 +19 19 19 18 18 18 17 17 17 16 16 16 16 16 16 16 16 16
114786 +14 14 14 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114787 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114788 +13 13 13 13 13 13 14 14 14 14 14 14 14 14 14 16 16 16
114789 +14 14 14 16 16 16 14 14 14 16 16 16 14 14 14 16 16 16
114790 +14 14 14 16 16 16 14 14 14 16 16 16 14 14 14 16 16 16
114791 +14 14 14 16 16 16 14 14 14 16 16 16 14 14 14 16 16 16
114792 +14 14 14 14 14 14 13 13 13 13 13 13 13 13 13 13 13 13
114793 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114794 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114795 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114796 +14 14 14 14 14 14 16 16 16 16 16 16 16 16 16 16 16 16
114797 +16 16 16 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114798 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114799 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114800 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114801 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114802 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114803 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114804 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114805 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114806 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114807 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114808 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114809 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114810 +14 14 14 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114811 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114812 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114813 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114814 +13 13 13 13 13 13 14 14 14 14 14 14 16 16 16 14 14 14
114815 +16 16 16 14 14 14 16 16 16 14 14 14 16 16 16 14 14 14
114816 +16 16 16 14 14 14 16 16 16 14 14 14 16 16 16 14 14 14
114817 +16 16 16 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
114818 +13 13 13 13 13 13 13 13 13 12 12 12 11 11 11 11 11 11
114819 +10 10 10 10 10 10 9 9 9 8 8 8 8 8 8 7 7 7
114820 +6 6 6 5 5 5 4 4 4 4 4 4 3 3 3 2 2 2
114821 +2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
114822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114854 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
114855 +2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5
114856 +6 6 6 6 6 6 7 7 7 8 8 8 9 9 9 9 9 9
114857 +10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11
114858 +12 12 12 12 12 12 13 13 13 14 14 14 16 16 16 16 16 16
114859 +16 16 16 17 17 17 18 18 18 19 19 19 20 20 20 21 21 21
114860 +21 21 21 22 22 22 24 24 24 24 24 24 25 25 25 25 25 25
114861 +26 26 26 27 27 27 27 27 27 28 28 28 28 28 28 28 28 28
114862 +28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28 28
114863 +28 28 28 27 27 27 27 27 27 26 26 26 25 25 25 25 25 25
114864 +22 22 22 22 22 22 21 21 21 20 20 20 19 19 19 18 18 18
114865 +17 17 17 16 16 16 14 14 14 14 14 14 13 13 13 12 12 12
114866 +11 11 11 11 11 11 10 10 10 10 10 10 10 10 10 10 10 10
114867 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
114868 +11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12
114869 +12 12 12 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114870 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114871 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 12 12 12
114872 +12 12 12 12 12 12 11 11 11 11 11 11 11 11 11 11 11 11
114873 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
114874 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
114875 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
114876 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
114877 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
114878 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
114879 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 11 11 11
114880 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
114881 +11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12
114882 +12 12 12 12 12 12 12 12 12 12 12 12 11 11 11 11 11 11
114883 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
114884 +11 11 11 11 11 11 11 11 11 12 12 12 12 12 12 12 12 12
114885 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
114886 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
114887 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
114888 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
114889 +12 12 12 12 12 12 12 12 12 11 11 11 11 11 11 11 11 11
114890 +11 11 11 11 11 11 11 11 11 11 11 11 10 10 10 10 10 10
114891 +10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11
114892 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
114893 +11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
114894 +11 11 11 11 11 11 12 12 12 12 12 12 12 12 12 12 12 12
114895 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114896 +13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13 13
114897 +12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 11 11 11
114898 +11 11 11 11 11 11 10 10 10 10 10 10 10 10 10 9 9 9
114899 +9 9 9 8 8 8 7 7 7 6 6 6 6 6 6 5 5 5
114900 +4 4 4 4 4 4 3 3 3 3 3 3 2 2 2 1 1 1
114901 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
114935 +1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4
114936 +4 4 4 5 5 5 5 5 5 6 6 6 7 7 7 7 7 7
114937 +8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9
114938 +10 10 10 10 10 10 10 10 10 11 11 11 12 12 12 13 13 13
114939 +14 14 14 16 16 16 16 16 16 16 16 16 17 17 17 18 18 18
114940 +19 19 19 20 20 20 21 21 21 21 21 21 22 22 22 24 24 24
114941 +24 24 24 25 25 25 25 25 25 25 25 25 26 26 26 27 27 27
114942 +26 26 26 27 27 27 26 26 26 27 27 27 26 26 26 26 26 26
114943 +26 26 26 25 25 25 25 25 25 24 24 24 24 24 24 22 22 22
114944 +21 21 21 20 20 20 19 19 19 18 18 18 16 16 16 16 16 16
114945 +14 14 14 13 13 13 12 12 12 11 11 11 10 10 10 10 10 10
114946 +9 9 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
114947 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
114948 +9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10
114949 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
114950 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
114951 +10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11
114952 +11 11 11 11 11 11 10 10 10 10 10 10 9 9 9 9 9 9
114953 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114954 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114955 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114956 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
114957 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 9 9 9
114958 +9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10
114959 +10 10 10 10 10 10 10 10 10 9 9 9 9 9 9 9 9 9
114960 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114961 +9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10
114962 +10 10 10 10 10 10 9 9 9 9 9 9 9 9 9 9 9 9
114963 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114964 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114965 +9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 10 10
114966 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
114967 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
114968 +10 10 10 10 10 10 10 10 10 10 10 10 9 9 9 9 9 9
114969 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114970 +9 9 9 9 9 9 9 9 9 9 9 9 8 8 8 8 8 8
114971 +8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9
114972 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114973 +9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
114974 +9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10
114975 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
114976 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
114977 +10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 9 9 9
114978 +9 9 9 9 9 9 9 9 9 8 8 8 8 8 8 7 7 7
114979 +7 7 7 6 6 6 5 5 5 5 5 5 4 4 4 4 4 4
114980 +3 3 3 3 3 3 2 2 2 2 2 2 1 1 1 1 1 1
114981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
114999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115015 +0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3
115016 +3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5
115017 +6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7
115018 +8 8 8 8 8 8 8 8 8 9 9 9 10 10 10 10 10 10
115019 +11 11 11 12 12 12 13 13 13 14 14 14 14 14 14 16 16 16
115020 +17 17 17 17 17 17 18 18 18 19 19 19 20 20 20 20 20 20
115021 +21 21 21 22 22 22 22 22 22 22 22 22 24 24 24 24 24 24
115022 +24 24 24 24 24 24 24 24 24 25 25 25 24 24 24 24 24 24
115023 +22 22 22 24 24 24 22 22 22 21 21 21 20 20 20 20 20 20
115024 +18 18 18 17 17 17 16 16 16 16 16 16 14 14 14 13 13 13
115025 +12 12 12 11 11 11 10 10 10 9 9 9 8 8 8 7 7 7
115026 +6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5
115027 +5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6
115028 +7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8
115029 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
115030 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
115031 +8 8 8 9 9 9 9 9 9 9 9 9 8 8 8 8 8 8
115032 +8 8 8 8 8 8 7 7 7 8 8 8 8 8 8 7 7 7
115033 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
115034 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
115035 +7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8
115036 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
115037 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
115038 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
115039 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
115040 +7 7 7 7 7 7 6 6 6 6 6 6 7 7 7 7 7 7
115041 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
115042 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
115043 +7 7 7 7 7 7 6 6 6 6 6 6 7 7 7 7 7 7
115044 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
115045 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
115046 +7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8
115047 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7
115048 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
115049 +7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7
115050 +7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6
115051 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
115052 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
115053 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7
115054 +7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8
115055 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
115056 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
115057 +8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7
115058 +7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 5 5 5
115059 +5 5 5 5 5 5 4 4 4 4 4 4 3 3 3 3 3 3
115060 +2 2 2 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0
115061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115095 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2
115096 +2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4
115097 +4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115098 +6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 8 8 8
115099 +9 9 9 10 10 10 11 11 11 11 11 11 13 13 13 13 13 13
115100 +14 14 14 14 14 14 16 16 16 16 16 16 17 17 17 18 18 18
115101 +19 19 19 20 20 20 20 20 20 20 20 20 21 21 21 21 21 21
115102 +22 22 22 22 22 22 22 22 22 22 22 22 21 21 21 21 21 21
115103 +22 22 22 20 20 20 20 20 20 19 19 19 18 18 18 17 17 17
115104 +16 16 16 16 16 16 14 14 14 13 13 13 12 12 12 11 11 11
115105 +10 10 10 9 9 9 8 8 8 6 6 6 5 5 5 5 5 5
115106 +4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115107 +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5
115108 +5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6
115109 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
115110 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7
115111 +7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 7 7 7
115112 +7 7 7 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5
115113 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115114 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115115 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6
115116 +6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7
115117 +7 7 7 7 7 7 6 6 6 6 6 6 5 5 5 5 5 5
115118 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115119 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6
115120 +6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 5 5 5
115121 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115122 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115123 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115124 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115125 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115126 +5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6
115127 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5
115128 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115129 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115130 +5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
115131 +5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 4 4 4
115132 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115133 +4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5
115134 +5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6
115135 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
115136 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
115137 +6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5
115138 +5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4
115139 +4 4 4 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2
115140 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
115141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
115176 +1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3
115177 +3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4
115178 +4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 6 6 6
115179 +7 7 7 8 8 8 8 8 8 9 9 9 10 10 10 11 11 11
115180 +12 12 12 13 13 13 13 13 13 14 14 14 14 14 14 16 16 16
115181 +16 16 16 17 17 17 18 18 18 18 18 18 20 20 20 20 20 20
115182 +20 20 20 20 20 20 21 21 21 20 20 20 21 21 21 19 19 19
115183 +18 18 18 18 18 18 17 17 17 16 16 16 16 16 16 14 14 14
115184 +14 14 14 13 13 13 12 12 12 11 11 11 10 10 10 9 9 9
115185 +8 8 8 7 7 7 6 6 6 5 5 5 4 4 4 3 3 3
115186 +2 2 2 2 2 2 1 1 1 1 1 1 2 2 2 2 2 2
115187 +2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115188 +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115189 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115190 +4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5
115191 +4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5
115192 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3
115193 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115194 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115195 +3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4
115196 +4 4 4 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4
115197 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115198 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115199 +4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3
115200 +3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115201 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115202 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115203 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115204 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115205 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115206 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115207 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115208 +4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115209 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115210 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115211 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115212 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115213 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115214 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115215 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115216 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115217 +4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
115218 +4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3
115219 +2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1
115220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115256 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
115257 +2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3
115258 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4
115259 +5 5 5 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9
115260 +9 9 9 10 10 10 11 11 11 12 12 12 13 13 13 13 13 13
115261 +14 14 14 16 16 16 16 16 16 16 16 16 17 17 17 17 17 17
115262 +19 19 19 18 18 18 18 18 18 18 18 18 17 17 17 17 17 17
115263 +16 16 16 16 16 16 16 16 16 14 14 14 13 13 13 13 13 13
115264 +12 12 12 11 11 11 10 10 10 9 9 9 8 8 8 7 7 7
115265 +6 6 6 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1
115266 +1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
115267 +1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
115268 +2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3
115269 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115270 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115271 +3 3 3 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3
115272 +3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2
115273 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115274 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115275 +2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3
115276 +3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 3 3 3
115277 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2
115278 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115279 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115280 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115281 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115282 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115283 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115284 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1
115285 +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115286 +2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115287 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115288 +3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115289 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115290 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115291 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115292 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115293 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115294 +3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2
115295 +2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3
115296 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115297 +3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
115298 +3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1
115299 +1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
115300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115337 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115338 +1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
115339 +3 3 3 3 3 3 4 4 4 5 5 5 6 6 6 6 6 6
115340 +7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 11 11 11
115341 +12 12 12 13 13 13 14 14 14 16 16 16 16 16 16 16 16 16
115342 +16 16 16 16 16 16 17 17 17 16 16 16 16 16 16 16 16 16
115343 +16 16 16 14 14 14 13 13 13 13 13 13 12 12 12 11 11 11
115344 +10 10 10 9 9 9 8 8 8 7 7 7 6 6 6 5 5 5
115345 +4 4 4 3 3 3 3 3 3 2 2 2 1 1 1 0 0 0
115346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115347 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
115348 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115349 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115350 +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115351 +2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
115352 +2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
115353 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115354 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115355 +1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 2 2 2
115356 +2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 2 2
115357 +2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1
115358 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115359 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115360 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115361 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115362 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115363 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115364 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115365 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115366 +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
115367 +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1
115368 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
115369 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
115370 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115371 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
115372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
115373 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115374 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115375 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115376 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115377 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115378 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
115379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115418 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
115419 +1 1 1 2 2 2 3 3 3 3 3 3 4 4 4 5 5 5
115420 +5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10
115421 +11 11 11 11 11 11 12 12 12 13 13 13 13 13 13 13 13 13
115422 +14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 13 13 13
115423 +13 13 13 12 12 12 11 11 11 11 11 11 10 10 10 9 9 9
115424 +8 8 8 7 7 7 6 6 6 5 5 5 5 5 5 4 4 4
115425 +3 3 3 2 2 2 1 1 1 1 1 1 0 0 0 0 0 0
115426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115431 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
115432 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115433 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
115434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
115435 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
115436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
115437 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115438 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
115439 +0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
115440 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115441 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115442 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115443 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
115444 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
115445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
115447 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
115448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
115457 +1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
115458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115499 +0 0 0 1 1 1 2 2 2 2 2 2 3 3 3 4 4 4
115500 +4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 8 8 8
115501 +9 9 9 10 10 10 10 10 10 11 11 11 11 11 11 12 12 12
115502 +12 12 12 12 12 12 13 13 13 12 12 12 12 12 12 11 11 11
115503 +11 11 11 10 10 10 10 10 10 9 9 9 8 8 8 8 8 8
115504 +7 7 7 6 6 6 5 5 5 4 4 4 4 4 4 3 3 3
115505 +2 2 2 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0
115506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115579 +0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 3 3 3
115580 +3 3 3 4 4 4 5 5 5 5 5 5 6 6 6 7 7 7
115581 +8 8 8 8 8 8 9 9 9 9 9 9 10 10 10 10 10 10
115582 +10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 10 10 10
115583 +10 10 10 9 9 9 8 8 8 8 8 8 7 7 7 6 6 6
115584 +5 5 5 5 5 5 4 4 4 3 3 3 3 3 3 2 2 2
115585 +1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
115586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115659 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2
115660 +3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5
115661 +6 6 6 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8
115662 +9 9 9 9 9 9 8 8 8 8 8 8 9 9 9 8 8 8
115663 +8 8 8 7 7 7 7 7 7 6 6 6 5 5 5 5 5 5
115664 +4 4 4 4 4 4 3 3 3 3 3 3 2 2 2 1 1 1
115665 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115739 +0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1
115740 +2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4
115741 +5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 7 7 7
115742 +7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 7 7 7
115743 +7 7 7 6 6 6 5 5 5 5 5 5 5 5 5 4 4 4
115744 +4 4 4 3 3 3 2 2 2 2 2 2 1 1 1 1 1 1
115745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
115820 +1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3
115821 +3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6
115822 +5 5 5 5 5 5 5 5 5 6 6 6 5 5 5 5 5 5
115823 +4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3
115824 +2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0
115825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115900 +0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
115901 +2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4
115902 +4 4 4 4 4 4 4 4 4 5 5 5 4 4 4 4 4 4
115903 +3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2
115904 +1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
115905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115980 +0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
115981 +1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3
115982 +3 3 3 4 4 4 3 3 3 3 3 3 2 2 2 2 2 2
115983 +2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1
115984 +1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
115999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116061 +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
116062 +1 1 1 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1
116063 +1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0
116064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
116999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
117999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
118999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
119999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
120999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
121999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
122999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123678 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123679 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123680 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123681 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123682 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123683 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123684 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123685 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123686 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123687 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123688 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123689 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123690 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123691 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123692 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123693 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123694 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123695 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123696 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123697 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123698 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123699 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123700 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123701 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123702 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123703 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123704 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123705 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123706 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123707 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123708 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123709 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123710 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123711 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123712 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123713 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123714 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123715 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123716 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123717 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123718 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123719 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123720 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123721 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123722 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123723 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123724 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123725 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123726 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123727 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123728 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123729 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123730 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123731 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123732 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123733 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123734 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123735 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123736 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123737 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123738 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123739 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123740 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123741 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123742 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123743 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123744 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123745 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123746 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123747 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123748 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123749 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123750 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123751 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123752 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123753 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123754 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123755 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123756 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123757 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123758 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123759 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123760 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123761 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123762 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123763 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123764 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123765 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123766 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123767 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123768 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123769 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123770 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123771 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123772 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123773 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123774 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123775 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123776 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123777 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123778 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123779 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123780 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123781 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123782 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123783 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123784 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123785 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123786 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123787 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123788 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123789 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123790 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123791 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123792 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123793 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123794 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123795 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123796 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123797 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123798 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123799 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123800 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123801 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123802 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123803 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123804 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123805 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123806 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123807 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123808 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123809 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123810 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123811 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123812 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123813 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123814 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123815 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123816 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123817 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123818 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123819 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123820 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123821 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123822 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123823 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123824 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123825 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123826 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123827 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123828 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123829 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123830 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123831 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123832 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123833 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123834 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123835 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123836 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123837 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123838 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123839 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123840 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123841 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123842 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123843 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123844 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123845 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123846 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123847 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123848 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123849 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123850 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123851 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123852 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123853 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123854 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123855 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123856 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123857 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123858 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123859 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123860 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123861 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123862 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123863 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123864 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123865 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123866 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123867 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123868 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123869 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123870 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123871 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123872 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123873 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123874 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123875 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123876 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123877 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123878 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123879 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123880 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123881 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123882 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123883 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123884 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123885 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123886 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123887 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123888 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123889 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123890 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123891 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123892 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123893 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123894 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123895 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123896 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123897 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123898 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123899 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123900 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123901 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123902 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123903 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123904 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123905 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123906 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123907 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123908 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123909 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123910 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123911 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123912 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123913 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123914 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123915 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123916 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123917 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123918 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123919 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123920 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123921 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123922 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123923 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123924 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123925 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123926 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123927 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123928 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123929 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123930 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123931 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123932 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123933 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123934 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123935 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123936 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123937 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123938 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123939 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123940 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123941 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123942 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123943 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123944 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123945 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123946 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123947 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123948 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123949 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123950 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123951 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123952 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123953 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123954 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123955 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123956 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123957 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123958 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123959 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123960 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123961 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123962 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123963 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123964 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123965 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123966 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123967 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123968 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123969 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123970 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123971 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123972 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123973 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123974 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123975 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123976 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123977 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123978 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123979 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123980 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123981 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123982 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123983 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123984 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123985 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123986 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123987 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123988 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123989 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123990 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123991 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123992 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123993 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123994 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123995 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123996 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123997 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123998 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
123999 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124000 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124001 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124002 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124003 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124004 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124005 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124006 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124007 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124008 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124009 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124010 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124011 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124012 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124013 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124014 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124015 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124016 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124017 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124018 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124019 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124020 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124021 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124022 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124023 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124024 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124025 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124026 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124027 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124028 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124029 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124030 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124031 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124032 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124033 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124034 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124035 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124036 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124037 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124038 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124039 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124040 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124041 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124042 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124043 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124044 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124045 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124046 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124047 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124048 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124049 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124050 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124051 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124052 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124053 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124054 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124055 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124056 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124057 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124058 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124059 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124060 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124061 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124062 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124063 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124064 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124065 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124066 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124067 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124068 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124069 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124070 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124071 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124072 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124073 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124074 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124075 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124076 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124077 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124078 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124079 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124080 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124081 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124082 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124083 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124084 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124085 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124086 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124087 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124088 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124089 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124090 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124091 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124092 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124093 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124094 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124095 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124096 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124097 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124098 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124099 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124100 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124101 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124102 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124103 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124104 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124105 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124106 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124107 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124108 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124109 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124110 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124111 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124112 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124113 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124114 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124116 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124117 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124118 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124119 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124120 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124121 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124122 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124123 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124124 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124126 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124128 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124129 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124130 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124131 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124132 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124133 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124134 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124135 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124136 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124137 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124138 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124139 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124140 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124141 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124142 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124143 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124144 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124145 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124146 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124147 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124148 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124149 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124150 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124151 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124152 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124153 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124154 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124155 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124156 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124157 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124158 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124159 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124160 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124161 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124162 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124163 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124164 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124165 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124167 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124168 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124169 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124170 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124171 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124172 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124173 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124174 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124175 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124176 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124177 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124178 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124179 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124180 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124181 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124182 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124183 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124184 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124185 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124186 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124187 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124188 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124189 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124190 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124191 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124192 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124193 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124194 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124195 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124196 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124197 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124198 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124199 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124200 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124202 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124203 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124204 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124205 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124206 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124207 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124208 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124209 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124210 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124211 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124212 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124213 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124214 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124215 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124216 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124217 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124218 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124219 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124220 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124221 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124222 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124223 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124224 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124225 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124226 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124227 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124228 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124229 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124230 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124231 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124232 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124233 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124234 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124235 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124236 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124237 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124238 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124239 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124240 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124241 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124242 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124243 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124244 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124245 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124246 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124247 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124248 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124249 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124250 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124251 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124252 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124253 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124254 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124256 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124257 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124258 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124259 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124260 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124261 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124262 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124263 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124264 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124265 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124266 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124267 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124268 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124269 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124270 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124271 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124272 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124273 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124274 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124275 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124276 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124277 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124278 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124279 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124280 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124281 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124282 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124283 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124284 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124285 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124286 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124287 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124288 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124289 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124290 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124291 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124292 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124293 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124294 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124295 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124296 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124297 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124298 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124299 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124300 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124301 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124302 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124303 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124304 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124305 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124306 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124307 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124308 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124309 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124310 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124311 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124312 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124313 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124314 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124315 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124316 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124317 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124318 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124319 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124320 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124321 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124322 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124323 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124324 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124325 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124326 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124327 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124328 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124329 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124330 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124331 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124332 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124333 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124334 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124335 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124336 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124337 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124338 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124339 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124340 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124341 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124342 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124343 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124344 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124345 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124346 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124347 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124348 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124349 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124350 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124351 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124352 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124353 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124354 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124355 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124356 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124357 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124358 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124359 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124360 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124361 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124362 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124363 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124364 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124365 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124366 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124367 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124368 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124369 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124370 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124371 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124372 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124373 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124374 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124375 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124376 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124377 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124378 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124379 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124380 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124381 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124382 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124383 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124384 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124385 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124386 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124387 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124388 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124389 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124390 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124391 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124392 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124393 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124394 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124395 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124396 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124397 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124398 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124399 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124400 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124401 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124402 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124403 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124404 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124405 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124406 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124407 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124408 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124409 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124410 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124411 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124412 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124413 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124414 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124415 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124416 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124417 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124418 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124419 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124420 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124421 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124422 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124423 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124424 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124425 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124426 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124427 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124428 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124429 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124430 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124431 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124432 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124433 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124434 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124435 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124436 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124437 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124438 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124439 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124440 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124441 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124442 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124443 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124444 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124445 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124446 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124447 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124448 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124449 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124450 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124451 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124452 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124453 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124454 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124455 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124456 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124457 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124458 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124459 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124460 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124461 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124462 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124463 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124464 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124465 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124466 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124467 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124468 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124469 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124470 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124471 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124472 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124473 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124474 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124475 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124476 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124477 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124478 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124479 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124480 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124481 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124482 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124483 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124484 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124485 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124486 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124487 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124488 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124489 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124490 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124491 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124492 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124493 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124494 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124495 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124496 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124497 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124498 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124499 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124500 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124501 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124502 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124503 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124504 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124505 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124506 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124507 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124508 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124509 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124510 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124511 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124512 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124513 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124514 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124515 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124516 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124517 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124518 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124519 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124520 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124521 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124522 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124523 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124524 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124525 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124526 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124527 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124528 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124529 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124530 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124531 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124532 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124533 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124534 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124535 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124536 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124537 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124538 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124539 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124540 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124541 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124542 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124543 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124544 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124545 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124546 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124547 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124548 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124549 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124550 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124551 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124552 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124553 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124554 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124555 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124556 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124557 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124558 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124559 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124560 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124561 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124562 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124563 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124564 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124565 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124566 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124567 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124568 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124569 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124570 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124571 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124572 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124573 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124574 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124575 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124576 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124577 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124578 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124579 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124580 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124581 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124582 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124583 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124584 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124585 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124586 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124587 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124588 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124589 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124590 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124591 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124592 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124593 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124594 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124595 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124596 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124597 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124598 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124599 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124600 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124601 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124602 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124603 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124604 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124605 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124606 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124607 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124608 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124609 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124610 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124611 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124612 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124613 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124614 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124615 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124616 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124617 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124618 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124619 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124620 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124621 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124622 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124623 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124624 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124625 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124626 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124627 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124628 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124629 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124630 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124631 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124632 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124633 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124634 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124635 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124636 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124637 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124638 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124639 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124640 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124641 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124642 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124643 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124644 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124645 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124646 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124647 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124648 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124649 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124650 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124651 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124652 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124653 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124654 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124655 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124656 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124657 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124658 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124659 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124660 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124661 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124662 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124663 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124664 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124665 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124666 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124667 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124668 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124669 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124670 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124671 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124672 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124673 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124674 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124675 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124676 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124677 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
124678 Index: linux-2.6.24.7/drivers/video/logo/Makefile
124679 ===================================================================
124680 --- linux-2.6.24.7.orig/drivers/video/logo/Makefile 2008-12-11 22:46:07.000000000 +0100
124681 +++ linux-2.6.24.7/drivers/video/logo/Makefile 2008-12-11 22:46:49.000000000 +0100
124682 @@ -13,6 +13,7 @@ obj-$(CONFIG_LOGO_SUPERH_MONO) += logo_
124683 obj-$(CONFIG_LOGO_SUPERH_VGA16) += logo_superh_vga16.o
124684 obj-$(CONFIG_LOGO_SUPERH_CLUT224) += logo_superh_clut224.o
124685 obj-$(CONFIG_LOGO_M32R_CLUT224) += logo_m32r_clut224.o
124686 +obj-$(CONFIG_LOGO_OPENMOKO_CLUT224) += logo_openmoko_clut224.o
124687
124688 obj-$(CONFIG_SPU_BASE) += logo_spe_clut224.o
124689
124690 Index: linux-2.6.24.7/drivers/video/s3c2410fb.c
124691 ===================================================================
124692 --- linux-2.6.24.7.orig/drivers/video/s3c2410fb.c 2008-12-11 22:46:07.000000000 +0100
124693 +++ linux-2.6.24.7/drivers/video/s3c2410fb.c 2008-12-11 22:46:49.000000000 +0100
124694 @@ -1028,6 +1028,8 @@ static int s3c2410fb_resume(struct platf
124695
124696 s3c2410fb_init_registers(fbinfo);
124697
124698 + s3c2410fb_set_par(fbinfo);
124699 +
124700 return 0;
124701 }
124702
124703 Index: linux-2.6.24.7/fs/jffs2/background.c
124704 ===================================================================
124705 --- linux-2.6.24.7.orig/fs/jffs2/background.c 2008-12-11 22:46:07.000000000 +0100
124706 +++ linux-2.6.24.7/fs/jffs2/background.c 2008-12-11 22:46:49.000000000 +0100
124707 @@ -95,13 +95,17 @@ static int jffs2_garbage_collect_thread(
124708 schedule();
124709 }
124710
124711 - /* This thread is purely an optimisation. But if it runs when
124712 - other things could be running, it actually makes things a
124713 - lot worse. Use yield() and put it at the back of the runqueue
124714 - every time. Especially during boot, pulling an inode in
124715 - with read_inode() is much preferable to having the GC thread
124716 - get there first. */
124717 - yield();
124718 + /* Problem - immediately after bootup, the GCD spends a lot
124719 + * of time in places like jffs2_kill_fragtree(); so much so
124720 + * that userspace processes (like gdm and X) are starved
124721 + * despite plenty of cond_resched()s and renicing. Yield()
124722 + * doesn't help, either (presumably because userspace and GCD
124723 + * are generally competing for a higher latency resource -
124724 + * disk).
124725 + * This forces the GCD to slow the hell down. Pulling an
124726 + * inode in with read_inode() is much preferable to having
124727 + * the GC thread get there first. */
124728 + schedule_timeout_interruptible(msecs_to_jiffies(50));
124729
124730 /* Put_super will send a SIGKILL and then wait on the sem.
124731 */
124732 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/fiq_ipc_gta02.h
124733 ===================================================================
124734 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
124735 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/fiq_ipc_gta02.h 2008-12-11 22:46:49.000000000 +0100
124736 @@ -0,0 +1,58 @@
124737 +#ifndef _LINUX_FIQ_IPC_H
124738 +#define _LINUX_FIQ_IPC_H
124739 +
124740 +/*
124741 + * this defines the struct which is used to communicate between the FIQ
124742 + * world and the normal linux kernel world. One of these structs is
124743 + * statically defined for you in the monolithic kernel so the FIQ ISR code
124744 + * can safely touch it any any time.
124745 + *
124746 + * You also want to include this file in your kernel module that wants to
124747 + * communicate with your FIQ code. Add any kinds of vars that are used by
124748 + * the FIQ ISR and the module in here.
124749 + *
124750 + * To get you started there is just an int that is incremented every FIQ
124751 + * you can remove this when you are ready to customize, but it is useful
124752 + * for testing
124753 + */
124754 +
124755 +#include <asm/arch/pwm.h>
124756 +#include <asm/plat-s3c/regs-timer.h>
124757 +
124758 +enum hdq_bitbang_states {
124759 + HDQB_IDLE = 0,
124760 + HDQB_TX_BREAK,
124761 + HDQB_TX_BREAK_RECOVERY,
124762 + HDQB_ADS_CALC,
124763 + HDQB_ADS_LOW,
124764 + HDQB_ADS_HIGH,
124765 + HDQB_WAIT_RX,
124766 + HDQB_DATA_RX_LOW,
124767 + HDQB_DATA_RX_HIGH,
124768 + HDQB_WAIT_TX,
124769 +};
124770 +
124771 +struct fiq_ipc {
124772 + /* vibrator */
124773 + unsigned long vib_gpio_pin; /* which pin to meddle with */
124774 + u8 vib_pwm; /* 0 = OFF -- will ensure GPIO deasserted and stop FIQ */
124775 + u8 vib_pwm_latched;
124776 +
124777 + /* hdq */
124778 + u8 hdq_probed; /* nonzero after HDQ driver probed */
124779 + struct mutex hdq_lock; /* if you want to use hdq, you have to take lock */
124780 + unsigned long hdq_gpio_pin; /* GTA02 = GPD14 which pin to meddle with */
124781 + u8 hdq_ads; /* b7..b6 = register address, b0 = r/w */
124782 + u8 hdq_tx_data; /* data to tx for write action */
124783 + u8 hdq_rx_data; /* data received in read action */
124784 + u8 hdq_request_ctr; /* incremented by "user" to request a transfer */
124785 + u8 hdq_transaction_ctr; /* incremented after each transfer */
124786 + u8 hdq_error; /* 0 = no error */
124787 +};
124788 +
124789 +/* actual definition lives in arch/arm/mach-s3c2440/fiq_c_isr.c */
124790 +extern struct fiq_ipc fiq_ipc;
124791 +extern unsigned long _fiq_count_fiqs;
124792 +extern void fiq_kick(void); /* provoke a FIQ "immediately" */
124793 +
124794 +#endif /* _LINUX_FIQ_IPC_H */
124795 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/glofiish.h
124796 ===================================================================
124797 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
124798 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/glofiish.h 2008-12-11 22:46:49.000000000 +0100
124799 @@ -0,0 +1,39 @@
124800 +#ifndef _GLOFIISH_H
124801 +#define _GLOFIISH_H
124802 +
124803 +#include <asm/arch/regs-gpio.h>
124804 +
124805 +#define M800_GPIO_USB_PULLUP S3C2410_GPA21
124806 +
124807 +#define M800_GPIO_BACKLIGHT S3C2410_GPB0
124808 +#define M800_GPIO_KBDLIGHT S3C2410_GPB1
124809 +#define M800_GPIO_GPS_POWER S3C2410_GPB6
124810 +
124811 +#define M800_GPIO_BT_POWER_1 S3C2410_GPC8
124812 +#define M800_GPIO_BT_POWER_2 S3C2410_GPC9
124813 +
124814 +#define M800_GPIO_nKEY_POWER S3C2410_GPF0
124815 +#define M800_GPIO_CPLD S3C2410_GPF2
124816 +#define M800_GPIO_USB_ATTACH S3C2410_GPF3
124817 +#define M800_GPIO_WIFI_1 S3C2410_GPF5
124818 +#define M800_GPIO_WIFI_2 S3C2410_GPF7
124819 +
124820 +#define M800_GPIO_FMRADIO S3C2410_GPG0
124821 +#define M800_GPIO_nKEY_CAMERA S3C2410_GPG2
124822 +#define M800_GPIO_nKEY_RECORD S3C2410_GPG4
124823 +#define M800_GPIO_SLIDE S3C2410_GPG6
124824 +#define M800_GPIO_nSD_DETECT S3C2410_GPG7
124825 +
124826 +#define M800_IRQ_nKEY_POWER IRQ_EINT0
124827 +#define M800_IRQ_CPLD_KEY IRQ_EINT2
124828 +#define M800_IRQ_USB_ATTACH IRQ_EINT3
124829 +#define M800_IRQ_WIFI_1 IRQ_EINT5
124830 +#define M800_IRQ_WIFI_2 IRQ_EINT7
124831 +#define M800_IRQ_FMRADIO IRQ_EINT8
124832 +#define M800_IRQ_nKEY_CAMERA IRQ_EINT10
124833 +#define M800_IRQ_nKEY_RECORD IRQ_EINT12
124834 +#define M800_IRQ_CAPSENSE IRQ_EINT13
124835 +#define M800_IRQ_KBD_SLIDE IRQ_EINT14
124836 +#define M800_IRQ_nSD_DETECT IRQ_EINT15
124837 +
124838 +#endif
124839 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/gpio.h
124840 ===================================================================
124841 --- linux-2.6.24.7.orig/include/asm-arm/arch-s3c2410/gpio.h 2008-12-11 22:46:07.000000000 +0100
124842 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/gpio.h 2008-12-11 22:46:49.000000000 +0100
124843 @@ -61,6 +61,7 @@ static inline int gpio_direction_output(
124844 #define gpio_to_irq(gpio) s3c2400_gpio_getirq(gpio)
124845 #else
124846 #define gpio_to_irq(gpio) s3c2410_gpio_getirq(gpio)
124847 +#define irq_to_gpio(irq) s3c2410_irq_to_gpio(irq)
124848 #endif
124849
124850 /* FIXME implement irq_to_gpio() */
124851 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/gta01.h
124852 ===================================================================
124853 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
124854 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/gta01.h 2008-12-11 22:46:49.000000000 +0100
124855 @@ -0,0 +1,74 @@
124856 +#ifndef _GTA01_H
124857 +#define _GTA01_H
124858 +
124859 +#include <asm/arch/regs-gpio.h>
124860 +#include <asm/arch/irqs.h>
124861 +
124862 +/* Different hardware revisions, passed in ATAG_REVISION by u-boot */
124863 +#define GTA01v3_SYSTEM_REV 0x00000130
124864 +#define GTA01v4_SYSTEM_REV 0x00000140
124865 +#define GTA01Bv2_SYSTEM_REV 0x00000220
124866 +#define GTA01Bv3_SYSTEM_REV 0x00000230
124867 +#define GTA01Bv4_SYSTEM_REV 0x00000240
124868 +
124869 +/* Backlight */
124870 +
124871 +extern void gta01bl_deferred_resume(void);
124872 +
124873 +struct gta01bl_machinfo {
124874 + unsigned int default_intensity;
124875 + unsigned int max_intensity;
124876 + unsigned int limit_mask;
124877 + unsigned int defer_resume_backlight;
124878 +};
124879 +
124880 +/* Definitions common to all revisions */
124881 +#define GTA01_GPIO_BACKLIGHT S3C2410_GPB0
124882 +#define GTA01_GPIO_GPS_PWRON S3C2410_GPB1
124883 +#define GTA01_GPIO_MODEM_RST S3C2410_GPB6
124884 +#define GTA01_GPIO_MODEM_ON S3C2410_GPB7
124885 +#define GTA01_GPIO_LCD_RESET S3C2410_GPC6
124886 +#define GTA01_GPIO_PMU_IRQ S3C2410_GPG8
124887 +#define GTA01_GPIO_JACK_INSERT S3C2410_GPF4
124888 +#define GTA01_GPIO_nSD_DETECT S3C2410_GPF5
124889 +#define GTA01_GPIO_AUX_KEY S3C2410_GPF6
124890 +#define GTA01_GPIO_HOLD_KEY S3C2410_GPF7
124891 +#define GTA01_GPIO_VIBRATOR_ON S3C2410_GPG11
124892 +
124893 +#define GTA01_IRQ_MODEM IRQ_EINT1
124894 +#define GTA01_IRQ_JACK_INSERT IRQ_EINT4
124895 +#define GTA01_IRQ_nSD_DETECT IRQ_EINT5
124896 +#define GTA01_IRQ_AUX_KEY IRQ_EINT6
124897 +#define GTA01_IRQ_PCF50606 IRQ_EINT16
124898 +
124899 +/* GTA01v3 */
124900 +#define GTA01v3_GPIO_nGSM_EN S3C2410_GPG9
124901 +
124902 +/* GTA01v4 */
124903 +#define GTA01_GPIO_MODEM_DNLOAD S3C2410_GPG0
124904 +
124905 +/* GTA01Bv2 */
124906 +#define GTA01Bv2_GPIO_nGSM_EN S3C2410_GPF2
124907 +#define GTA01Bv2_GPIO_VIBRATOR_ON S3C2410_GPB10
124908 +
124909 +/* GTA01Bv3 */
124910 +#define GTA01_GPIO_GPS_EN_3V3 S3C2410_GPG9
124911 +
124912 +#define GTA01_GPIO_SDMMC_ON S3C2410_GPB2
124913 +#define GTA01_GPIO_BT_EN S3C2410_GPB5
124914 +#define GTA01_GPIO_AB_DETECT S3C2410_GPB8
124915 +#define GTA01_GPIO_USB_PULLUP S3C2410_GPB9
124916 +#define GTA01_GPIO_USB_ATTACH S3C2410_GPB10
124917 +
124918 +#define GTA01_GPIO_GPS_EN_2V8 S3C2410_GPG9
124919 +#define GTA01_GPIO_GPS_EN_3V S3C2410_GPG10
124920 +#define GTA01_GPIO_GPS_RESET S3C2410_GPC0
124921 +
124922 +/* GTA01Bv4 */
124923 +#define GTA01Bv4_GPIO_nNAND_WP S3C2410_GPA16
124924 +#define GTA01Bv4_GPIO_VIBRATOR_ON S3C2410_GPB3
124925 +#define GTA01Bv4_GPIO_PMU_IRQ S3C2410_GPG1
124926 +
124927 +#define GTA01Bv4_IRQ_PCF50606 IRQ_EINT9
124928 +
124929 +#endif /* _GTA01_H */
124930 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/gta02.h
124931 ===================================================================
124932 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
124933 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/gta02.h 2008-12-11 22:46:49.000000000 +0100
124934 @@ -0,0 +1,109 @@
124935 +#ifndef _GTA02_H
124936 +#define _GTA02_H
124937 +
124938 +#include <asm/arch/regs-gpio.h>
124939 +#include <asm/arch/irqs.h>
124940 +
124941 +/* Different hardware revisions, passed in ATAG_REVISION by u-boot */
124942 +#define GTA02v1_SYSTEM_REV 0x00000310
124943 +#define GTA02v2_SYSTEM_REV 0x00000320
124944 +#define GTA02v3_SYSTEM_REV 0x00000330
124945 +#define GTA02v4_SYSTEM_REV 0x00000340
124946 +#define GTA02v5_SYSTEM_REV 0x00000350
124947 +#define GTA02v6_SYSTEM_REV 0x00000360
124948 +
124949 +#define GTA02_GPIO_n3DL_GSM S3C2410_GPA13 /* v1 + v2 + v3 only */
124950 +
124951 +#define GTA02_GPIO_PWR_LED1 S3C2410_GPB0
124952 +#define GTA02_GPIO_PWR_LED2 S3C2410_GPB1
124953 +#define GTA02_GPIO_AUX_LED S3C2410_GPB2
124954 +#define GTA02_GPIO_VIBRATOR_ON S3C2410_GPB3
124955 +#define GTA02v1_GPIO_GPS_PWRON S3C2410_GPB4 /* v1 only */
124956 +#define GTA02_GPIO_MODEM_RST S3C2410_GPB5
124957 +#define GTA02_GPIO_BT_EN S3C2410_GPB6
124958 +#define GTA02_GPIO_MODEM_ON S3C2410_GPB7
124959 +#define GTA02v1_GPIO_EN_AGPS3V S3C2410_GPB8 /* v1 only */
124960 +#define GTA02_GPIO_EXTINT8 S3C2410_GPB8
124961 +#define GTA02_GPIO_USB_PULLUP S3C2410_GPB9
124962 +
124963 +#define GTA02v1_GPIO_nGPS_RST S3C2410_GPC0 /* v1 only */
124964 +#define GTA02v12_GPIO_PIO3 S3C2410_GPC5 /* v1 + v2 only */
124965 +#define GTA02_GPIO_PIO5 S3C2410_GPC5 /* v3 + v4 only */
124966 +#define GTA02_GPIO_LCD_RESET S3C2410_GPC6 /* v1 + v2 only */
124967 +#define GTA02v12_GPIO_PIO2 S3C2410_GPC7 /* v1 + v2 only */
124968 +#define GTA02v2_nUSB_FLT S3C2410_GPC9 /* v2 only */
124969 +#define GTA02v2_nUSB_OC S3C2410_GPC10 /* v2 only */
124970 +#define GTA02v2_nGSM_OC S3C2410_GPC12 /* v2 only */
124971 +
124972 +#define GTA02v3_GPIO_nG1_CS S3C2410_GPD12 /* v3 + v4 only */
124973 +#define GTA02v3_GPIO_nG2_CS S3C2410_GPD13 /* v3 + v4 only */
124974 +#define GTA02v5_GPIO_HDQ S3C2410_GPD14 /* v5 + */
124975 +
124976 +#define GTA02_GPIO_nG1_INT S3C2410_GPF0
124977 +#define GTA02_GPIO_IO1 S3C2410_GPF1
124978 +#define GTA02v1_GPIO_nG2_INT S3C2410_GPF2 /* v1 only */
124979 +#define GTA02_GPIO_PIO_2 S3C2410_GPF2 /* v2 + v3 + v4 only */
124980 +#define GTA02_GPIO_JACK_INSERT S3C2410_GPF4
124981 +#define GTA02v1_GPIO_nSD_DETECT S3C2410_GPF5 /* v1 only */
124982 +#define GTA02_GPIO_WLAN_GPIO1 S3C2410_GPF5 /* v2 + v3 + v4 only */
124983 +#define GTA02_GPIO_AUX_KEY S3C2410_GPF6
124984 +#define GTA02_GPIO_HOLD_KEY S3C2410_GPF7
124985 +
124986 +#define GTA02_GPIO_3D_IRQ S3C2410_GPG4
124987 +#define GTA02v1_GPIO_nG1_CS S3C2410_GPG8 /* v1 only */
124988 +#define GTA02v2_GPIO_nG2_INT S3C2410_GPG8 /* v2 + v3 + v4 only */
124989 +#define GTA02v3_GPIO_nUSB_OC S3C2410_GPG9 /* v3 + v4 only */
124990 +#define GTA02v3_GPIO_nUSB_FLT S3C2410_GPG10 /* v3 + v4 only */
124991 +#define GTA02v1_GPIO_nG2_CS S3C2410_GPG11 /* v1 only */
124992 +#define GTA02v3_GPIO_nGSM_OC S3C2410_GPG11 /* v3 + v4 only */
124993 +
124994 +#define GTA02v1_GPIO_3D_RESET S3C2440_GPJ0 /* v1 only */
124995 +#define GTA02v2_GPIO_BAT_ID S3C2440_GPJ0 /* v2 only */
124996 +#define GTA02v1_GPIO_WLAN_GPIO8 S3C2440_GPJ1 /* v1 only */
124997 +#define GTA02_GPIO_AMP_SHUT S3C2440_GPJ1 /* v2 + v3 + v4 only */
124998 +#define GTA02v1_GPIO_WLAN_GPIO10 S3C2440_GPJ2
124999 +#define GTA02_GPIO_HP_IN S3C2440_GPJ2 /* v2 + v3 + v4 only */
125000 +#define GTA02v1_GPIO_KEEPACT S3C2440_GPJ3 /* v1 only */
125001 +#define GTA02_GPIO_INT0 S3C2440_GPJ3 /* v2 + v3 + v4 only */
125002 +#define GTA02_GPIO_nGSM_EN S3C2440_GPJ4
125003 +#define GTA02_GPIO_3D_RESET S3C2440_GPJ5
125004 +#define GTA02_GPIO_nDL_GSM S3C2440_GPJ6 /* v4 + v5 only */
125005 +#define GTA02_GPIO_WLAN_GPIO0 S3C2440_GPJ7
125006 +#define GTA02v1_GPIO_BAT_ID S3C2440_GPJ8
125007 +#define GTA02_GPIO_KEEPACT S3C2440_GPJ8
125008 +#define GTA02v1_GPIO_AMP_SHUT S3C2440_GPJ9 /* v1 only */
125009 +#define GTA02v2_nG1_CS S3C2440_GPJ9 /* v2 only */
125010 +#define GTA02v1_GPIO_HP_IN S3C2440_GPJ10
125011 +#define GTA02v2_nG2_CS S3C2440_GPJ10 /* v2 only */
125012 +#define GTA02v1_GPIO_INT0 S3C2440_GPJ11 /* v1 only */
125013 +#define GTA02_CHIP_PWD S3C2440_GPJ11 /* v2 + v3 + v4 only */
125014 +#define GTA02v1_GPIO_nGSM_EN S3C2440_GPJ12 /* v1 only */
125015 +#define GTA02_GPIO_nWLAN_RESET S3C2440_GPJ12 /* v2 + v3 + v4 only */
125016 +
125017 +#define GTA02_IRQ_GSENSOR_1 IRQ_EINT0
125018 +#define GTA02_IRQ_MODEM IRQ_EINT1
125019 +#define GTA02v1_IRQ_GSENSOR_2 IRQ_EINT2 /* v1 only */
125020 +#define GTA02_IRQ_PIO_2 IRQ_EINT2 /* v2 + v3 + v4 only */
125021 +#define GTA02_IRQ_nJACK_INSERT IRQ_EINT4
125022 +#define GTA02v1_IRQ_nSD_CD IRQ_EINT5 /* v1 only */
125023 +#define GTA02_IRQ_WLAN_GPIO1 IRQ_EINT5
125024 +#define GTA02_IRQ_AUX IRQ_EINT6
125025 +#define GTA02_IRQ_nHOLD IRQ_EINT7
125026 +#define GTA02v1_IRQ_nSIM_CD IRQ_EINT8 /* v1 only */
125027 +#define GTA02_IRQ_PCF50633 IRQ_EINT9
125028 +#define GTA02_IRQ_3D IRQ_EINT12
125029 +#define GTA02_IRQ_GSENSOR_2 IRQ_EINT16 /* v2 + v3 + v4 only */
125030 +#define GTA02v3_IRQ_nUSB_OC IRQ_EINT17 /* v3 + v4 only */
125031 +#define GTA02v3_IRQ_nUSB_FLT IRQ_EINT18 /* v3 + v4 only */
125032 +#define GTA02v3_IRQ_nGSM_OC IRQ_EINT19 /* v3 + v4 only */
125033 +
125034 +/* returns 00 000 on GTA02 A5 and earlier, A6 returns 01 001 */
125035 +#define GTA02_PCB_ID1_0 S3C2410_GPC13
125036 +#define GTA02_PCB_ID1_1 S3C2410_GPC15
125037 +#define GTA02_PCB_ID1_2 S3C2410_GPD0
125038 +#define GTA02_PCB_ID2_0 S3C2410_GPD3
125039 +#define GTA02_PCB_ID2_1 S3C2410_GPD4
125040 +
125041 +int gta02_get_pcb_revision(void);
125042 +
125043 +#endif /* _GTA02_H */
125044 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/hardware.h
125045 ===================================================================
125046 --- linux-2.6.24.7.orig/include/asm-arm/arch-s3c2410/hardware.h 2008-12-11 22:46:07.000000000 +0100
125047 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/hardware.h 2008-12-11 22:46:49.000000000 +0100
125048 @@ -50,6 +50,8 @@ extern unsigned int s3c2410_gpio_getcfg(
125049
125050 extern int s3c2410_gpio_getirq(unsigned int pin);
125051
125052 +extern int s3c2410_irq_to_gpio(unsigned int irq);
125053 +
125054 #ifdef CONFIG_CPU_S3C2400
125055
125056 extern int s3c2400_gpio_getirq(unsigned int pin);
125057 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/irqs.h
125058 ===================================================================
125059 --- linux-2.6.24.7.orig/include/asm-arm/arch-s3c2410/irqs.h 2008-12-11 22:46:07.000000000 +0100
125060 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/irqs.h 2008-12-11 22:46:49.000000000 +0100
125061 @@ -155,9 +155,41 @@
125062 #define IRQ_S3C2443_AC97 S3C2410_IRQSUB(28)
125063
125064 #ifdef CONFIG_CPU_S3C2443
125065 -#define NR_IRQS (IRQ_S3C2443_AC97+1)
125066 +#define _NR_IRQS (IRQ_S3C2443_AC97+1)
125067 #else
125068 -#define NR_IRQS (IRQ_S3C2440_AC97+1)
125069 +#define _NR_IRQS (IRQ_S3C2440_AC97+1)
125070 #endif
125071
125072 +/*
125073 + * The next 16 interrupts are for board specific purposes. Since
125074 + * the kernel can only run on one machine at a time, we can re-use
125075 + * these. If you need more, increase IRQ_BOARD_END, but keep it
125076 + * within sensible limits.
125077 + */
125078 +#define IRQ_BOARD_START _NR_IRQS
125079 +#define IRQ_BOARD_END (_NR_IRQS + 10)
125080 +
125081 +#if defined(CONFIG_MACH_NEO1973_GTA02)
125082 +#define NR_IRQS (IRQ_BOARD_END)
125083 +#else
125084 +#define NR_IRQS (IRQ_BOARD_START)
125085 +#endif
125086 +
125087 +/* Neo1973 GTA02 interrupts */
125088 +#define NEO1973_GTA02_IRQ(x) (IRQ_BOARD_START + (x))
125089 +#define IRQ_GLAMO(x) NEO1973_GTA02_IRQ(x)
125090 +#define IRQ_GLAMO_HOSTBUS IRQ_GLAMO(0)
125091 +#define IRQ_GLAMO_JPEG IRQ_GLAMO(1)
125092 +#define IRQ_GLAMO_MPEG IRQ_GLAMO(2)
125093 +#define IRQ_GLAMO_MPROC1 IRQ_GLAMO(3)
125094 +#define IRQ_GLAMO_MPROC0 IRQ_GLAMO(4)
125095 +#define IRQ_GLAMO_CMDQUEUE IRQ_GLAMO(5)
125096 +#define IRQ_GLAMO_2D IRQ_GLAMO(6)
125097 +#define IRQ_GLAMO_MMC IRQ_GLAMO(7)
125098 +#define IRQ_GLAMO_RISC IRQ_GLAMO(8)
125099 +
125100 +/* offset for FIQ IRQ numbers - used by arm fiq.c */
125101 +
125102 +#define FIQ_START 0
125103 +
125104 #endif /* __ASM_ARCH_IRQ_H */
125105 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/mci.h
125106 ===================================================================
125107 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125108 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/mci.h 2008-12-11 22:46:49.000000000 +0100
125109 @@ -0,0 +1,14 @@
125110 +#ifndef _ARCH_MCI_H
125111 +#define _ARCH_MCI_H
125112 +
125113 +struct s3c24xx_mci_pdata {
125114 + unsigned int gpio_detect;
125115 + unsigned int gpio_wprotect;
125116 + unsigned long ocr_avail;
125117 + unsigned int do_dma;
125118 + void (*set_power)(unsigned char power_mode,
125119 + unsigned short vdd);
125120 + int (*use_slow)(void);
125121 +};
125122 +
125123 +#endif /* _ARCH_NCI_H */
125124 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/neo1973-pm-gsm.h
125125 ===================================================================
125126 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125127 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/neo1973-pm-gsm.h 2008-12-11 22:46:49.000000000 +0100
125128 @@ -0,0 +1 @@
125129 +extern int gta_gsm_interrupts;
125130 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/pwm.h
125131 ===================================================================
125132 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125133 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/pwm.h 2008-12-11 22:46:49.000000000 +0100
125134 @@ -0,0 +1,40 @@
125135 +#ifndef __S3C2410_PWM_H
125136 +#define __S3C2410_PWM_H
125137 +
125138 +#include <linux/err.h>
125139 +#include <linux/platform_device.h>
125140 +#include <linux/clk.h>
125141 +
125142 +#include <asm-arm/io.h>
125143 +#include <asm/arch/hardware.h>
125144 +#include <asm/mach-types.h>
125145 +#include <asm/plat-s3c/regs-timer.h>
125146 +#include <asm/arch/gta01.h>
125147 +
125148 +enum pwm_timer {
125149 + PWM0,
125150 + PWM1,
125151 + PWM2,
125152 + PWM3,
125153 + PWM4
125154 +};
125155 +
125156 +struct s3c2410_pwm {
125157 + enum pwm_timer timerid;
125158 + struct clk *pclk;
125159 + unsigned long pclk_rate;
125160 + unsigned long prescaler;
125161 + unsigned long divider;
125162 + unsigned long counter;
125163 + unsigned long comparer;
125164 +};
125165 +
125166 +int s3c2410_pwm_init(struct s3c2410_pwm *s3c2410_pwm);
125167 +int s3c2410_pwm_enable(struct s3c2410_pwm *s3c2410_pwm);
125168 +int s3c2410_pwm_disable(struct s3c2410_pwm *s3c2410_pwm);
125169 +int s3c2410_pwm_start(struct s3c2410_pwm *s3c2410_pwm);
125170 +int s3c2410_pwm_stop(struct s3c2410_pwm *s3c2410_pwm);
125171 +int s3c2410_pwm_duty_cycle(int reg_value, struct s3c2410_pwm *s3c2410_pwm);
125172 +int s3c2410_pwm_dumpregs(void);
125173 +
125174 +#endif /* __S3C2410_PWM_H */
125175 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/regs-dsc.h
125176 ===================================================================
125177 --- linux-2.6.24.7.orig/include/asm-arm/arch-s3c2410/regs-dsc.h 2008-12-11 22:46:07.000000000 +0100
125178 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/regs-dsc.h 2008-12-11 22:46:49.000000000 +0100
125179 @@ -19,7 +19,7 @@
125180 #define S3C2412_DSC1 S3C2410_GPIOREG(0xe0)
125181 #endif
125182
125183 -#if defined(CONFIG_CPU_S3C2440)
125184 +#if defined(CONFIG_CPU_S3C244X)
125185
125186 #define S3C2440_DSC0 S3C2410_GPIOREG(0xc4)
125187 #define S3C2440_DSC1 S3C2410_GPIOREG(0xc8)
125188 @@ -178,7 +178,7 @@
125189 #define S3C2440_DSC1_CS0_4mA (3<<0)
125190 #define S3C2440_DSC1_CS0_MASK (3<<0)
125191
125192 -#endif /* CONFIG_CPU_S3C2440 */
125193 +#endif /* CONFIG_CPU_S3C244X */
125194
125195 #endif /* __ASM_ARCH_REGS_DSC_H */
125196
125197 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/regs-sdi.h
125198 ===================================================================
125199 --- linux-2.6.24.7.orig/include/asm-arm/arch-s3c2410/regs-sdi.h 2008-12-11 22:46:07.000000000 +0100
125200 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/regs-sdi.h 2008-12-11 22:46:49.000000000 +0100
125201 @@ -28,9 +28,17 @@
125202 #define S3C2410_SDIDCNT (0x30)
125203 #define S3C2410_SDIDSTA (0x34)
125204 #define S3C2410_SDIFSTA (0x38)
125205 +
125206 #define S3C2410_SDIDATA (0x3C)
125207 +#define S3C2410_SDIDATA_BYTE (0x3C)
125208 #define S3C2410_SDIIMSK (0x40)
125209
125210 +#define S3C2440_SDIDATA (0x40)
125211 +#define S3C2440_SDIDATA_BYTE (0x48)
125212 +#define S3C2440_SDIIMSK (0x3C)
125213 +
125214 +#define S3C2440_SDICON_SDRESET (1<<8)
125215 +#define S3C2440_SDICON_MMCCLOCK (1<<5)
125216 #define S3C2410_SDICON_BYTEORDER (1<<4)
125217 #define S3C2410_SDICON_SDIOIRQ (1<<3)
125218 #define S3C2410_SDICON_RWAITEN (1<<2)
125219 @@ -42,7 +50,8 @@
125220 #define S3C2410_SDICMDCON_LONGRSP (1<<10)
125221 #define S3C2410_SDICMDCON_WAITRSP (1<<9)
125222 #define S3C2410_SDICMDCON_CMDSTART (1<<8)
125223 -#define S3C2410_SDICMDCON_INDEX (0xff)
125224 +#define S3C2410_SDICMDCON_SENDERHOST (1<<6)
125225 +#define S3C2410_SDICMDCON_INDEX (0x3f)
125226
125227 #define S3C2410_SDICMDSTAT_CRCFAIL (1<<12)
125228 #define S3C2410_SDICMDSTAT_CMDSENT (1<<11)
125229 @@ -51,6 +60,9 @@
125230 #define S3C2410_SDICMDSTAT_XFERING (1<<8)
125231 #define S3C2410_SDICMDSTAT_INDEX (0xff)
125232
125233 +#define S3C2440_SDIDCON_DS_BYTE (0<<22)
125234 +#define S3C2440_SDIDCON_DS_HALFWORD (1<<22)
125235 +#define S3C2440_SDIDCON_DS_WORD (2<<22)
125236 #define S3C2410_SDIDCON_IRQPERIOD (1<<21)
125237 #define S3C2410_SDIDCON_TXAFTERRESP (1<<20)
125238 #define S3C2410_SDIDCON_RXAFTERCMD (1<<19)
125239 @@ -59,6 +71,7 @@
125240 #define S3C2410_SDIDCON_WIDEBUS (1<<16)
125241 #define S3C2410_SDIDCON_DMAEN (1<<15)
125242 #define S3C2410_SDIDCON_STOP (1<<14)
125243 +#define S3C2440_SDIDCON_DATSTART (1<<14)
125244 #define S3C2410_SDIDCON_DATMODE (3<<12)
125245 #define S3C2410_SDIDCON_BLKNUM (0x7ff)
125246
125247 @@ -68,6 +81,7 @@
125248 #define S3C2410_SDIDCON_XFER_RXSTART (2<<12)
125249 #define S3C2410_SDIDCON_XFER_TXSTART (3<<12)
125250
125251 +#define S3C2410_SDIDCON_BLKNUM_MASK (0xFFF)
125252 #define S3C2410_SDIDCNT_BLKNUM_SHIFT (12)
125253
125254 #define S3C2410_SDIDSTA_RDYWAITREQ (1<<10)
125255 @@ -82,10 +96,12 @@
125256 #define S3C2410_SDIDSTA_TXDATAON (1<<1)
125257 #define S3C2410_SDIDSTA_RXDATAON (1<<0)
125258
125259 +#define S3C2440_SDIFSTA_FIFORESET (1<<16)
125260 +#define S3C2440_SDIFSTA_FIFOFAIL (3<<14) /* 3 is correct (2 bits) */
125261 #define S3C2410_SDIFSTA_TFDET (1<<13)
125262 #define S3C2410_SDIFSTA_RFDET (1<<12)
125263 -#define S3C2410_SDIFSTA_TXHALF (1<<11)
125264 -#define S3C2410_SDIFSTA_TXEMPTY (1<<10)
125265 +#define S3C2410_SDIFSTA_TFHALF (1<<11)
125266 +#define S3C2410_SDIFSTA_TFEMPTY (1<<10)
125267 #define S3C2410_SDIFSTA_RFLAST (1<<9)
125268 #define S3C2410_SDIFSTA_RFFULL (1<<8)
125269 #define S3C2410_SDIFSTA_RFHALF (1<<7)
125270 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/s3c24xx-serial.h
125271 ===================================================================
125272 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125273 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/s3c24xx-serial.h 2008-12-11 22:46:49.000000000 +0100
125274 @@ -0,0 +1,5 @@
125275 +#include <linux/resume-dependency.h>
125276 +
125277 +extern void s3c24xx_serial_console_set_silence(int silence);
125278 +extern void s3c24xx_serial_register_resume_dependency(struct resume_dependency *
125279 + resume_dependency, int uart_index);
125280 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/spi-gpio.h
125281 ===================================================================
125282 --- linux-2.6.24.7.orig/include/asm-arm/arch-s3c2410/spi-gpio.h 2008-12-11 22:46:07.000000000 +0100
125283 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/spi-gpio.h 2008-12-11 22:46:49.000000000 +0100
125284 @@ -22,11 +22,12 @@ struct s3c2410_spigpio_info {
125285 unsigned long pin_miso;
125286
125287 int bus_num;
125288 + int num_chipselect;
125289
125290 unsigned long board_size;
125291 struct spi_board_info *board_info;
125292
125293 - void (*chip_select)(struct s3c2410_spigpio_info *spi, int cs);
125294 + void (*chip_select)(struct s3c2410_spigpio_info *spi, int csid, int cs);
125295 };
125296
125297
125298 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2410/ts.h
125299 ===================================================================
125300 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125301 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2410/ts.h 2008-12-11 22:46:49.000000000 +0100
125302 @@ -0,0 +1,30 @@
125303 +/* linux/include/asm/arch-s3c2410/ts.h
125304 + *
125305 + * Copyright (c) 2005 Arnaud Patard <arnaud.patard@rtp-net.org>
125306 + *
125307 + *
125308 + * This program is free software; you can redistribute it and/or modify
125309 + * it under the terms of the GNU General Public License version 2 as
125310 + * published by the Free Software Foundation.
125311 + *
125312 + *
125313 + * Changelog:
125314 + * 24-Mar-2005 RTP Created file
125315 + * 03-Aug-2005 RTP Renamed to ts.h
125316 + */
125317 +
125318 +#ifndef __ASM_ARM_TS_H
125319 +#define __ASM_ARM_TS_H
125320 +
125321 +struct s3c2410_ts_mach_info {
125322 + int delay;
125323 + int presc;
125324 + int oversampling_shift;
125325 + int excursion_filter_len_bits;
125326 + int reject_threshold_vs_avg;
125327 +};
125328 +
125329 +void set_s3c2410ts_info(struct s3c2410_ts_mach_info *hard_s3c2410ts_info);
125330 +
125331 +#endif /* __ASM_ARM_TS_H */
125332 +
125333 Index: linux-2.6.24.7/include/asm-arm/arch-s3c2440/hxd8.h
125334 ===================================================================
125335 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125336 +++ linux-2.6.24.7/include/asm-arm/arch-s3c2440/hxd8.h 2008-12-11 22:46:49.000000000 +0100
125337 @@ -0,0 +1,16 @@
125338 +#ifndef _HXD8_H
125339 +#define _HXD8_H
125340 +
125341 +#include <asm/arch/regs-gpio.h>
125342 +#include <asm/arch/irqs.h>
125343 +
125344 +#define HXD8v1_SYSTEM_REV 0x00000110
125345 +
125346 +#define HXD8_GPIO_USB_CUR_SEL S3C2410_GPA0
125347 +#define HXD8_GPIO_BACKLIGHT S3C2410_GPB0
125348 +#define HXD8_GPIO_USB_PULLUP S3C2410_GPB9
125349 +#define HXD8_GPIO_PCF50606 S3C2410_GPF6
125350 +
125351 +#define HXD8_IRQ_PCF50606 IRQ_EINT6
125352 +
125353 +#endif
125354 Index: linux-2.6.24.7/include/asm-arm/kexec.h
125355 ===================================================================
125356 --- linux-2.6.24.7.orig/include/asm-arm/kexec.h 2008-12-11 22:46:07.000000000 +0100
125357 +++ linux-2.6.24.7/include/asm-arm/kexec.h 2008-12-11 22:46:49.000000000 +0100
125358 @@ -1,8 +1,6 @@
125359 #ifndef _ARM_KEXEC_H
125360 #define _ARM_KEXEC_H
125361
125362 -#ifdef CONFIG_KEXEC
125363 -
125364 /* Maximum physical address we can use pages from */
125365 #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
125366 /* Maximum address we can reach in physical address mode */
125367 @@ -16,6 +14,11 @@
125368
125369 #define KEXEC_BOOT_PARAMS_SIZE 1536
125370
125371 +#ifdef CONFIG_KEXEC
125372 +
125373 +#define KEXEC_ARM_ATAGS_OFFSET 0x1000
125374 +#define KEXEC_ARM_ZIMAGE_OFFSET 0x8000
125375 +
125376 #ifndef __ASSEMBLY__
125377
125378 struct kimage;
125379 Index: linux-2.6.24.7/include/asm-arm/plat-s3c/nand.h
125380 ===================================================================
125381 --- linux-2.6.24.7.orig/include/asm-arm/plat-s3c/nand.h 2008-12-11 22:46:07.000000000 +0100
125382 +++ linux-2.6.24.7/include/asm-arm/plat-s3c/nand.h 2008-12-11 22:46:49.000000000 +0100
125383 @@ -21,9 +21,12 @@
125384 * partitions = mtd partition list
125385 */
125386
125387 +#define S3C2410_NAND_BBT 0x0001
125388 +
125389 struct s3c2410_nand_set {
125390 int nr_chips;
125391 int nr_partitions;
125392 + unsigned int flags;
125393 char *name;
125394 int *nr_map;
125395 struct mtd_partition *partitions;
125396 @@ -39,6 +42,9 @@ struct s3c2410_platform_nand {
125397 int nr_sets;
125398 struct s3c2410_nand_set *sets;
125399
125400 + /* force software_ecc at runtime */
125401 + int software_ecc;
125402 +
125403 void (*select_chip)(struct s3c2410_nand_set *,
125404 int chip);
125405 };
125406 Index: linux-2.6.24.7/include/asm-arm/plat-s3c24xx/devs.h
125407 ===================================================================
125408 --- linux-2.6.24.7.orig/include/asm-arm/plat-s3c24xx/devs.h 2008-12-11 22:46:07.000000000 +0100
125409 +++ linux-2.6.24.7/include/asm-arm/plat-s3c24xx/devs.h 2008-12-11 22:46:49.000000000 +0100
125410 @@ -42,6 +42,7 @@ extern struct platform_device s3c_device
125411 extern struct platform_device s3c_device_timer3;
125412
125413 extern struct platform_device s3c_device_usbgadget;
125414 +extern struct platform_device s3c_device_ts;
125415
125416 /* s3c2440 specific devices */
125417
125418 Index: linux-2.6.24.7/include/asm-arm/plat-s3c24xx/irq.h
125419 ===================================================================
125420 --- linux-2.6.24.7.orig/include/asm-arm/plat-s3c24xx/irq.h 2008-12-11 22:46:07.000000000 +0100
125421 +++ linux-2.6.24.7/include/asm-arm/plat-s3c24xx/irq.h 2008-12-11 22:46:49.000000000 +0100
125422 @@ -23,8 +23,15 @@ s3c_irqsub_mask(unsigned int irqno, unsi
125423 {
125424 unsigned long mask;
125425 unsigned long submask;
125426 +#ifdef CONFIG_S3C2440_C_FIQ
125427 + unsigned long flags;
125428 +#endif
125429
125430 submask = __raw_readl(S3C2410_INTSUBMSK);
125431 +#ifdef CONFIG_S3C2440_C_FIQ
125432 + local_save_flags(flags);
125433 + local_fiq_disable();
125434 +#endif
125435 mask = __raw_readl(S3C2410_INTMSK);
125436
125437 submask |= (1UL << (irqno - IRQ_S3CUART_RX0));
125438 @@ -37,6 +44,9 @@ s3c_irqsub_mask(unsigned int irqno, unsi
125439
125440 /* write back masks */
125441 __raw_writel(submask, S3C2410_INTSUBMSK);
125442 +#ifdef CONFIG_S3C2440_C_FIQ
125443 + local_irq_restore(flags);
125444 +#endif
125445
125446 }
125447
125448 @@ -45,8 +55,15 @@ s3c_irqsub_unmask(unsigned int irqno, un
125449 {
125450 unsigned long mask;
125451 unsigned long submask;
125452 +#ifdef CONFIG_S3C2440_C_FIQ
125453 + unsigned long flags;
125454 +#endif
125455
125456 submask = __raw_readl(S3C2410_INTSUBMSK);
125457 +#ifdef CONFIG_S3C2440_C_FIQ
125458 + local_save_flags(flags);
125459 + local_fiq_disable();
125460 +#endif
125461 mask = __raw_readl(S3C2410_INTMSK);
125462
125463 submask &= ~(1UL << (irqno - IRQ_S3CUART_RX0));
125464 @@ -55,6 +72,9 @@ s3c_irqsub_unmask(unsigned int irqno, un
125465 /* write back masks */
125466 __raw_writel(submask, S3C2410_INTSUBMSK);
125467 __raw_writel(mask, S3C2410_INTMSK);
125468 +#ifdef CONFIG_S3C2440_C_FIQ
125469 + local_irq_restore(flags);
125470 +#endif
125471 }
125472
125473
125474 Index: linux-2.6.24.7/include/asm-arm/plat-s3c24xx/neo1973.h
125475 ===================================================================
125476 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125477 +++ linux-2.6.24.7/include/asm-arm/plat-s3c24xx/neo1973.h 2008-12-11 22:46:49.000000000 +0100
125478 @@ -0,0 +1,33 @@
125479 +/*
125480 + * include/asm-arm/plat-s3c24xx/neo1973.h
125481 + *
125482 + * Common utility code for GTA01 and GTA02
125483 + *
125484 + * Copyright (C) 2008 by Openmoko, Inc.
125485 + * Author: Holger Hans Peter Freyther <freyther@openmoko.org>
125486 + * All rights reserved.
125487 + *
125488 + * This program is free software; you can redistribute it and/or
125489 + * modify it under the terms of the GNU General Public License as
125490 + * published by the Free Software Foundation; either version 2 of
125491 + * the License, or (at your option) any later version.
125492 + *
125493 + * This program is distributed in the hope that it will be useful,
125494 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
125495 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
125496 + * GNU General Public License for more details.
125497 + *
125498 + * You should have received a copy of the GNU General Public License
125499 + * along with this program; if not, write to the Free Software
125500 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
125501 + * MA 02111-1307 USA
125502 + *
125503 + */
125504 +
125505 +#ifndef NEO1973_H
125506 +#define NEO1973_H
125507 +
125508 +void neo1973_gpb_add_shadow_gpio(unsigned int gpio);
125509 +void neo1973_gpb_setpin(unsigned int pin, unsigned to);
125510 +
125511 +#endif
125512 Index: linux-2.6.24.7/include/linux/bq27000_battery.h
125513 ===================================================================
125514 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125515 +++ linux-2.6.24.7/include/linux/bq27000_battery.h 2008-12-11 22:46:49.000000000 +0100
125516 @@ -0,0 +1,16 @@
125517 +#ifndef __BQ27000_BATTERY_H__
125518 +#define __BQ27000_BATTERY_H__
125519 +
125520 +void bq27000_charging_state_change(struct platform_device *pdev);
125521 +
125522 +struct bq27000_platform_data {
125523 + const char *name;
125524 + int rsense_mohms;
125525 + int (*hdq_read)(int);
125526 + int (*hdq_write)(int, u8);
125527 + int (*hdq_initialized)(void);
125528 + int (*get_charger_online_status)(void);
125529 + int (*get_charger_active_status)(void);
125530 +};
125531 +
125532 +#endif
125533 Index: linux-2.6.24.7/include/linux/fb.h
125534 ===================================================================
125535 --- linux-2.6.24.7.orig/include/linux/fb.h 2008-12-11 22:46:07.000000000 +0100
125536 +++ linux-2.6.24.7/include/linux/fb.h 2008-12-11 22:46:49.000000000 +0100
125537 @@ -120,6 +120,7 @@ struct dentry;
125538 #define FB_ACCEL_XGI_VOLARI_V 47 /* XGI Volari V3XT, V5, V8 */
125539 #define FB_ACCEL_XGI_VOLARI_Z 48 /* XGI Volari Z7 */
125540 #define FB_ACCEL_OMAP1610 49 /* TI OMAP16xx */
125541 +#define FB_ACCEL_GLAMO 50 /* SMedia Glamo */
125542 #define FB_ACCEL_NEOMAGIC_NM2070 90 /* NeoMagic NM2070 */
125543 #define FB_ACCEL_NEOMAGIC_NM2090 91 /* NeoMagic NM2090 */
125544 #define FB_ACCEL_NEOMAGIC_NM2093 92 /* NeoMagic NM2093 */
125545 Index: linux-2.6.24.7/include/linux/glamofb.h
125546 ===================================================================
125547 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125548 +++ linux-2.6.24.7/include/linux/glamofb.h 2008-12-11 22:46:49.000000000 +0100
125549 @@ -0,0 +1,48 @@
125550 +#ifndef _LINUX_GLAMOFB_H
125551 +#define _LINUX_GLAMOFB_H
125552 +
125553 +#include <linux/spi/glamo.h>
125554 +#include <linux/resume-dependency.h>
125555 +
125556 +struct glamofb_val {
125557 + unsigned int defval;
125558 + unsigned int min;
125559 + unsigned int max;
125560 +};
125561 +
125562 +struct glamo_core;
125563 +
125564 +struct glamofb_platform_data {
125565 + int width, height;
125566 + int pixclock;
125567 + int left_margin, right_margin;
125568 + int upper_margin, lower_margin;
125569 + int hsync_len, vsync_len;
125570 + int fb_mem_size;
125571 +
125572 + struct glamofb_val xres;
125573 + struct glamofb_val yres;
125574 + struct glamofb_val bpp;
125575 +
125576 + struct glamo_spi_info *spi_info;
125577 + struct glamo_spigpio_info *spigpio_info;
125578 + struct glamo_core *glamo;
125579 +
125580 + /* glamo mmc platform specific info */
125581 + void (*glamo_set_mci_power)(unsigned char power_mode,
125582 + unsigned short vdd);
125583 + /* glamo-mci asking if it should use the slow clock to card */
125584 + int (*glamo_mci_use_slow)(void);
125585 + int (*glamo_irq_is_wired)(void);
125586 + void (*mci_suspending)(struct platform_device *dev);
125587 + int (*mci_all_dependencies_resumed)(struct platform_device
125588 + *dev);
125589 +};
125590 +
125591 +int glamofb_cmd_mode(struct glamofb_handle *gfb, int on);
125592 +int glamofb_cmd_write(struct glamofb_handle *gfb, u_int16_t val);
125593 +void glamo_lcm_reset(int level);
125594 +extern void
125595 +glamo_register_resume_dependency(struct resume_dependency * resume_dependency);
125596 +
125597 +#endif
125598 Index: linux-2.6.24.7/include/linux/glamo-gpio.h
125599 ===================================================================
125600 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125601 +++ linux-2.6.24.7/include/linux/glamo-gpio.h 2008-12-11 22:46:49.000000000 +0100
125602 @@ -0,0 +1,99 @@
125603 +#ifndef __GLAMO_GPIO_H
125604 +#define __GLAMO_GPIO_H
125605 +
125606 +struct glamo_core;
125607 +
125608 +#define GLAMO_GPIO_BANKA 0x0000
125609 +#define GLAMO_GPIO_BANKB 0x1000
125610 +#define GLAMO_GPIO_BANKC 0x2000
125611 +#define GLAMO_GPIO_BANKD 0x3000
125612 +
125613 +#define GLAMO_GPIONO(bank, pin) ((bank & 0xf000) | ((pin & 0xf) << 8))
125614 +
125615 +#define GLAMO_GPIO_F_IN 0x0010
125616 +#define GLAMO_GPIO_F_OUT 0x0020
125617 +#define GLAMO_GPIO_F_FUNC 0x0030
125618 +
125619 +#define GLAMO_GPIO0 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 0)
125620 +#define GLAMO_GPIO0_INPUT (GLAMO_GPIO0 | GLAMO_GPIO_F_IN)
125621 +#define GLAMO_GPIO0_OUTPUT (GLAMO_GPIO0 | GLAMO_GPIO_F_OUT)
125622 +#define GLAMO_GPIO0_HA20 (GLAMO_GPIO0 | GLAMO_GPIO_F_FUNC)
125623 +
125624 +#define GLAMO_GPIO1 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 1)
125625 +#define GLAMO_GPIO1_INPUT (GLAMO_GPIO1 | GLAMO_GPIO_F_IN)
125626 +#define GLAMO_GPIO1_OUTPUT (GLAMO_GPIO1 | GLAMO_GPIO_F_OUT)
125627 +#define GLAMO_GPIO1_HA21 (GLAMO_GPIO1 | GLAMO_GPIO_F_FUNC)
125628 +
125629 +#define GLAMO_GPIO2 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 2)
125630 +#define GLAMO_GPIO2_INPUT (GLAMO_GPIO2 | GLAMO_GPIO_F_IN)
125631 +#define GLAMO_GPIO2_OUTPUT (GLAMO_GPIO2 | GLAMO_GPIO_F_OUT)
125632 +#define GLAMO_GPIO2_HA22 (GLAMO_GPIO2 | GLAMO_GPIO_F_FUNC)
125633 +
125634 +#define GLAMO_GPIO3 GLAMO_GPIONO(GLAMO_GPIO_BANKA, 3)
125635 +#define GLAMO_GPIO3_INPUT (GLAMO_GPIO3 | GLAMO_GPIO_F_IN)
125636 +#define GLAMO_GPIO3_OUTPUT (GLAMO_GPIO3 | GLAMO_GPIO_F_OUT)
125637 +#define GLAMO_GPIO3_HA23 (GLAMO_GPIO3 | GLAMO_GPIO_F_FUNC)
125638 +
125639 +#define GLAMO_GPIO4 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 0)
125640 +#define GLAMO_GPIO4_INPUT (GLAMO_GPIO4 | GLAMO_GPIO_F_IN)
125641 +#define GLAMO_GPIO4_OUTPUT (GLAMO_GPIO4 | GLAMO_GPIO_F_OUT)
125642 +#define GLAMO_GPIO4_nLCS0 (GLAMO_GPIO4 | GLAMO_GPIO_F_FUNC)
125643 +
125644 +#define GLAMO_GPIO5 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 1)
125645 +#define GLAMO_GPIO5_INPUT (GLAMO_GPIO5 | GLAMO_GPIO_F_IN)
125646 +#define GLAMO_GPIO5_OUTPUT (GLAMO_GPIO5 | GLAMO_GPIO_F_OUT)
125647 +#define GLAMO_GPIO5_nLCS1 (GLAMO_GPIO5 | GLAMO_GPIO_F_FUNC)
125648 +
125649 +#define GLAMO_GPIO6 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 2)
125650 +#define GLAMO_GPIO6_INPUT (GLAMO_GPIO6 | GLAMO_GPIO_F_IN)
125651 +#define GLAMO_GPIO6_OUTPUT (GLAMO_GPIO6 | GLAMO_GPIO_F_OUT)
125652 +#define GLAMO_GPIO6_LDCLK (GLAMO_GPIO6 | GLAMO_GPIO_F_FUNC)
125653 +
125654 +#define GLAMO_GPIO7 GLAMO_GPIONO(GLAMO_GPIO_BANKB, 3)
125655 +#define GLAMO_GPIO7_INPUT (GLAMO_GPIO7 | GLAMO_GPIO_F_IN)
125656 +#define GLAMO_GPIO7_OUTPUT (GLAMO_GPIO7 | GLAMO_GPIO_F_OUT)
125657 +#define GLAMO_GPIO7_nLDE (GLAMO_GPIO7 | GLAMO_GPIO_F_FUNC)
125658 +
125659 +#define GLAMO_GPIO8 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 0)
125660 +#define GLAMO_GPIO8_INPUT (GLAMO_GPIO8 | GLAMO_GPIO_F_IN)
125661 +#define GLAMO_GPIO8_OUTPUT (GLAMO_GPIO8 | GLAMO_GPIO_F_OUT)
125662 +#define GLAMO_GPIO8_LD16 (GLAMO_GPIO8 | GLAMO_GPIO_F_FUNC)
125663 +
125664 +#define GLAMO_GPIO9 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 1)
125665 +#define GLAMO_GPIO9_INPUT (GLAMO_GPIO9 | GLAMO_GPIO_F_IN)
125666 +#define GLAMO_GPIO9_OUTPUT (GLAMO_GPIO9 | GLAMO_GPIO_F_OUT)
125667 +#define GLAMO_GPIO9_LD17 (GLAMO_GPIO9 | GLAMO_GPIO_F_FUNC)
125668 +
125669 +#define GLAMO_GPIO10 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 2)
125670 +#define GLAMO_GPIO10_INPUT (GLAMO_GPIO10 | GLAMO_GPIO_F_IN)
125671 +#define GLAMO_GPIO10_OUTPUT (GLAMO_GPIO10 | GLAMO_GPIO_F_OUT)
125672 +#define GLAMO_GPIO10_LSCK (GLAMO_GPIO10 | GLAMO_GPIO_F_FUNC)
125673 +
125674 +#define GLAMO_GPIO11 GLAMO_GPIONO(GLAMO_GPIO_BANKC, 3)
125675 +#define GLAMO_GPIO11_INPUT (GLAMO_GPIO11 | GLAMO_GPIO_F_IN)
125676 +#define GLAMO_GPIO11_OUTPUT (GLAMO_GPIO11 | GLAMO_GPIO_F_OUT)
125677 +#define GLAMO_GPIO11_LSDA (GLAMO_GPIO11 | GLAMO_GPIO_F_FUNC)
125678 +
125679 +#define GLAMO_GPIO12 GLAMO_GPIONO(GLAMO_GPIO_BANKD, 0)
125680 +#define GLAMO_GPIO12_INPUT (GLAMO_GPIO12 | GLAMO_GPIO_F_IN)
125681 +#define GLAMO_GPIO12_OUTPUT (GLAMO_GPIO12 | GLAMO_GPIO_F_OUT)
125682 +#define GLAMO_GPIO12_LSA0 (GLAMO_GPIO12 | GLAMO_GPIO_F_FUNC)
125683 +
125684 +
125685 +#define REG_OF_GPIO(gpio) (((gpio & 0xf000) >> 12)*2 \
125686 + + GLAMO_REG_GPIO_GEN1)
125687 +#define NUM_OF_GPIO(gpio) ((gpio & 0x0f00) >> 8)
125688 +#define GPIO_OUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 0))
125689 +#define OUTPUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 4))
125690 +#define INPUT_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 8))
125691 +#define FUNC_BIT(gpio) (1 << (NUM_OF_GPIO(gpio) + 12))
125692 +
125693 +void glamo_gpio_setpin(struct glamo_core *glamo, unsigned int pin,
125694 + unsigned int value);
125695 +
125696 +int glamo_gpio_getpin(struct glamo_core *glamo, unsigned int pin);
125697 +
125698 +void glamo_gpio_cfgpin(struct glamo_core *glamo, unsigned int pinfunc);
125699 +
125700 +
125701 +#endif /* _GLAMO_GPIO */
125702 Index: linux-2.6.24.7/include/linux/gta02_hdq.h
125703 ===================================================================
125704 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125705 +++ linux-2.6.24.7/include/linux/gta02_hdq.h 2008-12-11 22:46:49.000000000 +0100
125706 @@ -0,0 +1,8 @@
125707 +#ifndef __GTA02HDQ_H__
125708 +#define __GTA02HDQ_H__
125709 +
125710 +int gta02hdq_read(int address);
125711 +int gta02hdq_write(int address, u8 data);
125712 +int gta02hdq_initialized(void);
125713 +
125714 +#endif
125715 Index: linux-2.6.24.7/include/linux/i2c-id.h
125716 ===================================================================
125717 --- linux-2.6.24.7.orig/include/linux/i2c-id.h 2008-12-11 22:46:07.000000000 +0100
125718 +++ linux-2.6.24.7/include/linux/i2c-id.h 2008-12-11 22:46:49.000000000 +0100
125719 @@ -167,6 +167,10 @@
125720 #define I2C_DRIVERID_FSCHER 1046
125721 #define I2C_DRIVERID_W83L785TS 1047
125722 #define I2C_DRIVERID_OV7670 1048 /* Omnivision 7670 camera */
125723 +#define I2C_DRIVERID_PCF50606 1049
125724 +#define I2C_DRIVERID_TSL256X 1050
125725 +#define I2C_DRIVERID_PCF50633 1051
125726 +#define I2C_DRIVERID_PCA9632 1052
125727
125728 /*
125729 * ---- Adapter types ----------------------------------------------------
125730 Index: linux-2.6.24.7/include/linux/jbt6k74.h
125731 ===================================================================
125732 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125733 +++ linux-2.6.24.7/include/linux/jbt6k74.h 2008-12-11 22:46:49.000000000 +0100
125734 @@ -0,0 +1,13 @@
125735 +#ifndef __JBT6K74_H__
125736 +#define __JBT6K74_H__
125737 +
125738 +#include <linux/spi/spi.h>
125739 +
125740 +struct jbt6k74_platform_data {
125741 + void (*reset)(int devindex, int level);
125742 + void (*resuming)(int devindex); /* called when LCM is resumed */
125743 + void (*suspending)(int devindex, struct spi_device *spi);
125744 + int (*all_dependencies_resumed)(int devindex);
125745 +};
125746 +
125747 +#endif
125748 Index: linux-2.6.24.7/include/linux/kernel.h
125749 ===================================================================
125750 --- linux-2.6.24.7.orig/include/linux/kernel.h 2008-12-11 22:46:07.000000000 +0100
125751 +++ linux-2.6.24.7/include/linux/kernel.h 2008-12-11 22:46:49.000000000 +0100
125752 @@ -182,6 +182,8 @@ asmlinkage int printk(const char * fmt,
125753 extern int log_buf_get_len(void);
125754 extern int log_buf_read(int idx);
125755 extern int log_buf_copy(char *dest, int idx, int len);
125756 +extern void (*printk_emergency_debug_spew_init)(void);
125757 +extern void (*printk_emergency_debug_spew_send_string)(const char *);
125758 #else
125759 static inline int vprintk(const char *s, va_list args)
125760 __attribute__ ((format (printf, 1, 0)));
125761 Index: linux-2.6.24.7/include/linux/kexec.h
125762 ===================================================================
125763 --- linux-2.6.24.7.orig/include/linux/kexec.h 2008-12-11 22:46:07.000000000 +0100
125764 +++ linux-2.6.24.7/include/linux/kexec.h 2008-12-11 22:46:49.000000000 +0100
125765 @@ -1,7 +1,6 @@
125766 #ifndef LINUX_KEXEC_H
125767 #define LINUX_KEXEC_H
125768
125769 -#ifdef CONFIG_KEXEC
125770 #include <linux/types.h>
125771 #include <linux/list.h>
125772 #include <linux/linkage.h>
125773 @@ -11,6 +10,8 @@
125774 #include <linux/elf.h>
125775 #include <asm/kexec.h>
125776
125777 +#ifdef CONFIG_KEXEC
125778 +
125779 /* Verify architecture specific macros are defined */
125780
125781 #ifndef KEXEC_SOURCE_MEMORY_LIMIT
125782 Index: linux-2.6.24.7/include/linux/lis302dl.h
125783 ===================================================================
125784 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125785 +++ linux-2.6.24.7/include/linux/lis302dl.h 2008-12-11 22:46:49.000000000 +0100
125786 @@ -0,0 +1,156 @@
125787 +#ifndef _LINUX_LIS302DL_H
125788 +#define _LINUX_LIS302DL_H
125789 +
125790 +#include <linux/types.h>
125791 +#include <linux/spi/spi.h>
125792 +#include <linux/input.h>
125793 +
125794 +
125795 +struct lis302dl_info;
125796 +
125797 +struct lis302dl_platform_data {
125798 + char *name;
125799 + unsigned long pin_chip_select;
125800 + unsigned long pin_clk;
125801 + unsigned long pin_mosi;
125802 + unsigned long pin_miso;
125803 + int open_drain;
125804 + int interrupt;
125805 + void (*lis302dl_bitbang)(struct lis302dl_info *lis, u8 *tx,
125806 + int tx_bytes, u8 *rx, int rx_bytes);
125807 + void (*lis302dl_suspend_io)(struct lis302dl_info *, int resuming);
125808 + int (*lis302dl_bitbang_reg_read)(struct lis302dl_info *, u8 reg);
125809 + void (*lis302dl_bitbang_reg_write)(struct lis302dl_info *, u8 reg,
125810 + u8 val);
125811 +};
125812 +
125813 +struct lis302dl_info {
125814 + struct lis302dl_platform_data *pdata;
125815 + struct device *dev;
125816 + struct input_dev *input_dev;
125817 + unsigned int flags;
125818 + unsigned int threshold;
125819 + unsigned int duration;
125820 + struct {
125821 + u8 cfg;
125822 + u8 threshold;
125823 + u8 duration;
125824 + int active;
125825 + } wakeup;
125826 + u_int8_t regs[0x40];
125827 +};
125828 +
125829 +enum lis302dl_reg {
125830 + LIS302DL_REG_WHO_AM_I = 0x0f,
125831 + LIS302DL_REG_CTRL1 = 0x20,
125832 + LIS302DL_REG_CTRL2 = 0x21,
125833 + LIS302DL_REG_CTRL3 = 0x22,
125834 + LIS302DL_REG_HP_FILTER_RESET = 0x23,
125835 + LIS302DL_REG_STATUS = 0x27,
125836 + LIS302DL_REG_OUT_X = 0x29,
125837 + LIS302DL_REG_OUT_Y = 0x2b,
125838 + LIS302DL_REG_OUT_Z = 0x2d,
125839 + LIS302DL_REG_FF_WU_CFG_1 = 0x30,
125840 + LIS302DL_REG_FF_WU_SRC_1 = 0x31,
125841 + LIS302DL_REG_FF_WU_THS_1 = 0x32,
125842 + LIS302DL_REG_FF_WU_DURATION_1 = 0x33,
125843 + LIS302DL_REG_FF_WU_CFG_2 = 0x34,
125844 + LIS302DL_REG_FF_WU_SRC_2 = 0x35,
125845 + LIS302DL_REG_FF_WU_THS_2 = 0x36,
125846 + LIS302DL_REG_FF_WU_DURATION_2 = 0x37,
125847 + LIS302DL_REG_CLICK_CFG = 0x38,
125848 + LIS302DL_REG_CLICK_SRC = 0x39,
125849 + LIS302DL_REG_CLICK_THSY_X = 0x3b,
125850 + LIS302DL_REG_CLICK_THSZ = 0x3c,
125851 + LIS302DL_REG_CLICK_TIME_LIMIT = 0x3d,
125852 + LIS302DL_REG_CLICK_LATENCY = 0x3e,
125853 + LIS302DL_REG_CLICK_WINDOW = 0x3f,
125854 +};
125855 +
125856 +enum lis302dl_reg_ctrl1 {
125857 + LIS302DL_CTRL1_Xen = 0x01,
125858 + LIS302DL_CTRL1_Yen = 0x02,
125859 + LIS302DL_CTRL1_Zen = 0x04,
125860 + LIS302DL_CTRL1_STM = 0x08,
125861 + LIS302DL_CTRL1_STP = 0x10,
125862 + LIS302DL_CTRL1_FS = 0x20,
125863 + LIS302DL_CTRL1_PD = 0x40,
125864 + LIS302DL_CTRL1_DR = 0x80,
125865 +};
125866 +
125867 +enum lis302dl_reg_ctrl2 {
125868 + LIS302DL_CTRL2_HPC1 = 0x01,
125869 + LIS302DL_CTRL2_HPC2 = 0x02,
125870 + LIS302DL_CTRL2_HPFF1 = 0x04,
125871 + LIS302DL_CTRL2_HPFF2 = 0x08,
125872 + LIS302DL_CTRL2_FDS = 0x10,
125873 + LIS302DL_CTRL2_BOOT = 0x40,
125874 + LIS302DL_CTRL2_SIM = 0x80,
125875 +};
125876 +enum lis302dl_reg_ctrl3 {
125877 + LIS302DL_CTRL3_PP_OD = 0x40,
125878 + LIS302DL_CTRL3_IHL = 0x80,
125879 +};
125880 +
125881 +enum lis302dl_reg_status {
125882 + LIS302DL_STATUS_XDA = 0x01,
125883 + LIS302DL_STATUS_YDA = 0x02,
125884 + LIS302DL_STATUS_ZDA = 0x04,
125885 + LIS302DL_STATUS_XYZDA = 0x08,
125886 + LIS302DL_STATUS_XOR = 0x10,
125887 + LIS302DL_STATUS_YOR = 0x20,
125888 + LIS302DL_STATUS_ZOR = 0x40,
125889 + LIS302DL_STATUS_XYZOR = 0x80,
125890 +};
125891 +
125892 +/* Wakeup/freefall interrupt defs */
125893 +enum lis302dl_reg_ffwucfg {
125894 + LIS302DL_FFWUCFG_XLIE = 0x01,
125895 + LIS302DL_FFWUCFG_XHIE = 0x02,
125896 + LIS302DL_FFWUCFG_YLIE = 0x04,
125897 + LIS302DL_FFWUCFG_YHIE = 0x08,
125898 + LIS302DL_FFWUCFG_ZLIE = 0x10,
125899 + LIS302DL_FFWUCFG_ZHIE = 0x20,
125900 + LIS302DL_FFWUCFG_LIR = 0x40,
125901 + LIS302DL_FFWUCFG_AOI = 0x80,
125902 +};
125903 +
125904 +enum lis302dl_reg_ffwuths {
125905 + LIS302DL_FFWUTHS_DCRM = 0x80,
125906 +};
125907 +
125908 +enum lis302dl_reg_ffwusrc {
125909 + LIS302DL_FFWUSRC_XL = 0x01,
125910 + LIS302DL_FFWUSRC_XH = 0x02,
125911 + LIS302DL_FFWUSRC_YL = 0x04,
125912 + LIS302DL_FFWUSRC_YH = 0x08,
125913 + LIS302DL_FFWUSRC_ZL = 0x10,
125914 + LIS302DL_FFWUSRC_ZH = 0x20,
125915 + LIS302DL_FFWUSRC_IA = 0x40,
125916 +};
125917 +
125918 +enum lis302dl_reg_cloik_src {
125919 + LIS302DL_CLICKSRC_SINGLE_X = 0x01,
125920 + LIS302DL_CLICKSRC_DOUBLE_X = 0x02,
125921 + LIS302DL_CLICKSRC_SINGLE_Y = 0x04,
125922 + LIS302DL_CLICKSRC_DOUBLE_Y = 0x08,
125923 + LIS302DL_CLICKSRC_SINGLE_Z = 0x10,
125924 + LIS302DL_CLICKSRC_DOUBLE_Z = 0x20,
125925 + LIS302DL_CLICKSRC_IA = 0x40,
125926 +};
125927 +
125928 +#define LIS302DL_WHO_AM_I_MAGIC 0x3b
125929 +
125930 +#define LIS302DL_F_WUP_FF_1 0x0001 /* wake up from free fall */
125931 +#define LIS302DL_F_WUP_FF_2 0x0002
125932 +#define LIS302DL_F_WUP_FF 0x0003
125933 +#define LIS302DL_F_WUP_CLICK 0x0004
125934 +#define LIS302DL_F_POWER 0x0010
125935 +#define LIS302DL_F_FS 0x0020 /* ADC full scale */
125936 +#define LIS302DL_F_INPUT_OPEN 0x0040 /* Set if input device is opened */
125937 +#define LIS302DL_F_IRQ_WAKE 0x0080 /* IRQ is setup in wake mode */
125938 +#define LIS302DL_F_DR 0x0100 /* Data rate, 400Hz/100Hz */
125939 +
125940 +
125941 +#endif /* _LINUX_LIS302DL_H */
125942 +
125943 Index: linux-2.6.24.7/include/linux/pcf50606.h
125944 ===================================================================
125945 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
125946 +++ linux-2.6.24.7/include/linux/pcf50606.h 2008-12-11 22:46:49.000000000 +0100
125947 @@ -0,0 +1,91 @@
125948 +#ifndef _LINUX_PCF50606_H
125949 +#define _LINUX_PCF50606_H
125950 +
125951 +#include <linux/pcf506xx.h>
125952 +
125953 +
125954 +/* public in-kernel pcf50606 api */
125955 +enum pcf50606_regulator_id {
125956 + PCF50606_REGULATOR_DCD,
125957 + PCF50606_REGULATOR_DCDE,
125958 + PCF50606_REGULATOR_DCUD,
125959 + PCF50606_REGULATOR_D1REG,
125960 + PCF50606_REGULATOR_D2REG,
125961 + PCF50606_REGULATOR_D3REG,
125962 + PCF50606_REGULATOR_LPREG,
125963 + PCF50606_REGULATOR_IOREG,
125964 + __NUM_PCF50606_REGULATORS
125965 +};
125966 +
125967 +struct pcf50606_data;
125968 +
125969 +/* This is an ugly construct on how to access the (currently single/global)
125970 + * pcf50606 handle from other code in the kernel. I didn't really come up with
125971 + * a more decent method of dynamically resolving this */
125972 +extern struct pcf50606_data *pcf50606_global;
125973 +
125974 +extern void
125975 +pcf50606_go_standby(void);
125976 +
125977 +extern void
125978 +pcf50606_gpo0_set(struct pcf50606_data *pcf, int on);
125979 +
125980 +extern int
125981 +pcf50606_gpo0_get(struct pcf50606_data *pcf);
125982 +
125983 +extern int
125984 +pcf50606_voltage_set(struct pcf50606_data *pcf,
125985 + enum pcf50606_regulator_id reg,
125986 + unsigned int millivolts);
125987 +extern unsigned int
125988 +pcf50606_voltage_get(struct pcf50606_data *pcf,
125989 + enum pcf50606_regulator_id reg);
125990 +extern int
125991 +pcf50606_onoff_get(struct pcf50606_data *pcf,
125992 + enum pcf50606_regulator_id reg);
125993 +
125994 +extern int
125995 +pcf50606_onoff_set(struct pcf50606_data *pcf,
125996 + enum pcf50606_regulator_id reg, int on);
125997 +
125998 +extern void
125999 +pcf50606_charge_fast(struct pcf50606_data *pcf, int on);
126000 +
126001 +
126002 +#define PCF50606_FEAT_EXTON 0x00000001 /* not yet supported */
126003 +#define PCF50606_FEAT_MBC 0x00000002
126004 +#define PCF50606_FEAT_BBC 0x00000004 /* not yet supported */
126005 +#define PCF50606_FEAT_TSC 0x00000008 /* not yet supported */
126006 +#define PCF50606_FEAT_WDT 0x00000010
126007 +#define PCF50606_FEAT_ACD 0x00000020
126008 +#define PCF50606_FEAT_RTC 0x00000040
126009 +#define PCF50606_FEAT_PWM 0x00000080
126010 +#define PCF50606_FEAT_CHGCUR 0x00000100
126011 +#define PCF50606_FEAT_BATVOLT 0x00000200
126012 +#define PCF50606_FEAT_BATTEMP 0x00000400
126013 +#define PCF50606_FEAT_PWM_BL 0x00000800
126014 +
126015 +struct pcf50606_platform_data {
126016 + /* general */
126017 + unsigned int used_features;
126018 + unsigned int onkey_seconds_required;
126019 +
126020 + /* voltage regulator related */
126021 + struct pmu_voltage_rail rails[__NUM_PCF50606_REGULATORS];
126022 + unsigned int used_regulators;
126023 +
126024 + /* charger related */
126025 + unsigned int r_fix_batt;
126026 + unsigned int r_fix_batt_par;
126027 + unsigned int r_sense_milli;
126028 +
126029 + /* backlight related */
126030 + unsigned int init_brightness;
126031 +
126032 + struct {
126033 + u_int8_t mbcc3; /* charger voltage / current */
126034 + } charger;
126035 + pmu_cb cb;
126036 +};
126037 +
126038 +#endif
126039 Index: linux-2.6.24.7/include/linux/pcf50633.h
126040 ===================================================================
126041 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
126042 +++ linux-2.6.24.7/include/linux/pcf50633.h 2008-12-11 22:46:49.000000000 +0100
126043 @@ -0,0 +1,180 @@
126044 +#ifndef _LINUX_PCF50633_H
126045 +#define _LINUX_PCF50633_H
126046 +
126047 +#include <linux/pcf506xx.h>
126048 +#include <linux/resume-dependency.h>
126049 +
126050 +
126051 +/* public in-kernel pcf50633 api */
126052 +enum pcf50633_regulator_id {
126053 + PCF50633_REGULATOR_AUTO,
126054 + PCF50633_REGULATOR_DOWN1,
126055 + PCF50633_REGULATOR_DOWN2,
126056 + PCF50633_REGULATOR_MEMLDO,
126057 + PCF50633_REGULATOR_LDO1,
126058 + PCF50633_REGULATOR_LDO2,
126059 + PCF50633_REGULATOR_LDO3,
126060 + PCF50633_REGULATOR_LDO4,
126061 + PCF50633_REGULATOR_LDO5,
126062 + PCF50633_REGULATOR_LDO6,
126063 + PCF50633_REGULATOR_HCLDO,
126064 + __NUM_PCF50633_REGULATORS
126065 +};
126066 +
126067 +enum pcf50633_reg_int1 {
126068 + PCF50633_INT1_ADPINS = 0x01, /* Adapter inserted */
126069 + PCF50633_INT1_ADPREM = 0x02, /* Adapter removed */
126070 + PCF50633_INT1_USBINS = 0x04, /* USB inserted */
126071 + PCF50633_INT1_USBREM = 0x08, /* USB removed */
126072 + /* reserved */
126073 + PCF50633_INT1_ALARM = 0x40, /* RTC alarm time is reached */
126074 + PCF50633_INT1_SECOND = 0x80, /* RTC periodic second interrupt */
126075 +};
126076 +
126077 +enum pcf50633_reg_int2 {
126078 + PCF50633_INT2_ONKEYR = 0x01, /* ONKEY rising edge */
126079 + PCF50633_INT2_ONKEYF = 0x02, /* ONKEY falling edge */
126080 + PCF50633_INT2_EXTON1R = 0x04, /* EXTON1 rising edge */
126081 + PCF50633_INT2_EXTON1F = 0x08, /* EXTON1 falling edge */
126082 + PCF50633_INT2_EXTON2R = 0x10, /* EXTON2 rising edge */
126083 + PCF50633_INT2_EXTON2F = 0x20, /* EXTON2 falling edge */
126084 + PCF50633_INT2_EXTON3R = 0x40, /* EXTON3 rising edge */
126085 + PCF50633_INT2_EXTON3F = 0x80, /* EXTON3 falling edge */
126086 +};
126087 +
126088 +enum pcf50633_reg_int3 {
126089 + PCF50633_INT3_BATFULL = 0x01, /* Battery full */
126090 + PCF50633_INT3_CHGHALT = 0x02, /* Charger halt */
126091 + PCF50633_INT3_THLIMON = 0x04,
126092 + PCF50633_INT3_THLIMOFF = 0x08,
126093 + PCF50633_INT3_USBLIMON = 0x10,
126094 + PCF50633_INT3_USBLIMOFF = 0x20,
126095 + PCF50633_INT3_ADCRDY = 0x40, /* ADC conversion finished */
126096 + PCF50633_INT3_ONKEY1S = 0x80, /* ONKEY pressed 1 second */
126097 +};
126098 +
126099 +enum pcf50633_reg_int4 {
126100 + PCF50633_INT4_LOWSYS = 0x01,
126101 + PCF50633_INT4_LOWBAT = 0x02,
126102 + PCF50633_INT4_HIGHTMP = 0x04,
126103 + PCF50633_INT4_AUTOPWRFAIL = 0x08,
126104 + PCF50633_INT4_DWN1PWRFAIL = 0x10,
126105 + PCF50633_INT4_DWN2PWRFAIL = 0x20,
126106 + PCF50633_INT4_LEDPWRFAIL = 0x40,
126107 + PCF50633_INT4_LEDOVP = 0x80,
126108 +};
126109 +
126110 +enum pcf50633_reg_int5 {
126111 + PCF50633_INT5_LDO1PWRFAIL = 0x01,
126112 + PCF50633_INT5_LDO2PWRFAIL = 0x02,
126113 + PCF50633_INT5_LDO3PWRFAIL = 0x04,
126114 + PCF50633_INT5_LDO4PWRFAIL = 0x08,
126115 + PCF50633_INT5_LDO5PWRFAIL = 0x10,
126116 + PCF50633_INT5_LDO6PWRFAIL = 0x20,
126117 + PCF50633_INT5_HCLDOPWRFAIL = 0x40,
126118 + PCF50633_INT5_HCLDOOVL = 0x80,
126119 +};
126120 +
126121 +struct pcf50633_data;
126122 +extern struct pcf50633_data *pcf50633_global;
126123 +
126124 +extern void
126125 +pcf50633_go_standby(void);
126126 +
126127 +enum pcf50633_gpio {
126128 + PCF50633_GPIO1 = 1,
126129 + PCF50633_GPIO2 = 2,
126130 + PCF50633_GPIO3 = 3,
126131 + PCF50633_GPO = 4,
126132 +};
126133 +
126134 +extern void
126135 +pcf50633_gpio_set(struct pcf50633_data *pcf, enum pcf50633_gpio gpio, int on);
126136 +
126137 +extern int
126138 +pcf50633_gpio_get(struct pcf50633_data *pcf, enum pcf50633_gpio gpio);
126139 +
126140 +extern int
126141 +pcf50633_voltage_set(struct pcf50633_data *pcf,
126142 + enum pcf50633_regulator_id reg,
126143 + unsigned int millivolts);
126144 +extern unsigned int
126145 +pcf50633_voltage_get(struct pcf50633_data *pcf,
126146 + enum pcf50633_regulator_id reg);
126147 +
126148 +extern int
126149 +pcf50633_onoff_get(struct pcf50633_data *pcf,
126150 + enum pcf50633_regulator_id reg);
126151 +
126152 +extern int
126153 +pcf50633_onoff_set(struct pcf50633_data *pcf,
126154 + enum pcf50633_regulator_id reg, int on);
126155 +
126156 +extern void
126157 +pcf50633_backlight_resume(struct pcf50633_data *pcf);
126158 +
126159 +extern u_int16_t
126160 +pcf50633_battvolt(struct pcf50633_data *pcf);
126161 +
126162 +extern int
126163 +pcf50633_report_resumers(struct pcf50633_data *pcf, char *buf);
126164 +
126165 +extern void
126166 +pcf50633_register_resume_dependency(struct pcf50633_data *pcf,
126167 + struct resume_dependency *dep);
126168 +
126169 +extern int
126170 +pcf50633_notify_usb_current_limit_change(struct pcf50633_data *pcf,
126171 + unsigned int ma);
126172 +extern int
126173 +pcf50633_wait_for_ready(struct pcf50633_data *pcf, int timeout_ms,
126174 + char *name);
126175 +
126176 +/* 0 = initialized and resumed and ready to roll, !=0 = either not
126177 + * initialized or not resumed yet
126178 + */
126179 +extern int
126180 +pcf50633_ready(struct pcf50633_data *pcf);
126181 +
126182 +#define PCF50633_FEAT_EXTON 0x00000001 /* not yet supported */
126183 +#define PCF50633_FEAT_MBC 0x00000002
126184 +#define PCF50633_FEAT_BBC 0x00000004 /* not yet supported */
126185 +#define PCF50633_FEAT_RTC 0x00000040
126186 +#define PCF50633_FEAT_CHGCUR 0x00000100
126187 +#define PCF50633_FEAT_BATVOLT 0x00000200
126188 +#define PCF50633_FEAT_BATTEMP 0x00000400
126189 +#define PCF50633_FEAT_PWM_BL 0x00000800
126190 +
126191 +struct pcf50633_platform_data {
126192 + /* general */
126193 + unsigned int used_features;
126194 + unsigned int onkey_seconds_sig_init;
126195 + unsigned int onkey_seconds_shutdown;
126196 +
126197 + /* callback to attach platform children (to enforce suspend / resume
126198 + * ordering */
126199 + void (*attach_child_devices)(struct device *parent_device);
126200 +
126201 + /* voltage regulator related */
126202 + struct pmu_voltage_rail rails[__NUM_PCF50633_REGULATORS];
126203 + unsigned int used_regulators;
126204 +
126205 + /* charger related */
126206 + unsigned int r_fix_batt;
126207 + unsigned int r_fix_batt_par;
126208 + unsigned int r_sense_milli;
126209 + int flag_use_apm_emulation;
126210 +
126211 + unsigned char resumers[5];
126212 +
126213 + struct {
126214 + u_int8_t mbcc3; /* charger voltage / current */
126215 + } charger;
126216 + pmu_cb cb;
126217 +
126218 + /* post-resume backlight bringup */
126219 + int defer_resume_backlight;
126220 + u8 resume_backlight_ramp_speed;
126221 +};
126222 +
126223 +#endif /* _PCF50633_H */
126224 Index: linux-2.6.24.7/include/linux/pcf506xx.h
126225 ===================================================================
126226 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
126227 +++ linux-2.6.24.7/include/linux/pcf506xx.h 2008-12-11 22:46:49.000000000 +0100
126228 @@ -0,0 +1,34 @@
126229 +#ifndef _LINUX_PCF506XX_H
126230 +#define _LINUX_PCF506XX_H
126231 +
126232 +
126233 +#define PMU_VRAIL_F_SUSPEND_ON 0x00000001 /* Remains on during suspend */
126234 +#define PMU_VRAIL_F_UNUSED 0x00000002 /* This rail is not used */
126235 +struct pmu_voltage_rail {
126236 + char *name;
126237 + unsigned int flags;
126238 + struct {
126239 + unsigned int init;
126240 + unsigned int max;
126241 + } voltage;
126242 +};
126243 +
126244 +enum pmu_event {
126245 + PMU_EVT_NONE,
126246 + PMU_EVT_INSERT,
126247 + PMU_EVT_REMOVE,
126248 +#ifdef CONFIG_SENSORS_PCF50633
126249 + PMU_EVT_USB_INSERT,
126250 + PMU_EVT_USB_REMOVE,
126251 +#endif
126252 + PMU_EVT_CHARGER_ACTIVE,
126253 + PMU_EVT_CHARGER_IDLE,
126254 + PMU_EVT_CHARGER_CHANGE,
126255 + __NUM_PMU_EVTS
126256 +};
126257 +
126258 +typedef int (*pmu_cb)(struct device *dev, unsigned int feature,
126259 + enum pmu_event event);
126260 +
126261 +
126262 +#endif /* !_LINUX_PCF506XX_H */
126263 Index: linux-2.6.24.7/include/linux/resume-dependency.h
126264 ===================================================================
126265 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
126266 +++ linux-2.6.24.7/include/linux/resume-dependency.h 2008-12-11 22:46:49.000000000 +0100
126267 @@ -0,0 +1,105 @@
126268 +#ifndef __RESUME_DEPENDENCY_H__
126269 +#define __RESUME_DEPENDENCY_H__
126270 +
126271 +/* Resume dependency framework
126272 + *
126273 + * (C) 2008 Openmoko, Inc.
126274 + * Author: Andy Green <andy@openmoko.com>
126275 + *
126276 + * This program is free software; you can redistribute it and/or
126277 + * modify it under the terms of the GNU General Public License as
126278 + * published by the Free Software Foundation; version 2.1.
126279 + *
126280 + * This program is distributed in the hope that it will be useful,
126281 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
126282 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
126283 + * GNU General Public License for more details.
126284 + *
126285 + * You should have received a copy of the GNU General Public License
126286 + * along with this program; if not, write to the Free Software
126287 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
126288 + * MA 02111-1307 USA
126289 + *
126290 + */
126291 +
126292 +#include <linux/list.h>
126293 +
126294 +struct resume_dependency {
126295 + struct list_head list;
126296 +
126297 + void (*callback)(void *); /* called with context as arg */
126298 + void * context;
126299 + int called_flag; /* set to 1 after called, use for multi dep */
126300 +};
126301 +
126302 +/* if you are a driver accept to have other drivers as dependencies, you need to
126303 + * instantiate a struct resume_dependency above, then initialize it by invoking
126304 + * init_resume_dependency_list() on it
126305 + */
126306 +
126307 +#define init_resume_dependency_list(_head) \
126308 + INIT_LIST_HEAD(&(_head)->list);
126309 +
126310 +
126311 +/* if your resume function depends on something else being resumed first, you
126312 + * can register the dependency by calling this in your suspend function with
126313 + * head being the list held by the thing you are dependent on, and dep being
126314 + * your struct resume_dependency
126315 + */
126316 +
126317 +#define register_resume_dependency(_head, _dep) { \
126318 + struct list_head *_pos, *_q; \
126319 + struct resume_dependency *_d; \
126320 +\
126321 + (_dep)->called_flag = 1; \
126322 + list_for_each_safe(_pos, _q, &((_head)->list)) { \
126323 + _d = list_entry(_pos, struct resume_dependency, list); \
126324 + if (_d == (_dep)) \
126325 + list_del(_pos); \
126326 + } \
126327 + list_add(&(_dep)->list, &(_head)->list); \
126328 +}
126329 +
126330 +/* In the resume function that things can be dependent on, at the end you
126331 + * invoke this macro. This calls back the dependent resumes now it is safe to
126332 + * use the resumed thing they were dependent on.
126333 + */
126334 +
126335 +#define callback_all_resume_dependencies(_head) { \
126336 + struct list_head *_pos, *_q; \
126337 + struct resume_dependency *_dep; \
126338 +\
126339 + list_for_each_safe(_pos, _q, &((_head)->list)) { \
126340 + _dep = list_entry(_pos, struct resume_dependency, list); \
126341 + _dep->called_flag = 1; \
126342 + (_dep->callback)(_dep->context); \
126343 + list_del(_pos); \
126344 + } \
126345 +}
126346 +
126347 +/* When a dependency is added, it is not actually active; the dependent resume
126348 + * handler will function as normal. The dependency is activated by the suspend
126349 + * handler for the driver that will be doing the callbacks. This ensures that
126350 + * if the suspend is aborted for any reason (error, driver busy, etc), that all
126351 + * suspended drivers will resume, even if the driver upon which they are
126352 + * dependent did not suspend, and hence will not resume, and thus would be
126353 + * unable to perform the callbacks.
126354 + */
126355 +
126356 +#define activate_all_resume_dependencies(_head) { \
126357 + struct list_head *_pos, *_q; \
126358 + struct resume_dependency *_dep; \
126359 +\
126360 + list_for_each_safe(_pos, _q, &((_head)->list)) { \
126361 + _dep = list_entry(_pos, struct resume_dependency, list); \
126362 + _dep->called_flag = 0; \
126363 + } \
126364 +}
126365 +
126366 +/* if your resume action is dependent on multiple drivers being resumed already,
126367 + * register the same callback with each driver you are dependent on, and check
126368 + * .called_flag for all of the struct resume_dependency. When they are all 1
126369 + * you know it is the last callback and you can resume, otherwise just return
126370 + */
126371 +
126372 +#endif
126373 Index: linux-2.6.24.7/include/linux/sdio/ctsystem.h
126374 ===================================================================
126375 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
126376 +++ linux-2.6.24.7/include/linux/sdio/ctsystem.h 2008-12-11 22:46:49.000000000 +0100
126377 @@ -0,0 +1,115 @@
126378 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126379 +@file: cpsystem.h
126380 +
126381 +@abstract: common system include file.
126382 +
126383 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
126384 +
126385 +
126386 + *
126387 + * This program is free software; you can redistribute it and/or modify
126388 + * it under the terms of the GNU General Public License version 2 as
126389 + * published by the Free Software Foundation;
126390 + *
126391 + * Software distributed under the License is distributed on an "AS
126392 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
126393 + * implied. See the License for the specific language governing
126394 + * rights and limitations under the License.
126395 + *
126396 + * Portions of this code were developed with information supplied from the
126397 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
126398 + *
126399 + * The following conditions apply to the release of the SD simplified specification (�Simplified
126400 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
126401 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
126402 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
126403 + * Specification may require a license from the SD Card Association or other third parties.
126404 + * Disclaimers:
126405 + * The information contained in the Simplified Specification is presented only as a standard
126406 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
126407 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
126408 + * any damages, any infringements of patents or other right of the SD Card Association or any third
126409 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
126410 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
126411 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
126412 + * information, know-how or other confidential information to any third party.
126413 + *
126414 + *
126415 + * The initial developers of the original code are Seung Yi and Paul Lever
126416 + *
126417 + * sdio@atheros.com
126418 + *
126419 + *
126420 +
126421 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126422 +#ifndef __CPSYSTEM_H___
126423 +#define __CPSYSTEM_H___
126424 +
126425 +/* SDIO stack status defines */
126426 +/* < 0 error, >0 warning, 0 success */
126427 +#define SDIO_IS_WARNING(status) ((status) > 0)
126428 +#define SDIO_IS_ERROR(status) ((status) < 0)
126429 +#define SDIO_SUCCESS(status) ((SDIO_STATUS)(status) >= 0)
126430 +#define SDIO_STATUS_SUCCESS 0
126431 +#define SDIO_STATUS_ERROR -1
126432 +#define SDIO_STATUS_INVALID_PARAMETER -2
126433 +#define SDIO_STATUS_PENDING 3
126434 +#define SDIO_STATUS_DEVICE_NOT_FOUND -4
126435 +#define SDIO_STATUS_DEVICE_ERROR -5
126436 +#define SDIO_STATUS_INTERRUPTED -6
126437 +#define SDIO_STATUS_NO_RESOURCES -7
126438 +#define SDIO_STATUS_CANCELED -8
126439 +#define SDIO_STATUS_BUFFER_TOO_SMALL -9
126440 +#define SDIO_STATUS_NO_MORE_MESSAGES -10
126441 +#define SDIO_STATUS_BUS_RESP_TIMEOUT -20 /* response timed-out */
126442 +#define SDIO_STATUS_BUS_READ_TIMEOUT -21 /* read data timed-out */
126443 +#define SDIO_STATUS_BUS_READ_CRC_ERR -22 /* data CRC failed */
126444 +#define SDIO_STATUS_BUS_WRITE_ERROR -23 /* write failed */
126445 +#define SDIO_STATUS_BUS_RESP_CRC_ERR -24 /* response received with a CRC error */
126446 +#define SDIO_STATUS_INVALID_TUPLE_LENGTH -25 /* tuple length was invalid */
126447 +#define SDIO_STATUS_TUPLE_NOT_FOUND -26 /* tuple could not be found */
126448 +#define SDIO_STATUS_CIS_OUT_OF_RANGE -27 /* CIS is out of range in the tuple scan */
126449 +#define SDIO_STATUS_FUNC_ENABLE_TIMEOUT -28 /* card timed out enabling or disabling */
126450 +#define SDIO_STATUS_DATA_STATE_INVALID -29 /* card is in an invalid state for data */
126451 +#define SDIO_STATUS_DATA_ERROR_UNKNOWN -30 /* card cannot process data transfer */
126452 +#define SDIO_STATUS_INVALID_FUNC -31 /* sdio request is not valid for the function */
126453 +#define SDIO_STATUS_FUNC_ARG_ERROR -32 /* sdio request argument is invalid or out of range */
126454 +#define SDIO_STATUS_INVALID_COMMAND -33 /* SD COMMAND is invalid for the card state */
126455 +#define SDIO_STATUS_SDREQ_QUEUE_FAILED -34 /* request failed to insert into queue */
126456 +#define SDIO_STATUS_BUS_RESP_TIMEOUT_SHIFTABLE -35 /* response timed-out, possibily shiftable to correct */
126457 +#define SDIO_STATUS_UNSUPPORTED -36 /* not supported */
126458 +#define SDIO_STATUS_PROGRAM_TIMEOUT -37 /* memory card programming timeout */
126459 +#define SDIO_STATUS_PROGRAM_STATUS_ERROR -38 /* memory card programming errors */
126460 +
126461 +#include <linux/sdio/ctsystem_linux.h>
126462 +
126463 +/* get structure from contained field */
126464 +#define CONTAINING_STRUCT(address, struct_type, field_name)\
126465 + ((struct_type *)((ULONG_PTR)(address) - (ULONG_PTR)(&((struct_type *)0)->field_name)))
126466 +
126467 +#define ZERO_OBJECT(obj) memset(&(obj),0,sizeof(obj))
126468 +#define ZERO_POBJECT(pObj) memset((pObj),0,sizeof(*(pObj)))
126469 +
126470 +
126471 +/* bit field support functions */
126472 +static INLINE void SetBit(PULONG pField, UINT position) {
126473 + *pField |= 1 << position;
126474 +}
126475 +static INLINE void ClearBit(PULONG pField, UINT position) {
126476 + *pField &= ~(1 << position);
126477 +}
126478 +static INLINE BOOL IsBitSet(PULONG pField, UINT position) {
126479 + return (*pField & (1 << position));
126480 +}
126481 +static INLINE INT FirstClearBit(PULONG pField) {
126482 + UINT ii;
126483 + for(ii = 0; ii < sizeof(ULONG)*8; ii++) {
126484 + if (!IsBitSet(pField, ii)) {
126485 + return ii;
126486 + }
126487 + }
126488 + /* no clear bits found */
126489 + return -1;
126490 +}
126491 +
126492 +#endif /* __CPSYSTEM_H___ */
126493 Index: linux-2.6.24.7/include/linux/sdio/ctsystem_linux.h
126494 ===================================================================
126495 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
126496 +++ linux-2.6.24.7/include/linux/sdio/ctsystem_linux.h 2008-12-11 22:46:49.000000000 +0100
126497 @@ -0,0 +1,981 @@
126498 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126499 +@file: ctsystem_linux.h
126500 +
126501 +@abstract: common system include file for Linux.
126502 +
126503 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
126504 +
126505 +
126506 + *
126507 + * This program is free software; you can redistribute it and/or modify
126508 + * it under the terms of the GNU General Public License version 2 as
126509 + * published by the Free Software Foundation;
126510 + *
126511 + * Software distributed under the License is distributed on an "AS
126512 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
126513 + * implied. See the License for the specific language governing
126514 + * rights and limitations under the License.
126515 + *
126516 + * Portions of this code were developed with information supplied from the
126517 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
126518 + *
126519 + * The following conditions apply to the release of the SD simplified specification (�Simplified
126520 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
126521 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
126522 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
126523 + * Specification may require a license from the SD Card Association or other third parties.
126524 + * Disclaimers:
126525 + * The information contained in the Simplified Specification is presented only as a standard
126526 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
126527 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
126528 + * any damages, any infringements of patents or other right of the SD Card Association or any third
126529 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
126530 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
126531 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
126532 + * information, know-how or other confidential information to any third party.
126533 + *
126534 + *
126535 + * The initial developers of the original code are Seung Yi and Paul Lever
126536 + *
126537 + * sdio@atheros.com
126538 + *
126539 + *
126540 +
126541 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126542 +#ifndef __CPSYSTEM_LINUX_H___
126543 +#define __CPSYSTEM_LINUX_H___
126544 +
126545 +/* #define DBG_TIMESTAMP 1 */
126546 +#define SD_TRACK_REQ 1
126547 +
126548 +/* LINUX support */
126549 +#include <linux/version.h>
126550 +
126551 +#ifndef KERNEL_VERSION
126552 + #error KERNEL_VERSION macro not defined!
126553 +#endif
126554 +
126555 +#ifndef LINUX_VERSION_CODE
126556 + #error LINUX_VERSION_CODE macro not defined!
126557 +#endif
126558 +
126559 +#include <linux/autoconf.h>
126560 +#include <linux/kernel.h>
126561 +#include <linux/init.h>
126562 +#include <linux/types.h>
126563 +#include <linux/spinlock.h>
126564 +#include <linux/module.h>
126565 +
126566 +#include <linux/interrupt.h>
126567 +#include <linux/pnp.h>
126568 +#include <asm/hardirq.h>
126569 +#include <asm/semaphore.h>
126570 +#include <asm/io.h>
126571 +#include <asm/scatterlist.h>
126572 +#ifdef DBG_TIMESTAMP
126573 +#include <asm/timex.h>
126574 +#endif /* DBG_TIMESTAMP */
126575 +#ifndef in_atomic
126576 + /* released version of 2.6.9 */
126577 +#include <linux/hardirq.h>
126578 +#endif
126579 +#include <linux/delay.h>
126580 +#include <linux/device.h>
126581 +
126582 +/* generic types */
126583 +typedef unsigned char UCHAR;
126584 +typedef unsigned char * PUCHAR;
126585 +typedef char TEXT;
126586 +typedef char * PTEXT;
126587 +typedef unsigned short USHORT;
126588 +typedef unsigned short* PUSHORT;
126589 +typedef unsigned int UINT;
126590 +typedef unsigned int* PUINT;
126591 +typedef int INT;
126592 +typedef int* PINT;
126593 +typedef unsigned long ULONG;
126594 +typedef unsigned long* PULONG;
126595 +typedef u8 UINT8;
126596 +typedef u16 UINT16;
126597 +typedef u32 UINT32;
126598 +typedef u8* PUINT8;
126599 +typedef u16* PUINT16;
126600 +typedef u32* PUINT32;
126601 +typedef unsigned char * ULONG_PTR;
126602 +typedef void* PVOID;
126603 +typedef unsigned char BOOL;
126604 +typedef BOOL* PBOOL;
126605 +typedef int SDIO_STATUS;
126606 +typedef int SYSTEM_STATUS;
126607 +typedef unsigned int EVENT_TYPE;
126608 +typedef unsigned int EVENT_ARG;
126609 +typedef unsigned int* PEVENT_TYPE;
126610 +typedef struct semaphore OS_SEMAPHORE;
126611 +typedef struct semaphore* POS_SEMAPHORE;
126612 +typedef struct semaphore OS_SIGNAL; /* OS signals are just semaphores */
126613 +typedef struct semaphore* POS_SIGNAL;
126614 +typedef spinlock_t OS_CRITICALSECTION;
126615 +typedef spinlock_t *POS_CRITICALSECTION;
126616 +typedef int SDPOWER_STATE;
126617 +typedef unsigned long ATOMIC_FLAGS;
126618 +typedef INT THREAD_RETURN;
126619 +typedef dma_addr_t DMA_ADDRESS;
126620 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9)
126621 +typedef struct task_struct* PKERNEL_TASK;
126622 +typedef struct device_driver OS_DRIVER;
126623 +typedef struct device_driver* POS_DRIVER;
126624 +typedef struct device OS_DEVICE;
126625 +typedef struct device* POS_DEVICE;
126626 +typedef struct pnp_driver OS_PNPDRIVER;
126627 +typedef struct pnp_driver* POS_PNPDRIVER;
126628 +typedef struct pnp_dev OS_PNPDEVICE;
126629 +typedef struct pnp_dev* POS_PNPDEVICE;
126630 +typedef struct module* POS_MODULE;
126631 +#else
126632 +/* 2.4 */
126633 +typedef int PKERNEL_TASK;
126634 +typedef PVOID OS_DRIVER;
126635 +typedef PVOID* POS_DRIVER;
126636 +typedef PVOID OS_DEVICE;
126637 +typedef PVOID* POS_DEVICE;
126638 +typedef PVOID OS_PNPDRIVER;
126639 +typedef PVOID* POS_PNPDRIVER;
126640 +typedef PVOID OS_PNPDEVICE;
126641 +typedef PVOID* POS_PNPDEVICE;
126642 +typedef struct module* POS_MODULE;
126643 +#define module_param(a,b,c) MODULE_PARM(a, "i")
126644 +#endif
126645 +
126646 +typedef int CT_DEBUG_LEVEL;
126647 +
126648 +
126649 +#ifndef TRUE
126650 +#define TRUE 1
126651 +#endif
126652 +#ifndef FALSE
126653 +#define FALSE 0
126654 +#endif
126655 +#ifndef NULL
126656 +#define NULL ((PVOID)0)
126657 +#endif
126658 +#define SDDMA_DESCRIPTION_FLAG_DMA 0x1 /* DMA enabled */
126659 +#define SDDMA_DESCRIPTION_FLAG_SGDMA 0x2 /* Scatter-Gather DMA enabled */
126660 +typedef struct _SDDMA_DESCRIPTION {
126661 + UINT16 Flags; /* SDDMA_DESCRIPTION_FLAG_xxx */
126662 + UINT16 MaxDescriptors; /* number of supported scatter gather entries */
126663 + UINT32 MaxBytesPerDescriptor; /* maximum bytes in a DMA descriptor entry */
126664 + u64 Mask; /* dma address mask */
126665 + UINT32 AddressAlignment; /* dma address alignment mask, least significant bits indicate illegal address bits */
126666 + UINT32 LengthAlignment; /* dma buffer length alignment mask, least significant bits indicate illegal length bits */
126667 +}SDDMA_DESCRIPTION, *PSDDMA_DESCRIPTION;
126668 +typedef struct scatterlist SDDMA_DESCRIPTOR, *PSDDMA_DESCRIPTOR;
126669 +
126670 +#define INLINE inline
126671 +#define CT_PACK_STRUCT __attribute__ ((packed))
126672 +
126673 +#define CT_DECLARE_MODULE_PARAM_INTEGER(p) module_param(p, int, 0644);
126674 +
126675 +/* debug print macros */
126676 +//#define SDDBG_KERNEL_PRINT_LEVEL KERN_DEBUG
126677 +#define SDDBG_KERNEL_PRINT_LEVEL KERN_ALERT
126678 +#define DBG_MASK_NONE 0x0
126679 +#define DBG_MASK_HCD 0x100
126680 +#define DBG_MASK_LIB 0x200
126681 +#define DBG_MASK_BUS 0x400
126682 +
126683 +/* debug output levels, this must be order low number to higher */
126684 +#define SDDBG_ERROR 3
126685 +#define SDDBG_WARN 4
126686 +#define SDDBG_DEBUG 6
126687 +#define SDDBG_TRACE 7
126688 +#define SDDBG_ALL 0xff
126689 +
126690 +#define DBG_LEVEL_NONE 0
126691 +#define DBG_LEVEL_ERROR SDDBG_ERROR
126692 +#define DBG_LEVEL_WARN SDDBG_WARN
126693 +#define DBG_LEVEL_DEBUG SDDBG_DEBUG
126694 +#define DBG_LEVEL_TRACE SDDBG_TRACE
126695 +#define DBG_LEVEL_ALL SDDBG_ALL
126696 +
126697 +#define DBG_GET_LEVEL(lvl) ((lvl) & 0xff)
126698 +#define DBG_GET_MASK(lvl) (((lvl) & 0xff00))
126699 +
126700 +#define DBG_SDIO_MASK (DBG_MASK_NONE | DBG_LEVEL_DEBUG)
126701 +
126702 +#ifdef DEBUG
126703 +
126704 +#define DBG_ASSERT(test) \
126705 +{ \
126706 + if (!(test)) { \
126707 + DBG_PRINT(SDDBG_ERROR, ("Debug Assert Caught, File %s, Line: %d, Test:%s \n",__FILE__, __LINE__,#test)); \
126708 + } \
126709 +}
126710 +#define DBG_ASSERT_WITH_MSG(test,s) \
126711 +{ \
126712 + if (!(test)) { \
126713 + DBG_PRINT(SDDBG_ERROR, ("Assert:%s File %s, Line: %d \n",(s),__FILE__, __LINE__)); \
126714 + } \
126715 +}
126716 +
126717 +#define DBG_PRINT(lvl, args)\
126718 + do {\
126719 + if (DBG_GET_LEVEL(lvl) <= (DBG_SDIO_MASK & 0xff)) \
126720 + printk(_DBG_PRINTX_ARG args); \
126721 + } while(0);
126722 +
126723 +#else /* DEBUG */
126724 +
126725 +#define DBG_PRINT(lvl, str)
126726 +#define DBG_ASSERT(test)
126727 +#define DBG_ASSERT_WITH_MSG(test,s)
126728 +#endif /* DEBUG */
126729 +
126730 +#define _DBG_PRINTX_ARG(arg...) arg /* unroll the parens around the var args*/
126731 +#define DBG_GET_DEBUG_LEVEL() DBG_GET_LEVEL(DBG_SDIO_MASK)
126732 +#define DBG_SET_DEBUG_LEVEL(v)
126733 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126734 + @function: Print a string to the debugger or console
126735 +
126736 + @function name: REL_PRINT
126737 + @prototype: void REL_PRINT(INT Level, string)
126738 + @category: Support_Reference
126739 + @input: Level - debug level for the print
126740 +
126741 + @output: none
126742 +
126743 + @return:
126744 +
126745 + @notes: If Level is less than the current debug level, the print will be
126746 + issued. This print cannot be conditionally compiled.
126747 + @see also: DBG_PRINT
126748 +
126749 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126750 +#define REL_PRINT(lvl, args)\
126751 + {if (lvl <= DBG_GET_DEBUG_LEVEL())\
126752 + printk(SDDBG_KERNEL_PRINT_LEVEL _DBG_PRINTX_ARG args);\
126753 + }
126754 +/* debug output levels, this must be order low number to higher */
126755 +#define SDDBG_ERROR 3
126756 +#define SDDBG_WARN 4
126757 +#define SDDBG_DEBUG 6
126758 +#define SDDBG_TRACE 7
126759 +
126760 +#ifdef DBG_CRIT_SECTION_RECURSE
126761 + /* this macro thows an exception if the lock is recursively taken
126762 + * the kernel must be configured with: CONFIG_DEBUG_SPINLOCK=y */
126763 +#define call_spin_lock(pCrit) \
126764 +{ \
126765 + UINT32 unlocked = 1; \
126766 + if ((pCrit)->lock) {unlocked = 0;} \
126767 + spin_lock_bh(pCrit); \
126768 + if (!unlocked) { \
126769 + unlocked = 0x01; \
126770 + unlocked = *((volatile UINT32 *)unlocked); \
126771 + } \
126772 +}
126773 +
126774 +#define call_spin_lock_irqsave(pCrit,isc) \
126775 +{ \
126776 + UINT32 unlocked = 1; \
126777 + if ((pCrit)->lock) {unlocked = 0;} \
126778 + spin_lock_irqsave(pCrit,isc); \
126779 + if (!unlocked) { \
126780 + unlocked = 0x01; \
126781 + unlocked = *((volatile UINT32 *)unlocked); \
126782 + } \
126783 +}
126784 +
126785 +#else
126786 +#define call_spin_lock(s) spin_lock_bh(s)
126787 +#define call_spin_lock_irqsave(s,isc) spin_lock_irqsave(s,isc)
126788 +#endif
126789 +
126790 +#define call_spin_unlock(s) spin_unlock_bh((s))
126791 +#define call_spin_unlock_irqrestore(s,isc) spin_unlock_irqrestore(s,isc)
126792 +
126793 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9)
126794 +#define NonSchedulable() (in_atomic() || irqs_disabled())
126795 +#else
126796 +#define NonSchedulable() (irqs_disabled())
126797 +#endif
126798 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126799 + @function: Initialize a critical section object.
126800 +
126801 + @function name: CriticalSectionInit
126802 + @prototype: SDIO_STATUS CriticalSectionInit(POS_CRITICALSECTION pCrit)
126803 + @category: Support_Reference
126804 + @output: pCrit - pointer to critical section to initialize
126805 +
126806 + @return: SDIO_STATUS_SUCCESS on success.
126807 +
126808 + @notes: CriticalSectionDelete() must be called to cleanup any resources
126809 + associated with the critical section.
126810 +
126811 + @see also: CriticalSectionDelete, CriticalSectionAcquire, CriticalSectionRelease
126812 + @example: To initialize a critical section:
126813 + status = CriticalSectionInit(&pDevice->ListLock);
126814 + if (!SDIO_SUCCESS(status)) {
126815 + .. failed
126816 + return status;
126817 + }
126818 +
126819 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126820 +static inline SDIO_STATUS CriticalSectionInit(POS_CRITICALSECTION pCrit) {
126821 + spin_lock_init(pCrit);
126822 + return SDIO_STATUS_SUCCESS;
126823 +}
126824 +
126825 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126826 + @function: Acquire a critical section lock.
126827 +
126828 + @function name: CriticalSectionAcquire
126829 + @prototype: SDIO_STATUS CriticalSectionAcquire(POS_CRITICALSECTION pCrit)
126830 + @category: Support_Reference
126831 +
126832 + @input: pCrit - pointer to critical section that was initialized
126833 +
126834 + @return: SDIO_STATUS_SUCCESS on success.
126835 +
126836 + @notes: The critical section lock is acquired when this function returns
126837 + SDIO_STATUS_SUCCESS. Use CriticalSectionRelease() to release
126838 + the critical section lock.
126839 +
126840 + @see also: CriticalSectionRelease
126841 +
126842 + @example: To acquire a critical section lock:
126843 + status = CriticalSectionAcquire(&pDevice->ListLock);
126844 + if (!SDIO_SUCCESS(status)) {
126845 + .. failed
126846 + return status;
126847 + }
126848 + ... access protected data
126849 + // unlock
126850 + status = CriticalSectionRelease(&pDevice->ListLock);
126851 + if (!SDIO_SUCCESS(status)) {
126852 + .. failed
126853 + return status;
126854 + }
126855 +
126856 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126857 +static inline SDIO_STATUS CriticalSectionAcquire(POS_CRITICALSECTION pCrit) {
126858 + call_spin_lock(pCrit);
126859 + return SDIO_STATUS_SUCCESS;
126860 +}
126861 +
126862 +// macro-tized versions
126863 +#define CriticalSectionAcquire_M(pCrit) \
126864 + SDIO_STATUS_SUCCESS; call_spin_lock(pCrit)
126865 +#define CriticalSectionRelease_M(pCrit) \
126866 + SDIO_STATUS_SUCCESS; call_spin_unlock(pCrit)
126867 +
126868 +#define CT_DECLARE_IRQ_SYNC_CONTEXT() unsigned long _ctSyncFlags
126869 +
126870 +#define CriticalSectionAcquireSyncIrq(pCrit) \
126871 + SDIO_STATUS_SUCCESS; call_spin_lock_irqsave(pCrit,_ctSyncFlags)
126872 +
126873 +#define CriticalSectionReleaseSyncIrq(pCrit) \
126874 + SDIO_STATUS_SUCCESS; call_spin_unlock_irqrestore(pCrit,_ctSyncFlags)
126875 +
126876 +
126877 +
126878 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126879 + @function: Release a critical section lock.
126880 +
126881 + @function name: CriticalSectionRelease
126882 + @prototype: SDIO_STATUS CriticalSectionRelease(POS_CRITICALSECTION pCrit)
126883 + @category: Support_Reference
126884 +
126885 + @input: pCrit - pointer to critical section that was initialized
126886 +
126887 + @return: SDIO_STATUS_SUCCESS on success.
126888 +
126889 + @notes: The critical section lock is released when this function returns
126890 + SDIO_STATUS_SUCCESS.
126891 +
126892 + @see also: CriticalSectionAcquire
126893 +
126894 + @example: see CriticalSectionAcquire
126895 +
126896 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126897 +static inline SDIO_STATUS CriticalSectionRelease(POS_CRITICALSECTION pCrit) {
126898 + call_spin_unlock(pCrit);
126899 + return SDIO_STATUS_SUCCESS;
126900 +}
126901 +
126902 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126903 + @function: Cleanup a critical section object
126904 +
126905 + @function name: CriticalSectionDelete
126906 + @prototype: void CriticalSectionDelete(POS_CRITICALSECTION pCrit)
126907 + @category: Support_Reference
126908 +
126909 + @input: pCrit - an initialized critical section object
126910 +
126911 + @return: SDIO_STATUS_SUCCESS on success.
126912 +
126913 + @notes:
126914 +
126915 + @see also: CriticalSectionInit, CriticalSectionAcquire, CriticalSectionRelease
126916 +
126917 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126918 +static inline void CriticalSectionDelete(POS_CRITICALSECTION pCrit) {
126919 + return;
126920 +}
126921 +
126922 +/* internal use */
126923 +static inline SDIO_STATUS SignalInitialize(POS_SIGNAL pSignal) {
126924 + sema_init(pSignal, 0);
126925 + return SDIO_STATUS_SUCCESS;
126926 +}
126927 +/* internal use */
126928 +static inline void SignalDelete(POS_SIGNAL pSignal) {
126929 + return;
126930 +}
126931 +/* internal use */
126932 +static inline SDIO_STATUS SignalWaitInterruptible(POS_SIGNAL pSignal) {
126933 + DBG_ASSERT_WITH_MSG(!NonSchedulable(),"SignalWaitInterruptible not allowed\n");
126934 + if (down_interruptible(pSignal) == 0) {
126935 + return SDIO_STATUS_SUCCESS;
126936 + } else {
126937 + return SDIO_STATUS_INTERRUPTED;
126938 + }
126939 +}
126940 +/* internal use */
126941 +static inline SDIO_STATUS SignalWait(POS_SIGNAL pSignal) {
126942 + DBG_ASSERT_WITH_MSG(!NonSchedulable(),"SignalWait not allowed\n");
126943 + down(pSignal);
126944 + return SDIO_STATUS_SUCCESS;
126945 +}
126946 +
126947 +/* internal use */
126948 +static inline SDIO_STATUS SignalSet(POS_SIGNAL pSignal) {
126949 + up(pSignal);
126950 + return SDIO_STATUS_SUCCESS;
126951 +}
126952 +
126953 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126954 + @function: Initialize a semaphore object.
126955 +
126956 + @function name: SemaphoreInitialize
126957 + @prototype: SDIO_STATUS SemaphoreInitialize(POS_SEMAPHORE pSem, UINT value)
126958 + @category: Support_Reference
126959 +
126960 + @input: value - initial value of the semaphore
126961 +
126962 + @output: pSem - pointer to a semaphore object to initialize
126963 +
126964 + @return: SDIO_STATUS_SUCCESS on success.
126965 +
126966 + @notes: SemaphoreDelete() must be called to cleanup any resources
126967 + associated with the semaphore
126968 +
126969 + @see also: SemaphoreDelete, SemaphorePend, SemaphorePendInterruptable
126970 +
126971 + @example: To initialize a semaphore:
126972 + status = SemaphoreInitialize(&pDevice->ResourceSem,1);
126973 + if (!SDIO_SUCCESS(status)) {
126974 + .. failed
126975 + return status;
126976 + }
126977 +
126978 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126979 +static inline SDIO_STATUS SemaphoreInitialize(POS_SEMAPHORE pSem, UINT value) {
126980 + sema_init(pSem, value);
126981 + return SDIO_STATUS_SUCCESS;
126982 +}
126983 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
126984 + @function: Cleanup a semaphore object.
126985 +
126986 + @function name: SemaphoreDelete
126987 + @prototype: void SemaphoreDelete(POS_SEMAPHORE pSem)
126988 + @category: Support_Reference
126989 +
126990 + @input: pSem - pointer to a semaphore object to cleanup
126991 +
126992 + @return:
126993 +
126994 + @notes:
126995 +
126996 + @see also: SemaphoreInitialize
126997 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
126998 +static inline void SemaphoreDelete(POS_SEMAPHORE pSem) {
126999 + return;
127000 +}
127001 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127002 + @function: Acquire the semaphore or pend if the resource is not available
127003 +
127004 + @function name: SemaphorePend
127005 + @prototype: SDIO_STATUS SemaphorePend(POS_SEMAPHORE pSem)
127006 + @category: Support_Reference
127007 +
127008 + @input: pSem - pointer to an initialized semaphore object
127009 +
127010 + @return: SDIO_STATUS_SUCCESS on success.
127011 +
127012 + @notes: If the semaphore count is zero this function blocks until the count
127013 + becomes non-zero, otherwise the count is decremented and execution
127014 + continues. While waiting, the task/thread cannot be interrupted.
127015 + If the task or thread should be interruptible, use SemaphorePendInterruptible.
127016 + On some OSes SemaphorePend and SemaphorePendInterruptible behave the same.
127017 +
127018 + @see also: SemaphorePendInterruptable, SemaphorePost
127019 + @example: To wait for a resource using a semaphore:
127020 + status = SemaphorePend(&pDevice->ResourceSem);
127021 + if (!SDIO_SUCCESS(status)) {
127022 + .. failed
127023 + return status;
127024 + }
127025 + ... resource acquired
127026 + SemaphorePost(&pDevice->ResourceSem);
127027 +
127028 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127029 +static inline SDIO_STATUS SemaphorePend(POS_SEMAPHORE pSem) {
127030 + DBG_ASSERT_WITH_MSG(!NonSchedulable(),"SemaphorePend not allowed\n");
127031 + down(pSem);
127032 + return SDIO_STATUS_SUCCESS;
127033 +}
127034 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127035 + @function: Acquire the semaphore or pend if the resource is not available
127036 +
127037 + @function name: SemaphorePendInterruptable
127038 + @prototype: SDIO_STATUS SemaphorePendInterruptable(POS_SEMAPHORE pSem)
127039 + @category: Support_Reference
127040 +
127041 + @input: pSem - pointer to an initialized semaphore object
127042 +
127043 + @return: SDIO_STATUS_SUCCESS on success.
127044 +
127045 + @notes: If the semaphore count is zero this function blocks until the count
127046 + becomes non-zero, otherwise the count is decremented and execution
127047 + continues. While waiting, the task/thread can be interrupted.
127048 + If the task or thread should not be interruptible, use SemaphorePend.
127049 +
127050 + @see also: SemaphorePend, SemaphorePost
127051 + @example: To wait for a resource using a semaphore:
127052 + status = SemaphorePendInterruptable(&pDevice->ResourceSem);
127053 + if (!SDIO_SUCCESS(status)) {
127054 + .. failed, could have been interrupted
127055 + return status;
127056 + }
127057 + ... resource acquired
127058 + SemaphorePost(&pDevice->ResourceSem);
127059 +
127060 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127061 +static inline SDIO_STATUS SemaphorePendInterruptable(POS_SEMAPHORE pSem) {
127062 + DBG_ASSERT_WITH_MSG(!NonSchedulable(),"SemaphorePendInterruptable not allowed\n");
127063 + if (down_interruptible(pSem) == 0) {
127064 + return SDIO_STATUS_SUCCESS;
127065 + } else {
127066 + return SDIO_STATUS_INTERRUPTED;
127067 + }
127068 +}
127069 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127070 + @function: Post a semaphore.
127071 +
127072 + @function name: SemaphorePost
127073 + @prototype: SDIO_STATUS SemaphorePost(POS_SEMAPHORE pSem)
127074 + @category: Support_Reference
127075 +
127076 + @input: pSem - pointer to an initialized semaphore object
127077 +
127078 + @return: SDIO_STATUS_SUCCESS on success.
127079 +
127080 + @notes: This function increments the semaphore count.
127081 +
127082 + @see also: SemaphorePend, SemaphorePendInterruptable.
127083 + @example: Posting a semaphore:
127084 + status = SemaphorePendInterruptable(&pDevice->ResourceSem);
127085 + if (!SDIO_SUCCESS(status)) {
127086 + .. failed, could have been interrupted
127087 + return status;
127088 + }
127089 + ... resource acquired
127090 + // post the semaphore
127091 + SemaphorePost(&pDevice->ResourceSem);
127092 +
127093 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127094 +static inline SDIO_STATUS SemaphorePost(POS_SEMAPHORE pSem) {
127095 + DBG_ASSERT_WITH_MSG(!NonSchedulable(),"SemaphorePost not allowed\n");
127096 + up(pSem);
127097 + return SDIO_STATUS_SUCCESS;
127098 +}
127099 +
127100 +
127101 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127102 + @function: Allocate a block of kernel accessible memory
127103 +
127104 + @function name: KernelAlloc
127105 + @prototype: PVOID KernelAlloc(UINT size)
127106 + @category: Support_Reference
127107 +
127108 + @input: size - size of memory block to allocate
127109 +
127110 + @return: pointer to the allocated memory, NULL if allocation failed
127111 +
127112 + @notes: For operating systems that use paging, the allocated memory is always
127113 + non-paged memory. Caller should only use KernelFree() to release the
127114 + block of memory. This call can potentially block and should only be called
127115 + from a schedulable context. Use KernelAllocIrqSafe() if the allocation
127116 + must be made from a non-schedulable context.
127117 +
127118 + @see also: KernelFree, KernelAllocIrqSafe
127119 + @example: allocating memory:
127120 + pBlock = KernelAlloc(1024);
127121 + if (pBlock == NULL) {
127122 + .. failed, no memory
127123 + return SDIO_STATUS_INSUFFICIENT_RESOURCES;
127124 + }
127125 +
127126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127127 +static inline PVOID KernelAlloc(UINT size) {
127128 + PVOID pMem = kmalloc(size, GFP_KERNEL);
127129 + if (pMem != NULL) { memset(pMem,0,size); }
127130 + return pMem;
127131 +}
127132 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127133 + @function: Free a block of kernel accessible memory.
127134 +
127135 + @function name: KernelFree
127136 + @prototype: void KernelFree(PVOID ptr)
127137 + @category: Support_Reference
127138 +
127139 + @input: ptr - pointer to memory allocated with KernelAlloc()
127140 +
127141 + @return:
127142 +
127143 + @notes: Caller should only use KernelFree() to release memory that was allocated
127144 + with KernelAlloc().
127145 +
127146 + @see also: KernelAlloc
127147 + @example: KernelFree(pBlock);
127148 +
127149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127150 +static inline void KernelFree(PVOID ptr) {
127151 + kfree(ptr);
127152 +}
127153 +
127154 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127155 + @function: Allocate a block of kernel accessible memory in an IRQ-safe manner
127156 +
127157 + @function name: KernelAllocIrqSafe
127158 + @prototype: PVOID KernelAllocIrqSafe(UINT size)
127159 + @category: Support_Reference
127160 +
127161 + @input: size - size of memory block to allocate
127162 +
127163 + @return: pointer to the allocated memory, NULL if allocation failed
127164 +
127165 + @notes: This variant of KernelAlloc allows the allocation of small blocks of
127166 + memory from an ISR or from a context where scheduling has been disabled.
127167 + The allocations should be small as the memory is typically allocated
127168 + from a critical heap. The caller should only use KernelFreeIrqSafe()
127169 + to release the block of memory.
127170 +
127171 + @see also: KernelAlloc, KernelFreeIrqSafe
127172 + @example: allocating memory:
127173 + pBlock = KernelAllocIrqSafe(16);
127174 + if (pBlock == NULL) {
127175 + .. failed, no memory
127176 + return SDIO_STATUS_INSUFFICIENT_RESOURCES;
127177 + }
127178 +
127179 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127180 +static inline PVOID KernelAllocIrqSafe(UINT size) {
127181 + return kmalloc(size, GFP_ATOMIC);
127182 +}
127183 +
127184 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127185 + @function: Free a block of kernel accessible memory.
127186 +
127187 + @function name: KernelFreeIrqSafe
127188 + @prototype: void KernelFreeIrqSafe(PVOID ptr)
127189 + @category: Support_Reference
127190 +
127191 + @input: ptr - pointer to memory allocated with KernelAllocIrqSafe()
127192 +
127193 + @return:
127194 +
127195 + @notes: Caller should only use KernelFreeIrqSafe() to release memory that was allocated
127196 + with KernelAllocIrqSafe().
127197 +
127198 + @see also: KernelAllocIrqSafe
127199 + @example: KernelFreeIrqSafe(pBlock);
127200 +
127201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127202 +static inline void KernelFreeIrqSafe(PVOID ptr) {
127203 + kfree(ptr);
127204 +}
127205 +
127206 +/* error status conversions */
127207 +static inline SYSTEM_STATUS SDIOErrorToOSError(SDIO_STATUS status) {
127208 + switch (status) {
127209 + case SDIO_STATUS_SUCCESS:
127210 + return 0;
127211 + case SDIO_STATUS_INVALID_PARAMETER:
127212 + return -EINVAL;
127213 + case SDIO_STATUS_PENDING:
127214 + return -EAGAIN; /* try again */
127215 + case SDIO_STATUS_DEVICE_NOT_FOUND:
127216 + return -ENXIO;
127217 + case SDIO_STATUS_DEVICE_ERROR:
127218 + return -EIO;
127219 + case SDIO_STATUS_INTERRUPTED:
127220 + return -EINTR;
127221 + case SDIO_STATUS_NO_RESOURCES:
127222 + return -ENOMEM;
127223 + case SDIO_STATUS_ERROR:
127224 + default:
127225 + return -EFAULT;
127226 + }
127227 +}
127228 +static inline SDIO_STATUS OSErrorToSDIOError(SYSTEM_STATUS status) {
127229 + if (status >=0) {
127230 + return SDIO_STATUS_SUCCESS;
127231 + }
127232 + switch (status) {
127233 + case -EINVAL:
127234 + return SDIO_STATUS_INVALID_PARAMETER;
127235 + case -ENXIO:
127236 + return SDIO_STATUS_DEVICE_NOT_FOUND;
127237 + case -EIO:
127238 + return SDIO_STATUS_DEVICE_ERROR;
127239 + case -EINTR:
127240 + return SDIO_STATUS_INTERRUPTED;
127241 + case -ENOMEM:
127242 + return SDIO_STATUS_NO_RESOURCES;
127243 + case -EFAULT:
127244 + return SDIO_STATUS_ERROR;
127245 + default:
127246 + return SDIO_STATUS_ERROR;
127247 + }
127248 +}
127249 +
127250 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127251 + @function: Sleep or delay the execution context for a number of milliseconds.
127252 +
127253 + @function name: OSSleep
127254 + @prototype: SDIO_STATUS OSSleep(INT SleepInterval)
127255 + @category: Support_Reference
127256 +
127257 + @input: SleepInterval - time in milliseconds to put the execution context to sleep
127258 +
127259 + @return: SDIO_STATUS_SUCCESS if sleep succeeded.
127260 +
127261 + @notes: Caller should be in a context that allows it to sleep or block. The
127262 + minimum duration of sleep may be greater than 1 MS on some platforms and OSes.
127263 +
127264 + @see also: OSSleep
127265 + @example: Using sleep to delay
127266 + EnableSlotPower(pSlot);
127267 + // wait for power to settle
127268 + status = OSSleep(100);
127269 + if (!SDIO_SUCCESS(status)){
127270 + // failed..
127271 + }
127272 +
127273 +
127274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127275 +static inline SDIO_STATUS OSSleep(INT SleepInterval) {
127276 + UINT32 delta;
127277 +
127278 + DBG_ASSERT_WITH_MSG(!NonSchedulable(),"OSSleep not allowed\n");
127279 + /* convert timeout to ticks */
127280 + delta = (SleepInterval * HZ)/1000;
127281 + if (delta == 0) {
127282 + delta = 1;
127283 + }
127284 + set_current_state(TASK_INTERRUPTIBLE);
127285 + if (schedule_timeout(delta) != 0) {
127286 + return SDIO_STATUS_INTERRUPTED;
127287 + }
127288 + return SDIO_STATUS_SUCCESS;
127289 +}
127290 +
127291 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127292 + @function: get the OSs device object
127293 +
127294 + @function name: SD_GET_OS_DEVICE
127295 + @prototype: POS_DEVICE SD_GET_OS_DEVICE(PSDDEVICE pDevice)
127296 + @category: Support_Reference
127297 +
127298 + @input: pDevice - the device on the HCD
127299 +
127300 + @return: pointer to the OSs device
127301 +
127302 + @see also:
127303 + @example: obtain low level device
127304 + pFunctionContext->GpsDevice.Port.dev = SD_GET_OS_DEVICE(pDevice);
127305 +
127306 +
127307 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127308 +#define SD_GET_OS_DEVICE(pDevice) &((pDevice)->Device.dev)
127309 +
127310 +
127311 +#ifdef __iomem
127312 + /* new type checking in 2.6.9 */
127313 + /* I/O Access macros */
127314 +#define _READ_DWORD_REG(reg) \
127315 + readl((const volatile void __iomem *)(reg))
127316 +#define _READ_WORD_REG(reg) \
127317 + readw((const volatile void __iomem *)(reg))
127318 +#define _READ_BYTE_REG(reg) \
127319 + readb((const volatile void __iomem *)(reg))
127320 +#define _WRITE_DWORD_REG(reg,value) \
127321 + writel((value),(volatile void __iomem *)(reg))
127322 +#define _WRITE_WORD_REG(reg,value) \
127323 + writew((value),(volatile void __iomem *)(reg))
127324 +#define _WRITE_BYTE_REG(reg,value) \
127325 + writeb((value),(volatile void __iomem *)(reg))
127326 +#else
127327 + /* I/O Access macros */
127328 +#define _READ_DWORD_REG(reg) \
127329 + readl((reg))
127330 +#define _READ_WORD_REG(reg) \
127331 + readw((reg))
127332 +#define _READ_BYTE_REG(reg) \
127333 + readb((reg))
127334 +#define _WRITE_DWORD_REG(reg,value) \
127335 + writel((value),(reg))
127336 +#define _WRITE_WORD_REG(reg,value) \
127337 + writew((value),(reg))
127338 +#define _WRITE_BYTE_REG(reg,value) \
127339 + writeb((value),(reg))
127340 +#endif
127341 + /* atomic operators */
127342 +static inline ATOMIC_FLAGS AtomicTest_Set(volatile ATOMIC_FLAGS *pValue, INT BitNo) {
127343 + return test_and_set_bit(BitNo,(ATOMIC_FLAGS *)pValue);
127344 +}
127345 +static inline ATOMIC_FLAGS AtomicTest_Clear(volatile ATOMIC_FLAGS *pValue, INT BitNo) {
127346 + return test_and_clear_bit(BitNo,(ATOMIC_FLAGS *)pValue);
127347 +}
127348 +
127349 +struct _OSKERNEL_HELPER;
127350 +
127351 +typedef THREAD_RETURN (*PHELPER_FUNCTION)(struct _OSKERNEL_HELPER *);
127352 +
127353 +typedef struct _OSKERNEL_HELPER {
127354 + PKERNEL_TASK pTask;
127355 + BOOL ShutDown;
127356 + OS_SIGNAL WakeSignal;
127357 + struct completion Completion;
127358 + PVOID pContext;
127359 + PHELPER_FUNCTION pHelperFunc;
127360 +}OSKERNEL_HELPER, *POSKERNEL_HELPER;
127361 +
127362 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127363 + @function: Wake the helper thread
127364 +
127365 + @function name: SD_WAKE_OS_HELPER
127366 + @prototype: SD_WAKE_OS_HELPER(POSKERNEL_HELPER pOSHelper)
127367 + @category: Support_Reference
127368 +
127369 + @input: pOSHelper - the OS helper object
127370 +
127371 + @return: SDIO_STATUS
127372 +
127373 + @see also: SDLIB_OSCreateHelper
127374 +
127375 + @example: Waking up a helper thread
127376 + status = SD_WAKE_OS_HELPER(&pInstance->OSHelper);
127377 +
127378 +
127379 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127380 +#define SD_WAKE_OS_HELPER(p) SignalSet(&(p)->WakeSignal)
127381 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127382 + @function: Obtains the context for the helper function
127383 +
127384 + @function name: SD_GET_OS_HELPER_CONTEXT
127385 + @prototype: SD_GET_OS_HELPER_CONTEXT(POSKERNEL_HELPER pOSHelper)
127386 + @category: Support_Reference
127387 +
127388 + @input: pOSHelper - the OS helper object
127389 +
127390 + @return: helper specific context
127391 +
127392 + @notes: This macro should only be called by the function associated with
127393 + the helper object.
127394 +
127395 + @see also: SDLIB_OSCreateHelper
127396 +
127397 + @example: Getting the helper specific context
127398 + PMYCONTEXT pContext = (PMYCONTEXT)SD_GET_OS_HELPER_CONTEXT(pHelper);
127399 +
127400 +
127401 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127402 +#define SD_GET_OS_HELPER_CONTEXT(p) (p)->pContext
127403 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127404 + @function: Check helper function shut down flag.
127405 +
127406 + @function name: SD_IS_HELPER_SHUTTING_DOWN
127407 + @prototype: SD_IS_HELPER_SHUTTING_DOWN(POSKERNEL_HELPER pOSHelper)
127408 + @category: Support_Reference
127409 +
127410 + @input: pOSHelper - the OS helper object
127411 +
127412 + @return: TRUE if shutting down, else FALSE
127413 +
127414 + @notes: This macro should only be called by the function associated with
127415 + the helper object. The function should call this macro when it
127416 + unblocks from the call to SD_WAIT_FOR_WAKEUP(). If this function
127417 + returns TRUE, the function should clean up and exit.
127418 +
127419 + @see also: SDLIB_OSCreateHelper , SD_WAIT_FOR_WAKEUP
127420 +
127421 + @example: Checking for shutdown
127422 + while(1) {
127423 + status = SD_WAIT_FOR_WAKEUP(pHelper);
127424 + if (!SDIO_SUCCESS(status)) {
127425 + break;
127426 + }
127427 + if (SD_IS_HELPER_SHUTTING_DOWN(pHelper)) {
127428 + ... shutting down
127429 + break;
127430 + }
127431 + }
127432 +
127433 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127434 +#define SD_IS_HELPER_SHUTTING_DOWN(p) (p)->ShutDown
127435 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127436 + @function: Suspend and wait for wakeup signal
127437 +
127438 + @function name: SD_WAIT_FOR_WAKEUP
127439 + @prototype: SD_WAIT_FOR_WAKEUP(POSKERNEL_HELPER pOSHelper)
127440 + @category: Support_Reference
127441 +
127442 + @input: pOSHelper - the OS helper object
127443 +
127444 + @return: SDIO_STATUS
127445 +
127446 + @notes: This macro should only be called by the function associated with
127447 + the helper object. The function should call this function to suspend (block)
127448 + itself and wait for a wake up signal. The function should always check
127449 + whether the function should exit by calling SD_IS_HELPER_SHUTTING_DOWN.
127450 +
127451 + @see also: SDLIB_OSCreateHelper , SD_IS_HELPER_SHUTTING_DOWN
127452 +
127453 + @example: block on the wake signal
127454 + while(1) {
127455 + status = SD_WAIT_FOR_WAKEUP(pHelper);
127456 + if (!SDIO_SUCCESS(status)) {
127457 + break;
127458 + }
127459 + if (SD_IS_HELPER_SHUTTING_DOWN(pHelper)) {
127460 + ... shutting down
127461 + break;
127462 + }
127463 + }
127464 +
127465 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127466 +#define SD_WAIT_FOR_WAKEUP(p) SignalWaitInterruptible(&(p)->WakeSignal);
127467 +
127468 +#define CT_LE16_TO_CPU_ENDIAN(x) __le16_to_cpu(x)
127469 +#define CT_LE32_TO_CPU_ENDIAN(x) __le32_to_cpu(x)
127470 +#define CT_CPU_ENDIAN_TO_LE16(x) __cpu_to_le16(x)
127471 +#define CT_CPU_ENDIAN_TO_LE32(x) __cpu_to_le32(x)
127472 +
127473 +#define CT_CPU_ENDIAN_TO_BE16(x) __cpu_to_be16(x)
127474 +#define CT_CPU_ENDIAN_TO_BE32(x) __cpu_to_be32(x)
127475 +#define CT_BE16_TO_CPU_ENDIAN(x) __be16_to_cpu(x)
127476 +#define CT_BE32_TO_CPU_ENDIAN(x) __be32_to_cpu(x)
127477 +#endif /* __CPSYSTEM_LINUX_H___ */
127478 +
127479 Index: linux-2.6.24.7/include/linux/sdio/mmc_defs.h
127480 ===================================================================
127481 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
127482 +++ linux-2.6.24.7/include/linux/sdio/mmc_defs.h 2008-12-11 22:46:49.000000000 +0100
127483 @@ -0,0 +1,103 @@
127484 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127485 +@file: mmc_defs.h
127486 +
127487 +@abstract: MMC definitions not already defined in _sdio_defs.h
127488 +
127489 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
127490 +
127491 +
127492 + *
127493 + * This program is free software; you can redistribute it and/or modify
127494 + * it under the terms of the GNU General Public License version 2 as
127495 + * published by the Free Software Foundation;
127496 + *
127497 + * Software distributed under the License is distributed on an "AS
127498 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
127499 + * implied. See the License for the specific language governing
127500 + * rights and limitations under the License.
127501 + *
127502 + * Portions of this code were developed with information supplied from the
127503 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
127504 + *
127505 + * The following conditions apply to the release of the SD simplified specification (�Simplified
127506 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
127507 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
127508 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
127509 + * Specification may require a license from the SD Card Association or other third parties.
127510 + * Disclaimers:
127511 + * The information contained in the Simplified Specification is presented only as a standard
127512 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
127513 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
127514 + * any damages, any infringements of patents or other right of the SD Card Association or any third
127515 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
127516 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
127517 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
127518 + * information, know-how or other confidential information to any third party.
127519 + *
127520 + *
127521 + * The initial developers of the original code are Seung Yi and Paul Lever
127522 + *
127523 + * sdio@atheros.com
127524 + *
127525 + *
127526 +
127527 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127528 +#ifndef ___MMC_DEFS_H___
127529 +#define ___MMC_DEFS_H___
127530 +
127531 +#define MMC_MAX_BUS_CLOCK 20000000 /* max clock speed in hz */
127532 +#define MMC_HS_MAX_BUS_CLOCK 52000000 /* MMC PLUS (high speed) max clock rate in hz */
127533 +
127534 +/* R2 (CSD) macros */
127535 +#define GET_MMC_CSD_TRANS_SPEED(pR) (pR)[12]
127536 +#define GET_MMC_SPEC_VERSION(pR) (((pR)[15] >> 2) & 0x0F)
127537 +#define MMC_SPEC_1_0_TO_1_2 0x00
127538 +#define MMC_SPEC_1_4 0x01
127539 +#define MMC_SPEC_2_0_TO_2_2 0x02
127540 +#define MMC_SPEC_3_1 0x03
127541 +#define MMC_SPEC_4_0_TO_4_1 0x04
127542 +
127543 +#define MMC_CMD_SWITCH 6
127544 +#define MMC_CMD8 8
127545 +
127546 +#define MMC_SWITCH_CMD_SET 0
127547 +#define MMC_SWITCH_SET_BITS 1
127548 +#define MMC_SWITCH_CLEAR_BITS 2
127549 +#define MMC_SWITCH_WRITE_BYTE 3
127550 +#define MMC_SWITCH_CMD_SET0 0
127551 +#define MMC_SWITCH_BUILD_ARG(cmdset,access,index,value) \
127552 + (((cmdset) & 0x07) | (((access) & 0x03) << 24) | (((index) & 0xFF) << 16) | (((value) & 0xFF) << 8))
127553 +
127554 +#define MMC_EXT_CSD_SIZE 512
127555 +
127556 +#define MMC_EXT_S_CMD_SET_OFFSET 504
127557 +#define MMC_EXT_MIN_PERF_W_8_52_OFFSET 210
127558 +#define MMC_EXT_MIN_PERF_R_8_52_OFFSET 209
127559 +#define MMC_EXT_MIN_PERF_W_8_26_4_52_OFFSET 208
127560 +#define MMC_EXT_MIN_PERF_R_8_26_4_52_OFFSET 207
127561 +#define MMC_EXT_MIN_PERF_W_4_26_OFFSET 206
127562 +#define MMC_EXT_MIN_PERF_R_4_56_OFFSET 205
127563 +#define MMC_EXT_PWR_CL_26_360_OFFSET 203
127564 +#define MMC_EXT_PWR_CL_52_360_OFFSET 202
127565 +#define MMC_EXT_PWR_CL_26_195_OFFSET 201
127566 +#define MMC_EXT_PWR_CL_52_195_OFFSET 200
127567 +#define MMC_EXT_GET_PWR_CLASS(reg) ((reg) & 0xF)
127568 +#define MMC_EXT_MAX_PWR_CLASSES 16
127569 +#define MMC_EXT_CARD_TYPE_OFFSET 196
127570 +#define MMC_EXT_CARD_TYPE_HS_52 (1 << 1)
127571 +#define MMC_EXT_CARD_TYPE_HS_26 (1 << 0)
127572 +#define MMC_EXT_CSD_VER_OFFSET 194
127573 +#define MMC_EXT_VER_OFFSET 192
127574 +#define MMC_EXT_VER_1_0 0
127575 +#define MMC_EXT_VER_1_1 1
127576 +#define MMC_EXT_CMD_SET_OFFSET 191
127577 +#define MMC_EXT_CMD_SET_REV_OFFSET 189
127578 +#define MMC_EXT_PWR_CLASS_OFFSET 187
127579 +#define MMC_EXT_HS_TIMING_OFFSET 185
127580 +#define MMC_EXT_HS_TIMING_ENABLE 0x01
127581 +#define MMC_EXT_BUS_WIDTH_OFFSET 183
127582 +#define MMC_EXT_BUS_WIDTH_1_BIT 0x00
127583 +#define MMC_EXT_BUS_WIDTH_4_BIT 0x01
127584 +#define MMC_EXT_BUS_WIDTH_8_BIT 0x02
127585 +
127586 +#endif
127587 Index: linux-2.6.24.7/include/linux/sdio/sdio_busdriver.h
127588 ===================================================================
127589 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
127590 +++ linux-2.6.24.7/include/linux/sdio/sdio_busdriver.h 2008-12-11 22:46:49.000000000 +0100
127591 @@ -0,0 +1,1435 @@
127592 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127593 +@file: sdio_busdriver.h
127594 +
127595 +@abstract: include file for registration of SDIO function drivers
127596 + and SDIO host controller bus drivers.
127597 +
127598 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
127599 +
127600 +
127601 + *
127602 + * This program is free software; you can redistribute it and/or modify
127603 + * it under the terms of the GNU General Public License version 2 as
127604 + * published by the Free Software Foundation;
127605 + *
127606 + * Software distributed under the License is distributed on an "AS
127607 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
127608 + * implied. See the License for the specific language governing
127609 + * rights and limitations under the License.
127610 + *
127611 + * Portions of this code were developed with information supplied from the
127612 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
127613 + *
127614 + * The following conditions apply to the release of the SD simplified specification (�Simplified
127615 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
127616 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
127617 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
127618 + * Specification may require a license from the SD Card Association or other third parties.
127619 + * Disclaimers:
127620 + * The information contained in the Simplified Specification is presented only as a standard
127621 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
127622 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
127623 + * any damages, any infringements of patents or other right of the SD Card Association or any third
127624 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
127625 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
127626 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
127627 + * information, know-how or other confidential information to any third party.
127628 + *
127629 + *
127630 + * The initial developers of the original code are Seung Yi and Paul Lever
127631 + *
127632 + * sdio@atheros.com
127633 + *
127634 + *
127635 +
127636 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127637 +#ifndef __SDIO_BUSDRIVER_H___
127638 +#define __SDIO_BUSDRIVER_H___
127639 +
127640 +typedef UINT8 CT_VERSION_CODE;
127641 +#define CT_SDIO_STACK_VERSION_CODE ((CT_VERSION_CODE)0x26) /* version code that must be set in various structures */
127642 +#define CT_SDIO_STACK_VERSION_MAJOR(v) (((v) & 0xF0) >> 4)
127643 +#define CT_SDIO_STACK_VERSION_MINOR(v) (((v) & 0x0F))
127644 +#define SET_SDIO_STACK_VERSION(p) (p)->Version = CT_SDIO_STACK_VERSION_CODE
127645 +#define GET_SDIO_STACK_VERSION(p) (p)->Version
127646 +#define GET_SDIO_STACK_VERSION_MAJOR(p) CT_SDIO_STACK_VERSION_MAJOR(GET_SDIO_STACK_VERSION(p))
127647 +#define GET_SDIO_STACK_VERSION_MINOR(p) CT_SDIO_STACK_VERSION_MINOR(GET_SDIO_STACK_VERSION(p))
127648 +#include "sdlist.h"
127649 +
127650 +/* card flags */
127651 +typedef UINT16 CARD_INFO_FLAGS;
127652 +#define CARD_MMC 0x0001 /* Multi-media card */
127653 +#define CARD_SD 0x0002 /* SD-Memory present */
127654 +#define CARD_SDIO 0x0004 /* SDIO present */
127655 +#define CARD_RAW 0x0008 /* Raw card */
127656 +#define CARD_COMBO (CARD_SD | CARD_SDIO) /* SDIO with SD */
127657 +#define CARD_TYPE_MASK 0x000F /* card type mask */
127658 +#define CARD_SD_WP 0x0010 /* SD WP on */
127659 +#define CARD_PSEUDO 0x0020 /* pseudo card (internal use) */
127660 +#define CARD_HIPWR 0x0040 /* card can use more than 200mA (SDIO 1.1 or greater)*/
127661 +#define GET_CARD_TYPE(flags) ((flags) & CARD_TYPE_MASK)
127662 +
127663 +/* bus mode and clock rate */
127664 +typedef UINT32 SD_BUSCLOCK_RATE; /* clock rate in hz */
127665 +typedef UINT16 SD_BUSMODE_FLAGS;
127666 +#define SDCONFIG_BUS_WIDTH_RESERVED 0x00
127667 +#define SDCONFIG_BUS_WIDTH_SPI 0x01
127668 +#define SDCONFIG_BUS_WIDTH_1_BIT 0x02
127669 +#define SDCONFIG_BUS_WIDTH_4_BIT 0x03
127670 +#define SDCONFIG_BUS_WIDTH_MMC8_BIT 0x04
127671 +#define SDCONFIG_BUS_WIDTH_MASK 0x0F
127672 +#define SDCONFIG_SET_BUS_WIDTH(flags,width) \
127673 +{ \
127674 + (flags) &= ~SDCONFIG_BUS_WIDTH_MASK; \
127675 + (flags) |= (width); \
127676 +}
127677 +#define SDCONFIG_GET_BUSWIDTH(flags) ((flags) & SDCONFIG_BUS_WIDTH_MASK)
127678 +#define SDCONFIG_BUS_MODE_SPI_NO_CRC 0x40 /* SPI bus is operating with NO CRC */
127679 +#define SDCONFIG_BUS_MODE_SD_HS 0x80 /* set interface to SD high speed mode */
127680 +#define SDCONFIG_BUS_MODE_MMC_HS 0x20 /* set interface to MMC high speed mode */
127681 +
127682 +typedef UINT16 SD_SLOT_CURRENT; /* slot current in mA */
127683 +
127684 +typedef UINT8 SLOT_VOLTAGE_MASK; /* slot voltage */
127685 +#define SLOT_POWER_3_3V 0x01
127686 +#define SLOT_POWER_3_0V 0x02
127687 +#define SLOT_POWER_2_8V 0x04
127688 +#define SLOT_POWER_2_0V 0x08
127689 +#define SLOT_POWER_1_8V 0x10
127690 +#define SLOT_POWER_1_6V 0x20
127691 +
127692 +#define MAX_CARD_RESPONSE_BYTES 17
127693 +
127694 +/* plug and play information for SD cards */
127695 +typedef struct _SD_PNP_INFO {
127696 + UINT16 SDIO_ManufacturerCode; /* JEDEC Code */
127697 + UINT16 SDIO_ManufacturerID; /* manf-specific ID */
127698 + UINT8 SDIO_FunctionNo; /* function number 1-7 */
127699 + UINT8 SDIO_FunctionClass; /* function class */
127700 + UINT8 SDMMC_ManfacturerID; /* card CID's MANF-ID */
127701 + UINT16 SDMMC_OEMApplicationID; /* card CID's OEMAPP-ID */
127702 + CARD_INFO_FLAGS CardFlags; /* card flags */
127703 +}SD_PNP_INFO, *PSD_PNP_INFO;
127704 +
127705 +#define IS_LAST_SDPNPINFO_ENTRY(id)\
127706 + (((id)->SDIO_ManufacturerCode == 0) &&\
127707 + ((id)->SDIO_ManufacturerID == 0) &&\
127708 + ((id)->SDIO_FunctionNo == 0) &&\
127709 + ((id)->SDIO_FunctionClass == 0) &&\
127710 + ((id)->SDMMC_OEMApplicationID == 0) && \
127711 + ((id)->CardFlags == 0))
127712 +
127713 +/* card properties */
127714 +typedef struct _CARD_PROPERTIES {
127715 + UINT8 IOFnCount; /* number of I/O functions */
127716 + UINT8 SDIORevision; /* SDIO revision */
127717 +#define SDIO_REVISION_1_00 0x00
127718 +#define SDIO_REVISION_1_10 0x01
127719 +#define SDIO_REVISION_1_20 0x02
127720 + UINT8 SD_MMC_Revision; /* SD or MMC revision */
127721 +#define SD_REVISION_1_01 0x00
127722 +#define SD_REVISION_1_10 0x01
127723 +#define MMC_REVISION_1_0_2_2 0x00
127724 +#define MMC_REVISION_3_1 0x01
127725 +#define MMC_REVISION_4_0 0x02
127726 + UINT16 SDIO_ManufacturerCode; /* JEDEC Code */
127727 + UINT16 SDIO_ManufacturerID; /* manf-specific ID */
127728 + UINT32 CommonCISPtr; /* common CIS ptr */
127729 + UINT16 RCA; /* relative card address */
127730 + UINT8 SDIOCaps; /* SDIO card capabilities (refer to SDIO spec for decoding) */
127731 + UINT8 CardCSD[MAX_CARD_RESPONSE_BYTES]; /* for SD/MMC cards */
127732 + CARD_INFO_FLAGS Flags; /* card flags */
127733 + SD_BUSCLOCK_RATE OperBusClock; /* operational bus clock (based on HCD limit)*/
127734 + SD_BUSMODE_FLAGS BusMode; /* current card bus mode */
127735 + UINT16 OperBlockLenLimit; /* operational bytes per block length limit*/
127736 + UINT16 OperBlockCountLimit; /* operational number of blocks per transfer limit */
127737 + UINT8 CardState; /* card state flags */
127738 + SLOT_VOLTAGE_MASK CardVoltage; /* card operational voltage */
127739 +#define CARD_STATE_REMOVED 0x01
127740 +}CARD_PROPERTIES, *PCARD_PROPERTIES;
127741 +
127742 +/* SDREQUEST request flags */
127743 +typedef UINT32 SDREQUEST_FLAGS;
127744 +/* write operation */
127745 +#define SDREQ_FLAGS_DATA_WRITE 0x8000
127746 +/* has data (read or write) */
127747 +#define SDREQ_FLAGS_DATA_TRANS 0x4000
127748 +/* command is an atomic APP command, requiring CMD55 to be issued */
127749 +#define SDREQ_FLAGS_APP_CMD 0x2000
127750 +/* transfer should be handled asynchronously */
127751 +#define SDREQ_FLAGS_TRANS_ASYNC 0x1000
127752 +/* host should skip the SPI response filter for this command */
127753 +#define SDREQ_FLAGS_RESP_SKIP_SPI_FILT 0x0800
127754 +/* host should skip the response check for this data transfer */
127755 +#define SDREQ_FLAGS_DATA_SKIP_RESP_CHK 0x0400
127756 +/* flag requesting a CMD12 be automatically issued by host controller */
127757 +#define SDREQ_FLAGS_AUTO_CMD12 0x0200
127758 +/* flag indicating that the data buffer meets HCD's DMA restrictions */
127759 +#define SDREQ_FLAGS_DATA_DMA 0x0010
127760 +/* indicate to host that this is a short and quick transfer, the HCD may optimize
127761 + * this request to reduce interrupt overhead */
127762 +#define SDREQ_FLAGS_DATA_SHORT_TRANSFER 0x00010000
127763 +/* indicate to the host that this is a raw request */
127764 +#define SDREQ_FLAGS_RAW 0x00020000
127765 +/* auto data transfer status check for MMC and Memory cards */
127766 +#define SDREQ_FLAGS_AUTO_TRANSFER_STATUS 0x00100000
127767 +
127768 +#define SDREQ_FLAGS_UNUSED1 0x00200000
127769 +#define SDREQ_FLAGS_UNUSED2 0x00400000
127770 +#define SDREQ_FLAGS_UNUSED3 0x00800000
127771 +#define SDREQ_FLAGS_UNUSED4 0x01000000
127772 +#define SDREQ_FLAGS_UNUSED5 0x02000000
127773 +
127774 +/* the following flags are internal use only */
127775 +#define SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE 0x0100
127776 +/* flag indicating that response has been converted (internal use) */
127777 +#define SDREQ_FLAGS_RESP_SPI_CONVERTED 0x0040
127778 +/* request was cancelled - internal use only */
127779 +#define SDREQ_FLAGS_CANCELED 0x0020
127780 +/* a barrier operation */
127781 +#define SDREQ_FLAGS_BARRIER 0x00040000
127782 +/* a pseudo bus request */
127783 +#define SDREQ_FLAGS_PSEUDO 0x00080000
127784 +/* queue to the head */
127785 +#define SDREQ_FLAGS_QUEUE_HEAD 0x04000000
127786 +
127787 +#define SDREQ_FLAGS_I_UNUSED1 0x08000000
127788 +#define SDREQ_FLAGS_I_UNUSED2 0x10000000
127789 +#define SDREQ_FLAGS_I_UNUSED3 0x20000000
127790 +#define SDREQ_FLAGS_I_UNUSED4 0x40000000
127791 +#define SDREQ_FLAGS_I_UNUSED5 0x80000000
127792 +
127793 +/* response type mask */
127794 +#define SDREQ_FLAGS_RESP_MASK 0x000F
127795 +#define GET_SDREQ_RESP_TYPE(flags) ((flags) & SDREQ_FLAGS_RESP_MASK)
127796 +#define IS_SDREQ_WRITE_DATA(flags) ((flags) & SDREQ_FLAGS_DATA_WRITE)
127797 +#define IS_SDREQ_DATA_TRANS(flags) ((flags) & SDREQ_FLAGS_DATA_TRANS)
127798 +#define IS_SDREQ_RAW(flags) ((flags) & SDREQ_FLAGS_RAW)
127799 +#define IS_SDREQ_FORCE_DEFERRED_COMPLETE(flags) ((flags) & SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE)
127800 +#define SDREQ_FLAGS_NO_RESP 0x0000
127801 +#define SDREQ_FLAGS_RESP_R1 0x0001
127802 +#define SDREQ_FLAGS_RESP_R1B 0x0002
127803 +#define SDREQ_FLAGS_RESP_R2 0x0003
127804 +#define SDREQ_FLAGS_RESP_R3 0x0004
127805 +#define SDREQ_FLAGS_RESP_MMC_R4 0x0005 /* not supported, for future use */
127806 +#define SDREQ_FLAGS_RESP_MMC_R5 0x0006 /* not supported, for future use */
127807 +#define SDREQ_FLAGS_RESP_R6 0x0007
127808 +#define SDREQ_FLAGS_RESP_SDIO_R4 0x0008
127809 +#define SDREQ_FLAGS_RESP_SDIO_R5 0x0009
127810 +
127811 +struct _SDREQUEST;
127812 +struct _SDFUNCTION;
127813 +
127814 +typedef void (*PSDEQUEST_COMPLETION)(struct _SDREQUEST *);
127815 +
127816 +/* defines SD/MMC and SDIO requests for the RAW-mode API */
127817 +typedef struct _SDREQUEST {
127818 + SDLIST SDList; /* internal use list*/
127819 + UINT32 Argument; /* SD/SDIO/MMC 32 bit argument */
127820 + SDREQUEST_FLAGS Flags; /* request flags */
127821 + ATOMIC_FLAGS InternalFlags; /* internal use flags */
127822 + UINT8 Command; /* SD/SDIO/MMC 8 bit command */
127823 + UINT8 Response[MAX_CARD_RESPONSE_BYTES]; /* buffer for CMD response */
127824 + UINT16 BlockCount; /* number of blocks to send/rcv */
127825 + UINT16 BlockLen; /* length of each block */
127826 + UINT16 DescriptorCount; /* number of DMA descriptor entries in pDataBuffer if DMA */
127827 + PVOID pDataBuffer; /* starting address of buffer (or ptr to PSDDMA_DESCRIPTOR*/
127828 + UINT32 DataRemaining; /* number of bytes remaining in the transfer (internal use) */
127829 + PVOID pHcdContext; /* internal use context */
127830 + PSDEQUEST_COMPLETION pCompletion; /* function driver completion routine */
127831 + PVOID pCompleteContext; /* function driver completion context */
127832 + SDIO_STATUS Status; /* completion status */
127833 + struct _SDFUNCTION* pFunction; /* function driver that generated request (internal use)*/
127834 + INT RetryCount; /* number of times to retry on error, non-data cmds only */
127835 + PVOID pBdRsv1; /* reserved */
127836 + PVOID pBdRsv2;
127837 + PVOID pBdRsv3;
127838 +}SDREQUEST, *PSDREQUEST;
127839 +
127840 + /* a request queue */
127841 +typedef struct _SDREQUESTQUEUE {
127842 + SDLIST Queue; /* the queue of requests */
127843 + BOOL Busy; /* busy flag */
127844 +}SDREQUESTQUEUE, *PSDREQUESTQUEUE;
127845 +
127846 +
127847 +typedef UINT16 SDCONFIG_COMMAND;
127848 +/* SDCONFIG request flags */
127849 +/* get operation */
127850 +#define SDCONFIG_FLAGS_DATA_GET 0x8000
127851 +/* put operation */
127852 +#define SDCONFIG_FLAGS_DATA_PUT 0x4000
127853 +/* host controller */
127854 +#define SDCONFIG_FLAGS_HC_CONFIG 0x2000
127855 +/* both */
127856 +#define SDCONFIG_FLAGS_DATA_BOTH (SDCONFIG_FLAGS_DATA_GET | SDCONFIG_FLAGS_DATA_PUT)
127857 +/* no data */
127858 +#define SDCONFIG_FLAGS_DATA_NONE 0x0000
127859 +
127860 +/* SDCONFIG commands */
127861 +#define SDCONFIG_GET_HCD_DEBUG (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_GET | 275)
127862 +#define SDCONFIG_SET_HCD_DEBUG (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_PUT | 276)
127863 +
127864 +/* custom hcd commands */
127865 +#define SDCONFIG_GET_HOST_CUSTOM (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_GET | 300)
127866 +#define SDCONFIG_PUT_HOST_CUSTOM (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_PUT | 301)
127867 +
127868 +/* function commands */
127869 +#define SDCONFIG_FUNC_ENABLE_DISABLE (SDCONFIG_FLAGS_DATA_PUT | 18)
127870 +#define SDCONFIG_FUNC_UNMASK_IRQ (SDCONFIG_FLAGS_DATA_NONE | 21)
127871 +#define SDCONFIG_FUNC_MASK_IRQ (SDCONFIG_FLAGS_DATA_NONE | 22)
127872 +#define SDCONFIG_FUNC_ACK_IRQ (SDCONFIG_FLAGS_DATA_NONE | 23)
127873 +#define SDCONFIG_FUNC_SPI_MODE_DISABLE_CRC (SDCONFIG_FLAGS_DATA_NONE | 24)
127874 +#define SDCONFIG_FUNC_SPI_MODE_ENABLE_CRC (SDCONFIG_FLAGS_DATA_NONE | 25)
127875 +#define SDCONFIG_FUNC_ALLOC_SLOT_CURRENT (SDCONFIG_FLAGS_DATA_PUT | 26)
127876 +#define SDCONFIG_FUNC_FREE_SLOT_CURRENT (SDCONFIG_FLAGS_DATA_NONE | 27)
127877 +#define SDCONFIG_FUNC_CHANGE_BUS_MODE (SDCONFIG_FLAGS_DATA_BOTH | 28)
127878 +#define SDCONFIG_FUNC_CHANGE_BUS_MODE_ASYNC (SDCONFIG_FLAGS_DATA_BOTH | 29)
127879 +#define SDCONFIG_FUNC_NO_IRQ_PEND_CHECK (SDCONFIG_FLAGS_DATA_NONE | 30)
127880 +
127881 +typedef UINT8 FUNC_ENABLE_DISABLE_FLAGS;
127882 +typedef UINT32 FUNC_ENABLE_TIMEOUT;
127883 +
127884 + /* function enable */
127885 +typedef struct _SDCONFIG_FUNC_ENABLE_DISABLE_DATA {
127886 +#define SDCONFIG_DISABLE_FUNC 0x0000
127887 +#define SDCONFIG_ENABLE_FUNC 0x0001
127888 + FUNC_ENABLE_DISABLE_FLAGS EnableFlags; /* enable flags*/
127889 + FUNC_ENABLE_TIMEOUT TimeOut; /* timeout in milliseconds */
127890 + void (*pOpComplete)(PVOID Context, SDIO_STATUS status); /* reserved */
127891 + PVOID pOpCompleteContext; /* reserved */
127892 +}SDCONFIG_FUNC_ENABLE_DISABLE_DATA, *PSDCONFIG_FUNC_ENABLE_DISABLE_DATA;
127893 +
127894 + /* slot current allocation data */
127895 +typedef struct _SDCONFIG_FUNC_SLOT_CURRENT_DATA {
127896 + SD_SLOT_CURRENT SlotCurrent; /* slot current to request in mA*/
127897 +}SDCONFIG_FUNC_SLOT_CURRENT_DATA, *PSDCONFIG_FUNC_SLOT_CURRENT_DATA;
127898 +
127899 +/* slot bus mode configuration */
127900 +typedef struct _SDCONFIG_BUS_MODE_DATA {
127901 + SD_BUSCLOCK_RATE ClockRate; /* clock rate in Hz */
127902 + SD_BUSMODE_FLAGS BusModeFlags; /* bus mode flags */
127903 + SD_BUSCLOCK_RATE ActualClockRate; /* actual rate in KHz */
127904 +}SDCONFIG_BUS_MODE_DATA, *PSDCONFIG_BUS_MODE_DATA;
127905 +
127906 +/* defines configuration requests for the HCD */
127907 +typedef struct _SDCONFIG {
127908 + SDCONFIG_COMMAND Cmd; /* configuration command */
127909 + PVOID pData; /* configuration data */
127910 + INT DataLength; /* config data length */
127911 +}SDCONFIG, *PSDCONFIG;
127912 +
127913 +#define SET_SDCONFIG_CMD_INFO(pHdr,cmd,pC,len) \
127914 +{ \
127915 + (pHdr)->Cmd = (cmd); \
127916 + (pHdr)->pData = (PVOID)(pC); \
127917 + (pHdr)->DataLength = (len); \
127918 +}
127919 +
127920 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127921 + @function: Get a pointer to the configuration command data.
127922 +
127923 + @function name: GET_SDCONFIG_CMD
127924 + @prototype: UNIT16 GET_SDCONFIG_CMD (PSDCONFIG pCommand)
127925 + @category: HD_Reference
127926 +
127927 + @input: pCommand - config command structure.
127928 +
127929 + @return: command code
127930 +
127931 + @notes: Implemented as a macro. This macro returns the command code for this
127932 + configuration request.
127933 +
127934 + @example: getting the command code:
127935 + cmd = GET_SDCONFIG_CMD(pConfig);
127936 + switch (cmd) {
127937 + case SDCONFIG_GET_WP:
127938 + .. get write protect switch position
127939 + break;
127940 + ...
127941 + }
127942 +
127943 + @see also: GET_SDCONFIG_CMD_LEN, GET_SDCONFIG_CMD_DATA
127944 +
127945 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127946 +#define GET_SDCONFIG_CMD(pBuffer) ((pBuffer)->Cmd)
127947 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127948 + @function: Get a pointer to the configuration command data.
127949 +
127950 + @function name: GET_SDCONFIG_CMD_LEN
127951 + @prototype: INT GET_SDCONFIG_CMD_LEN (PSDCONFIG pCommand)
127952 + @category: HD_Reference
127953 +
127954 + @input: pCommand - config command structure.
127955 +
127956 + @return: length of config command data
127957 +
127958 + @notes: Implemented as a macro. Host controller drivers can use this macro to extract
127959 + the number of bytes of command specific data. This can be used to validate the
127960 + config data buffer size.
127961 +
127962 + @example: getting the data length:
127963 + length = GET_SDCONFIG_CMD_LEN(pConfig);
127964 + if (length < CUSTOM_COMMAND_XXX_SIZE) {
127965 + ... invalid length
127966 + }
127967 +
127968 + @see also: GET_SDCONFIG_CMD, GET_SDCONFIG_CMD_DATA
127969 +
127970 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127971 +#define GET_SDCONFIG_CMD_LEN(pBuffer) ((pBuffer)->DataLength)
127972 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
127973 + @function: Get a pointer to the configuration command data.
127974 +
127975 + @function name: GET_SDCONFIG_CMD_DATA
127976 + @prototype: (casted ptr) GET_SDCONFIG_CMD_DATA (type, PSDCONFIG pCommand)
127977 + @category: HD_Reference
127978 +
127979 + @input: type - pointer type to cast the returned pointer to.
127980 + pCommand - config command structure.
127981 +
127982 + @return: type-casted pointer to the command's data
127983 +
127984 + @notes: Implemented as a macro. Host controller drivers can use this macro to extract
127985 + a pointer to the command specific data in an HCD configuration request.
127986 +
127987 + @example: getting the pointer:
127988 + // get interrupt control data
127989 + pIntControl = GET_SDCONFIG_CMD_DATA(PSDCONFIG_SDIO_INT_CTRL_DATA,pConfig);
127990 + if (pIntControl->SlotIRQEnable) {
127991 + ... enable slot IRQ detection
127992 + }
127993 +
127994 + @see also: GET_SDCONFIG_CMD, GET_SDCONFIG_CMD_LEN
127995 +
127996 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
127997 +#define GET_SDCONFIG_CMD_DATA(type,pBuffer) ((type)((pBuffer)->pData))
127998 +#define IS_SDCONFIG_CMD_GET(pBuffer) ((pBuffer)->Cmd & SDCONFIG_FLAGS_DATA_GET)
127999 +#define IS_SDCONFIG_CMD_PUT(pBuffer) ((pBuffer)->Cmd & SDCONFIG_FLAGS_DATA_PUT)
128000 +
128001 +struct _SDDEVICE;
128002 +struct _SDHCD;
128003 +
128004 +typedef UINT8 SD_FUNCTION_FLAGS;
128005 +#define SDFUNCTION_FLAG_REMOVING 0x01
128006 +
128007 +/* function driver registration structure */
128008 +typedef struct _SDFUNCTION {
128009 + CT_VERSION_CODE Version; /* version code of the SDIO stack */
128010 + SDLIST SDList; /* internal use list*/
128011 + PTEXT pName; /* name of registering driver */
128012 + UINT MaxDevices; /* maximum number of devices supported by this function */
128013 + UINT NumDevices; /* number of devices supported by this function */
128014 + PSD_PNP_INFO pIds; /* null terminated table of supported devices*/
128015 + BOOL (*pProbe)(struct _SDFUNCTION *pFunction, struct _SDDEVICE *pDevice);/* New device inserted */
128016 + /* Device removed (NULL if not a hot-plug capable driver) */
128017 + void (*pRemove)(struct _SDFUNCTION *pFunction, struct _SDDEVICE *pDevice);
128018 + SDIO_STATUS (*pSuspend)(struct _SDFUNCTION *pFunction, SDPOWER_STATE state); /* Device suspended */
128019 + SDIO_STATUS (*pResume)(struct _SDFUNCTION *pFunction); /* Device woken up */
128020 + /* Enable wake event */
128021 + SDIO_STATUS (*pWake) (struct _SDFUNCTION *pFunction, SDPOWER_STATE state, BOOL enable);
128022 + PVOID pContext; /* function driver use data */
128023 + OS_PNPDRIVER Driver; /* driver registration with base system */
128024 + SDLIST DeviceList; /* the list of devices this driver is using*/
128025 + OS_SIGNAL CleanupReqSig; /* wait for requests completion on cleanup (internal use) */
128026 + SD_FUNCTION_FLAGS Flags; /* internal flags (internal use) */
128027 +}SDFUNCTION, *PSDFUNCTION;
128028 +
128029 +typedef UINT8 HCD_EVENT;
128030 +
128031 + /* device info for SDIO functions */
128032 +typedef struct _SDIO_DEVICE_INFO {
128033 + UINT32 FunctionCISPtr; /* function's CIS ptr */
128034 + UINT32 FunctionCSAPtr; /* function's CSA ptr */
128035 + UINT16 FunctionMaxBlockSize; /* function's reported max block size */
128036 +}SDIO_DEVICE_INFO, *PSDIO_DEVICE_INFO;
128037 +
128038 + /* device info for SD/MMC card functions */
128039 +typedef struct _SDMMC_INFO{
128040 + UINT8 Unused; /* reserved */
128041 +}SDMMC_INFO, *PSDMMC_INFO;
128042 +
128043 + /* union of SDIO function and device info */
128044 +typedef union _SDDEVICE_INFO {
128045 + SDIO_DEVICE_INFO AsSDIOInfo;
128046 + SDMMC_INFO AsSDMMCInfo;
128047 +}SDDEVICE_INFO, *PSDDEVICE_INFO;
128048 +
128049 +
128050 +typedef UINT8 SD_DEVICE_FLAGS;
128051 +#define SDDEVICE_FLAG_REMOVING 0x01
128052 +
128053 +/* inserted device description, describes an inserted card */
128054 +typedef struct _SDDEVICE {
128055 + SDLIST SDList; /* internal use list*/
128056 + SDLIST FuncListLink; /* internal use list */
128057 + /* read/write request function */
128058 + SDIO_STATUS (*pRequest)(struct _SDDEVICE *pDev, PSDREQUEST req);
128059 + /* get/set configuration */
128060 + SDIO_STATUS (*pConfigure)(struct _SDDEVICE *pDev, PSDCONFIG config);
128061 + PSDREQUEST (*AllocRequest)(struct _SDDEVICE *pDev); /* allocate a request */
128062 + void (*FreeRequest)(struct _SDDEVICE *pDev, PSDREQUEST pReq); /* free the request */
128063 + void (*pIrqFunction)(PVOID pContext); /* interrupt routine, synchronous calls allowed */
128064 + void (*pIrqAsyncFunction)(PVOID pContext); /* async IRQ function , asynch only calls */
128065 + PVOID IrqContext; /* irq context */
128066 + PVOID IrqAsyncContext; /* irq async context */
128067 + PSDFUNCTION pFunction; /* function driver supporting this device */
128068 + struct _SDHCD *pHcd; /* host controller this device is on (internal use) */
128069 + SDDEVICE_INFO DeviceInfo; /* device info */
128070 + SD_PNP_INFO pId[1]; /* id of this device */
128071 + OS_PNPDEVICE Device; /* device registration with base system */
128072 + SD_SLOT_CURRENT SlotCurrentAlloc; /* allocated slot current for this device/function (internal use) */
128073 + SD_DEVICE_FLAGS Flags; /* internal use flags */
128074 + CT_VERSION_CODE Version; /* version code of the bus driver */
128075 +}SDDEVICE, *PSDDEVICE;
128076 +
128077 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128078 + @function: Get SDIO Bus Driver Version Major number
128079 +
128080 + @function name: SDDEVICE_GET_VERSION_MAJOR
128081 + @prototype: INT SDDEVICE_GET_VERSION_MAJOR(PSDDEVICE pDevice)
128082 + @category: PD_Reference
128083 +
128084 + @input: pDevice - the target device for this request
128085 +
128086 + @output: none
128087 +
128088 + @return: integer value for the major version
128089 +
128090 + @notes: Implemented as a macro.
128091 +
128092 + @see also: SDDEVICE_GET_VERSION_MINOR
128093 +
128094 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128095 +#define SDDEVICE_GET_VERSION_MAJOR(pDev) (GET_SDIO_STACK_VERSION_MAJOR(pDev))
128096 +
128097 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128098 + @function: Get SDIO Bus Driver Version Minor number
128099 +
128100 + @function name: SDDEVICE_GET_VERSION_MINOR
128101 + @prototype: INT SDDEVICE_GET_VERSION_MINOR(PSDDEVICE pDevice)
128102 + @category: PD_Reference
128103 +
128104 + @input: pDevice - the target device for this request
128105 +
128106 + @output: none
128107 +
128108 + @return: integer value for the minor version
128109 +
128110 + @notes: Implemented as a macro.
128111 +
128112 + @see also: SDDEVICE_GET_VERSION_MAJOR
128113 +
128114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128115 +#define SDDEVICE_GET_VERSION_MINOR(pDev) (GET_SDIO_STACK_VERSION_MINOR(pDev))
128116 +
128117 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128118 + @function: Test the SDIO revision for greater than or equal to 1.10
128119 +
128120 + @function name: SDDEVICE_IS_SDIO_REV_GTEQ_1_10
128121 + @prototype: BOOL SDDEVICE_IS_SDIO_REV_GTEQ_1_10(PSDDEVICE pDevice)
128122 + @category: PD_Reference
128123 +
128124 + @input: pDevice - the target device for this request
128125 +
128126 + @output: none
128127 +
128128 + @return: TRUE if the revision is greater than or equal to 1.10
128129 +
128130 + @notes: Implemented as a macro.
128131 +
128132 + @see also: SDDEVICE_IS_SD_REV_GTEQ_1_10
128133 + @see also: SDDEVICE_IS_MMC_REV_GTEQ_4_0
128134 +
128135 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128136 +#define SDDEVICE_IS_SDIO_REV_GTEQ_1_10(pDev) ((pDev)->pHcd->CardProperties.SDIORevision >= SDIO_REVISION_1_10)
128137 +
128138 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128139 + @function: Test the SDIO revision for greater than or equal to 1.20
128140 +
128141 + @function name: SDDEVICE_IS_SDIO_REV_GTEQ_1_20
128142 + @prototype: BOOL SDDEVICE_IS_SDIO_REV_GTEQ_1_20(PSDDEVICE pDevice)
128143 + @category: PD_Reference
128144 +
128145 + @input: pDevice - the target device for this request
128146 +
128147 + @output: none
128148 +
128149 + @return: TRUE if the revision is greater than or equal to 1.20
128150 +
128151 + @notes: Implemented as a macro.
128152 +
128153 + @see also: SDDEVICE_IS_SD_REV_GTEQ_1_10
128154 + @see also: SDDEVICE_IS_SDIO_REV_GTEQ_1_10
128155 +
128156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128157 +#define SDDEVICE_IS_SDIO_REV_GTEQ_1_20(pDev) ((pDev)->pHcd->CardProperties.SDIORevision >= SDIO_REVISION_1_20)
128158 +
128159 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128160 + @function: Test the SD revision for greater than or equal to 1.10
128161 +
128162 + @function name: SDDEVICE_IS_SD_REV_GTEQ_1_10
128163 + @prototype: BOOL SDDEVICE_IS_SD_REV_GTEQ_1_10(PSDDEVICE pDevice)
128164 + @category: PD_Reference
128165 +
128166 + @input: pDevice - the target device for this request
128167 +
128168 + @output: none
128169 +
128170 + @return: TRUE if the revision is greater than or equal to 1.10
128171 +
128172 + @notes: Implemented as a macro.
128173 +
128174 + @see also: SDDEVICE_IS_SDIO_REV_GTEQ_1_10
128175 + @see also: SDDEVICE_IS_MMC_REV_GTEQ_4_0
128176 +
128177 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128178 +#define SDDEVICE_IS_SD_REV_GTEQ_1_10(pDev) ((pDev)->pHcd->CardProperties.SD_MMC_Revision >= SD_REVISION_1_10)
128179 +
128180 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128181 + @function: Test the MMC revision for greater than or equal to 4.0
128182 +
128183 + @function name: SDDEVICE_IS_MMC_REV_GTEQ_4_0
128184 + @prototype: BOOL SDDEVICE_IS_MMC_REV_GTEQ_4_0(PSDDEVICE pDevice)
128185 + @category: PD_Reference
128186 +
128187 + @input: pDevice - the target device for this request
128188 +
128189 + @output: none
128190 +
128191 + @return: TRUE if the revision is greater than or equal to 4.0
128192 +
128193 + @notes: Implemented as a macro.
128194 +
128195 + @see also: SDDEVICE_IS_SDIO_REV_GTEQ_1_10
128196 + @see also: SDDEVICE_IS_SD_REV_GTEQ_1_10
128197 +
128198 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128199 +#define SDDEVICE_IS_MMC_REV_GTEQ_4_0(pDev) ((pDev)->pHcd->CardProperties.SD_MMC_Revision >= MMC_REVISION_4_0)
128200 +
128201 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128202 + @function: Test for write protect enabled
128203 +
128204 + @function name: SDDEVICE_IS_CARD_WP_ON
128205 + @prototype: BOOL SDDEVICE_IS_CARD_WP_ON(PSDDEVICE pDevice)
128206 + @category: PD_Reference
128207 +
128208 + @input: pDevice - the target device for this request
128209 +
128210 + @output: none
128211 +
128212 + @return: TRUE if device is write protected.
128213 +
128214 + @notes: Implemented as a macro.
128215 +
128216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128217 +#define SDDEVICE_IS_CARD_WP_ON(pDev) ((pDev)->pHcd->CardProperties.Flags & CARD_SD_WP)
128218 +
128219 +
128220 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128221 + @function: Get the device's manufacturer specific ID
128222 +
128223 + @function name: SDDEVICE_GET_SDIO_MANFID
128224 + @prototype: UINT16 SDDEVICE_GET_SDIO_MANFID(PSDDEVICE pDevice)
128225 + @category: PD_Reference
128226 +
128227 + @input: pDevice - the target device for this request
128228 +
128229 + @output: none
128230 +
128231 + @return: function number
128232 +
128233 + @notes: Implemented as a macro.
128234 +
128235 + @see also: SDDEVICE_GET_SDIO_MANFCODE
128236 +
128237 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128238 +#define SDDEVICE_GET_SDIO_MANFID(pDev) (pDev)->pId[0].SDIO_ManufacturerID
128239 +
128240 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128241 + @function: Get the device's manufacturer code
128242 +
128243 + @function name: SDDEVICE_GET_SDIO_MANFCODE
128244 + @prototype: UINT16 SDDEVICE_GET_SDIO_MANFCODE(PSDDEVICE pDevice)
128245 + @category: PD_Reference
128246 +
128247 + @input: pDevice - the target device for this request
128248 +
128249 + @output: none
128250 +
128251 + @return: function number
128252 +
128253 + @notes: Implemented as a macro.
128254 +
128255 + @see also: SDDEVICE_GET_SDIO_MANFID
128256 +
128257 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128258 +#define SDDEVICE_GET_SDIO_MANFCODE(pDev) (pDev)->pId[0].SDIO_ManufacturerCode
128259 +
128260 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128261 + @function: Get the device's function number
128262 +
128263 + @function name: SDDEVICE_GET_SDIO_FUNCNO
128264 + @prototype: UINT8 SDDEVICE_GET_SDIO_FUNCNO(PSDDEVICE pDevice)
128265 + @category: PD_Reference
128266 +
128267 + @input: pDevice - the target device for this request
128268 +
128269 + @output: none
128270 +
128271 + @return: function number
128272 +
128273 + @notes: Implemented as a macro.
128274 +
128275 + @see also: SDDEVICE_GET_SDIO_FUNC_CLASS
128276 +
128277 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128278 +#define SDDEVICE_GET_SDIO_FUNCNO(pDev) (pDev)->pId[0].SDIO_FunctionNo
128279 +
128280 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128281 + @function: Get the functions's class
128282 +
128283 + @function name: SDDEVICE_GET_SDIO_FUNC_CLASS
128284 + @prototype: UINT8 SDDEVICE_GET_SDIO_FUNC_CLASS(PSDDEVICE pDevice)
128285 + @category: PD_Reference
128286 +
128287 + @input: pDevice - the target device for this request
128288 +
128289 + @output: none
128290 +
128291 + @return: class number
128292 +
128293 + @notes: Implemented as a macro.
128294 +
128295 + @see also: SDDEVICE_GET_SDIO_FUNCNO
128296 +
128297 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128298 +#define SDDEVICE_GET_SDIO_FUNC_CLASS(pDev) (pDev)->pId[0].SDIO_FunctionClass
128299 +
128300 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128301 + @function: Get the functions's Card Information Structure pointer
128302 +
128303 + @function name: SDDEVICE_GET_SDIO_FUNC_CISPTR
128304 + @prototype: UINT32 SDDEVICE_GET_SDIO_FUNC_CISPTR(PSDDEVICE pDevice)
128305 + @category: PD_Reference
128306 +
128307 + @input: pDevice - the target device for this request
128308 +
128309 + @output: none
128310 +
128311 + @return: CIS offset
128312 +
128313 + @notes: Implemented as a macro.
128314 +
128315 + @see also: SDDEVICE_GET_SDIO_FUNC_CSAPTR
128316 + @see also: SDDEVICE_GET_SDIO_COMMON_CISPTR
128317 +
128318 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128319 +#define SDDEVICE_GET_SDIO_FUNC_CISPTR(pDev)(pDev)->DeviceInfo.AsSDIOInfo.FunctionCISPtr
128320 +
128321 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128322 + @function: Get the functions's Code Stoarge Area pointer
128323 +
128324 + @function name: SDDEVICE_GET_SDIO_FUNC_CSAPTR
128325 + @prototype: UINT32 SDDEVICE_GET_SDIO_FUNC_CSAPTR(PSDDEVICE pDevice)
128326 + @category: PD_Reference
128327 +
128328 + @input: pDevice - the target device for this request
128329 +
128330 + @output: none
128331 +
128332 + @return: CSA offset
128333 +
128334 + @notes: Implemented as a macro.
128335 +
128336 + @see also: SDDEVICE_GET_SDIO_FUNC_CISPTR
128337 +
128338 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128339 +#define SDDEVICE_GET_SDIO_FUNC_CSAPTR(pDev)(pDev)->DeviceInfo.AsSDIOInfo.FunctionCSAPtr
128340 +
128341 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128342 + @function: Get the functions's maximum reported block size
128343 +
128344 + @function name: SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE
128345 + @prototype: UINT16 SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(PSDDEVICE pDevice)
128346 + @category: PD_Reference
128347 +
128348 + @input: pDevice - the target device for this request
128349 +
128350 + @output: none
128351 +
128352 + @return: block size
128353 +
128354 + @notes: Implemented as a macro.
128355 +
128356 + @see also:
128357 +
128358 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128359 +#define SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(pDev) (pDev)->DeviceInfo.AsSDIOInfo.FunctionMaxBlockSize
128360 +
128361 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128362 + @function: Get the common Card Information Structure pointer
128363 +
128364 + @function name: SDDEVICE_GET_SDIO_COMMON_CISPTR
128365 + @prototype: UINT32 SDDEVICE_GET_SDIO_COMMON_CISPTR(PSDDEVICE pDevice)
128366 + @category: PD_Reference
128367 +
128368 + @input: pDevice - the target device for this request
128369 +
128370 + @output: none
128371 +
128372 + @return: Common CIS Address (in SDIO address space)
128373 +
128374 + @notes: Implemented as a macro.
128375 +
128376 + @see also: SDDEVICE_GET_SDIO_FUNC_CSAPTR
128377 +
128378 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128379 +#define SDDEVICE_GET_SDIO_COMMON_CISPTR(pDev) (pDev)->pHcd->CardProperties.CommonCISPtr
128380 +
128381 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128382 + @function: Get the card capabilities
128383 +
128384 + @function name: SDDEVICE_GET_SDIO_CARD_CAPS
128385 + @prototype: UINT8 SDDEVICE_GET_SDIO_CARD_CAPS(PSDDEVICE pDevice)
128386 + @category: PD_Reference
128387 +
128388 + @input: pDevice - the target device for this request
128389 +
128390 + @output: none
128391 +
128392 + @return: 8-bit card capabilities register
128393 +
128394 + @notes: Implemented as a macro. Refer to SDIO spec for decoding.
128395 +
128396 + @see also: SDDEVICE_GET_CARD_FLAGS
128397 + @see also: SDDEVICE_GET_SDIOCARD_CAPS
128398 +
128399 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128400 +#define SDDEVICE_GET_SDIO_CARD_CAPS(pDev) (pDev)->pHcd->CardProperties.SDIOCaps
128401 +
128402 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128403 + @function: Get the card flags
128404 +
128405 + @function name: SDDEVICE_GET_CARD_FLAGS
128406 + @prototype: CARD_INFO_FLAGS SDDEVICE_GET_CARD_FLAGS(PSDDEVICE pDevice)
128407 + @category: PD_Reference
128408 +
128409 + @input: pDevice - the target device for this request
128410 +
128411 + @output: none
128412 +
128413 + @return: flags
128414 +
128415 + @notes: Implemented as a macro.
128416 +
128417 + @example: Get card type:
128418 + CARD_INFO_FLAGS flags;
128419 + flags = SDDEVICE_GET_CARD_FLAGS(pDevice);
128420 + switch(GET_CARD_TYPE(flags)) {
128421 + case CARD_MMC: // Multi-media card
128422 + ...
128423 + case CARD_SD: // SD-Memory present
128424 + ...
128425 + case CARD_SDIO: // SDIO card present
128426 + ...
128427 + case CARD_COMBO: //SDIO card with SD
128428 + ...
128429 + }
128430 + if (flags & CARD_SD_WP) {
128431 + ...SD write protect on
128432 + }
128433 +
128434 + @see also: SDDEVICE_GET_SDIO_CARD_CAPS
128435 +
128436 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128437 +#define SDDEVICE_GET_CARD_FLAGS(pDev) (pDev)->pHcd->CardProperties.Flags
128438 +
128439 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128440 + @function: Get the Relative Card Address register
128441 +
128442 + @function name: SDDEVICE_GET_CARD_RCA
128443 + @prototype: UINT16 SDDEVICE_GET_CARD_RCA(PSDDEVICE pDevice)
128444 + @category: PD_Reference
128445 +
128446 + @input: pDevice - the target device for this request
128447 +
128448 + @output: none
128449 +
128450 + @return: register address
128451 +
128452 + @notes: Implemented as a macro. Refer to SDIO spec for decoding.
128453 +
128454 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128455 +#define SDDEVICE_GET_CARD_RCA(pDev) (pDev)->pHcd->CardProperties.RCA
128456 +
128457 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128458 + @function: Get operational bus clock
128459 +
128460 + @function name: SDDEVICE_GET_OPER_CLOCK
128461 + @prototype: SD_BUSCLOCK_RATE SDDEVICE_GET_OPER_CLOCK(PSDDEVICE pDevice)
128462 + @category: PD_Reference
128463 +
128464 + @input: pDevice - the target device for this request
128465 +
128466 + @output: none
128467 +
128468 + @return: clock rate
128469 +
128470 + @notes: Implemented as a macro. Returns the current bus clock rate.
128471 + This may be lower than reported by the card due to Host Controller,
128472 + Bus driver, or power management limitations.
128473 +
128474 + @see also: SDDEVICE_GET_MAX_CLOCK
128475 +
128476 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128477 +#define SDDEVICE_GET_OPER_CLOCK(pDev) (pDev)->pHcd->CardProperties.OperBusClock
128478 +
128479 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128480 + @function: Get maximum bus clock
128481 +
128482 + @function name: SDDEVICE_GET_MAX_CLOCK
128483 + @prototype: SD_BUSCLOCK_RATE SDDEVICE_GET_MAX_CLOCK(PSDDEVICE pDevice)
128484 + @category: PD_Reference
128485 +
128486 + @input: pDevice - the target device for this request
128487 +
128488 + @output: none
128489 +
128490 + @return: clock rate
128491 +
128492 + @notes: To obtain the current maximum clock rate use SDDEVICE_GET_OPER_CLOCK().
128493 + This rate my be lower than the host controllers maximum obtained using
128494 + SDDEVICE_GET_MAX_CLOCK().
128495 +
128496 + @see also: SDDEVICE_GET_OPER_CLOCK
128497 +
128498 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128499 +#define SDDEVICE_GET_MAX_CLOCK(pDev) (pDev)->pHcd->MaxClockRate
128500 +
128501 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128502 + @function: Get operational maximum block length.
128503 +
128504 + @function name: SDDEVICE_GET_OPER_BLOCK_LEN
128505 + @prototype: UINT16 SDDEVICE_GET_OPER_BLOCK_LEN(PSDDEVICE pDevice)
128506 + @category: PD_Reference
128507 +
128508 + @input: pDevice - the target device for this request
128509 +
128510 + @output: none
128511 +
128512 + @return: block size in bytes
128513 +
128514 + @notes: Implemented as a macro. Returns the maximum current block length.
128515 + This may be lower than reported by the card due to Host Controller,
128516 + Bus driver, or power management limitations.
128517 +
128518 + @see also: SDDEVICE_GET_MAX_BLOCK_LEN
128519 +
128520 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128521 +#define SDDEVICE_GET_OPER_BLOCK_LEN(pDev) (pDev)->pHcd->CardProperties.OperBlockLenLimit
128522 +
128523 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128524 + @function: Get maximum block length.
128525 +
128526 + @function name: SDDEVICE_GET_MAX_BLOCK_LEN
128527 + @prototype: UINT16 SDDEVICE_GET_MAX_BLOCK_LEN(PSDDEVICE pDevice)
128528 + @category: PD_Reference
128529 +
128530 + @input: pDevice - the target device for this request
128531 +
128532 + @output: none
128533 +
128534 + @return: block size in bytes
128535 +
128536 + @notes: Implemented as a macro. Use SDDEVICE_GET_OPER_BLOCK_LEN to obtain
128537 + the current block length.
128538 +
128539 + @see also: SDDEVICE_GET_OPER_BLOCK_LEN
128540 +
128541 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128542 +#define SDDEVICE_GET_MAX_BLOCK_LEN(pDev) (pDev)->pHcd->MaxBytesPerBlock
128543 +
128544 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128545 + @function: Get operational maximum block count.
128546 +
128547 + @function name: SDDEVICE_GET_OPER_BLOCKS
128548 + @prototype: UINT16 SDDEVICE_GET_OPER_BLOCKS(PSDDEVICE pDevice)
128549 + @category: PD_Reference
128550 +
128551 + @input: pDevice - the target device for this request
128552 +
128553 + @output: none
128554 +
128555 + @return: maximum number of blocks per transaction.
128556 +
128557 + @notes: Implemented as a macro. Returns the maximum current block count.
128558 + This may be lower than reported by the card due to Host Controller,
128559 + Bus driver, or power management limitations.
128560 +
128561 + @see also: SDDEVICE_GET_MAX_BLOCK_LEN
128562 +
128563 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128564 +#define SDDEVICE_GET_OPER_BLOCKS(pDev) (pDev)->pHcd->CardProperties.OperBlockCountLimit
128565 +
128566 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128567 + @function: Get maximum block count.
128568 +
128569 + @function name: SDDEVICE_GET_MAX_BLOCKS
128570 + @prototype: UINT16 SDDEVICE_GET_MAX_BLOCKS(PSDDEVICE pDevice)
128571 + @category: PD_Reference
128572 +
128573 + @input: pDevice - the target device for this request
128574 +
128575 + @output: none
128576 +
128577 + @return: maximum number of blocks per transaction.
128578 +
128579 + @notes: Implemented as a macro. Use SDDEVICE_GET_OPER_BLOCKS to obtain
128580 + the current block count.
128581 +
128582 + @see also: SDDEVICE_GET_OPER_BLOCKS
128583 +
128584 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128585 +#define SDDEVICE_GET_MAX_BLOCKS(pDev) (pDev)->pHcd->MaxBlocksPerTrans
128586 +
128587 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128588 + @function: Get applied slot voltage
128589 +
128590 + @function name: SDDEVICE_GET_SLOT_VOLTAGE_MASK
128591 + @prototype: SLOT_VOLTAGE_MASK SDDEVICE_GET_SLOT_VOLTAGE_MASK(PSDDEVICE pDevice)
128592 + @category: PD_Reference
128593 +
128594 + @input: pDevice - the target device for this request
128595 +
128596 + @output: none
128597 +
128598 + @return: slot voltage mask
128599 +
128600 + @notes: This function returns the applied voltage on the slot. The voltage value is a
128601 + mask having the following values:
128602 + SLOT_POWER_3_3V
128603 + SLOT_POWER_3_0V
128604 + SLOT_POWER_2_8V
128605 + SLOT_POWER_2_0V
128606 + SLOT_POWER_1_8V
128607 + SLOT_POWER_1_6V
128608 +
128609 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128610 +#define SDDEVICE_GET_SLOT_VOLTAGE_MASK(pDev) (pDev)->pHcd->CardProperties.CardVoltage
128611 +
128612 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128613 + @function: Get the Card Specific Data Register.
128614 +
128615 + @function name: SDDEVICE_GET_CARDCSD
128616 + @prototype: PUINT8 SDDEVICE_GET_CARDCSD(PSDDEVICE pDevice)
128617 + @category: PD_Reference
128618 +
128619 + @input: pDevice - the target device for this request
128620 +
128621 + @output: none
128622 +
128623 + @return: UINT8 CardCSD[MAX_CARD_RESPONSE_BYTES] array of CSD data.
128624 +
128625 + @notes: Implemented as a macro.
128626 +
128627 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128628 +#define SDDEVICE_GET_CARDCSD(pDev) (pDev)->pHcd->CardProperties.CardCSD
128629 +
128630 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128631 + @function: Get the bus mode flags
128632 +
128633 + @function name: SDDEVICE_GET_BUSMODE_FLAGS
128634 + @prototype: SD_BUSMODE_FLAGS SDDEVICE_GET_BUSMODE_FLAGS(PSDDEVICE pDevice)
128635 + @category: PD_Reference
128636 +
128637 + @input: pDevice - the target device for this request
128638 +
128639 + @output: none
128640 +
128641 + @return:
128642 +
128643 + @notes: Implemented as a macro. This function returns the raw bus mode flags. This
128644 + is useful for function drivers that wish to override the bus clock without
128645 + modifying the current bus mode.
128646 +
128647 + @see also: SDDEVICE_GET_BUSWIDTH
128648 + @see also: SDCONFIG_BUS_MODE_CTRL
128649 +
128650 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128651 +#define SDDEVICE_GET_BUSMODE_FLAGS(pDev) (pDev)->pHcd->CardProperties.BusMode
128652 +
128653 +
128654 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128655 + @function: Get the bus width.
128656 +
128657 + @function name: SDDEVICE_GET_BUSWIDTH
128658 + @prototype: UINT8 SDDEVICE_GET_BUSWIDTH(PSDDEVICE pDevice)
128659 + @category: PD_Reference
128660 +
128661 + @input: pDevice - the target device for this request
128662 +
128663 + @output: none
128664 +
128665 + @return: bus width: SDCONFIG_BUS_WIDTH_SPI, SDCONFIG_BUS_WIDTH_1_BIT, SDCONFIG_BUS_WIDTH_4_BIT
128666 +
128667 + @notes: Implemented as a macro.
128668 +
128669 + @see also: SDDEVICE_IS_BUSMODE_SPI
128670 +
128671 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128672 +#define SDDEVICE_GET_BUSWIDTH(pDev) SDCONFIG_GET_BUSWIDTH((pDev)->pHcd->CardProperties.BusMode)
128673 +
128674 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128675 + @function: Is bus in SPI mode.
128676 +
128677 + @function name: SDDEVICE_IS_BUSMODE_SPI
128678 + @prototype: BOOL SDDEVICE_IS_BUSMODE_SPI(PSDDEVICE pDevice)
128679 + @category: PD_Reference
128680 +
128681 + @input: pDevice - the target device for this request
128682 +
128683 + @output: none
128684 +
128685 + @return: TRUE, SPI mode.
128686 +
128687 + @notes: Implemented as a macro.
128688 +
128689 + @see also: SDDEVICE_GET_BUSWIDTH
128690 +
128691 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128692 +#define SDDEVICE_IS_BUSMODE_SPI(pDev) (SDDEVICE_GET_BUSWIDTH(pDev) == SDCONFIG_BUS_WIDTH_SPI)
128693 +
128694 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128695 + @function: Send a request to a device.
128696 +
128697 + @function name: SDDEVICE_CALL_REQUEST_FUNC
128698 + @prototype: SDIO_STATUS SDDEVICE_CALL_REQUEST_FUNC(PSDDEVICE pDevice, PSDREQUEST pRequest)
128699 + @category: PD_Reference
128700 +
128701 + @input: pDevice - the target device for this request
128702 + @input: pRequest - the request to be sent
128703 +
128704 + @output: none
128705 +
128706 + @return: SDIO_STATUS
128707 +
128708 + @notes: Sends a request to the specified device. If the request is successfully sent, then
128709 + the response flags can be checked to detemine the result of the request.
128710 +
128711 + @example: Example of sending a request to a device:
128712 + PSDREQUEST pReq = NULL;
128713 + //allocate a request
128714 + pReq = SDDeviceAllocRequest(pDevice);
128715 + if (NULL == pReq) {
128716 + return SDIO_STATUS_NO_RESOURCES;
128717 + }
128718 + //initialize the request
128719 + SDLIB_SetupCMD52Request(FuncNo, Address, Write, *pData, pReq);
128720 + //send the request to the target
128721 + status = SDDEVICE_CALL_REQUEST_FUNC(pDevice,pReq);
128722 + if (!SDIO_SUCCESS(status)) {
128723 + break;
128724 + }
128725 + //check the request response (based on the request type)
128726 + if (SD_R5_GET_RESP_FLAGS(pReq->Response) & SD_R5_ERRORS) {
128727 + ...
128728 + }
128729 + if (!Write) {
128730 + // store the byte
128731 + *pData = SD_R5_GET_READ_DATA(pReq->Response);
128732 + }
128733 + //free the request
128734 + SDDeviceFreeRequest(pDevice,pReq);
128735 + ...
128736 +
128737 + @see also: SDDeviceAllocRequest
128738 + @see also: SDDEVICE_CALL_CONFIG_FUNC
128739 +
128740 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128741 +#define SDDEVICE_CALL_REQUEST_FUNC(pDev,pReq) (pDev)->pRequest((pDev),(pReq))
128742 +
128743 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128744 + @function: Send configuration to a device.
128745 +
128746 + @function name: SDDEVICE_CALL_CONFIG_FUNC
128747 + @prototype: SDIO_STATUS SDDEVICE_CALL_CONFIG_FUNC(PSDDEVICE pDevice, PSDCONFIG pConfigure)
128748 + @category: PD_Reference
128749 +
128750 + @input: pDevice - the target device for this request
128751 + @input: pConfigure - configuration request
128752 +
128753 + @output: none
128754 +
128755 + @return: SDIO_STATUS
128756 +
128757 + @notes: Sends a configuration request to the specified device.
128758 +
128759 + @example: Example of sending a request to a device:
128760 + SDCONFIG configHdr;
128761 + SDCONFIG_FUNC_ENABLE_DISABLE_DATA fData;
128762 + fData.EnableFlags = SDCONFIG_ENABLE_FUNC;
128763 + fData.TimeOut = 500;
128764 + SET_SDCONFIG_CMD_INFO(&configHdr, SDCONFIG_FUNC_ENABLE_DISABLE, fData, sizeof(fData));
128765 + return SDDEVICE_CALL_CONFIG_FUNC(pDevice, &configHdr);
128766 +
128767 + @see also: SDLIB_IssueConfig
128768 +
128769 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128770 +#define SDDEVICE_CALL_CONFIG_FUNC(pDev,pCfg) (pDev)->pConfigure((pDev),(pCfg))
128771 +
128772 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128773 + @function: Allocate a request structure.
128774 +
128775 + @function name: SDDeviceAllocRequest
128776 + @prototype: PSDREQUEST SDDeviceAllocRequest(PSDDEVICE pDevice)
128777 + @category: PD_Reference
128778 +
128779 + @input: pDevice - the target device for this request
128780 +
128781 + @output: none
128782 +
128783 + @return: request pointer or NULL if not available.
128784 +
128785 + @notes: This function must not be called in a non-schedulable (interrupts off) context.
128786 + Allocating memory on some OSes may block.
128787 +
128788 + @see also: SDDEVICE_CALL_REQUEST_FUNC
128789 + @see also: SDDeviceFreeRequest
128790 +
128791 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128792 +#define SDDeviceAllocRequest(pDev) (pDev)->AllocRequest((pDev))
128793 +
128794 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128795 + @function: Free a request structure.
128796 +
128797 + @function name: SDDeviceFreeRequest
128798 + @prototype: void SDDeviceFreeRequest(PSDDEVICE pDevice, PSDREQUEST pRequest)
128799 + @category: PD_Reference
128800 +
128801 + @input: pDevice - the target device for this request
128802 + @input: pRequest - request allocated by SDDeviceAllocRequest().
128803 +
128804 + @output: none
128805 +
128806 + @return: none
128807 +
128808 + @notes: This function must not be called in a non-schedulable (interrupts off) context.
128809 + Freeing memory on some OSes may block.
128810 +
128811 + @see also: SDDEVICE_CALL_REQUEST_FUNC
128812 + @see also: SDDeviceAllocRequest
128813 +
128814 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128815 +#define SDDeviceFreeRequest(pDev,pReq) (pDev)->FreeRequest((pDev),pReq)
128816 +
128817 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128818 + @function: Register an interrupt handler for a device.
128819 +
128820 + @function name: SDDEVICE_SET_IRQ_HANDLER
128821 + @prototype: void SDDEVICE_SET_IRQ_HANDLER(PSDDEVICE pDevice,
128822 + void (*pIrqFunction)(PVOID pContext),
128823 + PVOID pContext)
128824 + @category: PD_Reference
128825 +
128826 + @input: pDevice - the target device for this request
128827 + @input: pIrqFunction - the interrupt function to execute.
128828 + @input: pContext - context value passed into interrupt routine.
128829 +
128830 + @output: none
128831 +
128832 + @return: none
128833 +
128834 + @notes: The registered routine will be called upon each card interrupt.
128835 + The interrupt function should acknowledge the interrupt when it is
128836 + ready to handle more interrupts using:
128837 + SDLIB_IssueConfig(pDevice, SDCONFIG_FUNC_ACK_IRQ, NULL, 0);
128838 + The interrupt handler can perform synchronous request calls.
128839 +
128840 + @see also: SDDEVICE_SET_ASYNC_IRQ_HANDLER
128841 +
128842 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128843 +#define SDDEVICE_SET_IRQ_HANDLER(pDev,pFn,pContext) \
128844 +{ \
128845 + (pDev)->pIrqFunction = (pFn); \
128846 + (pDev)->IrqContext = (PVOID)(pContext); \
128847 +}
128848 +
128849 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128850 + @function: Register an asynchronous interrupt handler for a device.
128851 +
128852 + @function name: SDDEVICE_SET_ASYNC_IRQ_HANDLER
128853 + @prototype: void SDDEVICE_SET_ASYNC_IRQ_HANDLER(PSDDEVICE pDevice,
128854 + void (*pIrqAsyncFunction)(PVOID pContext),
128855 + PVOID pContext)
128856 + @category: PD_Reference
128857 +
128858 + @input: pDevice - the target device for this request
128859 + @input: pIrqAsyncFunction - the interrupt function to execute.
128860 + @input: pContext - context value passed into interrupt routine.
128861 +
128862 + @output: none
128863 +
128864 + @return: none
128865 +
128866 + @notes: The registered routine will be called upon each card interrupt.
128867 + The interrupt function should acknowledge the interrupt when it is
128868 + ready to handle more interrupts using:
128869 + SDLIB_IssueConfig(pDevice, SDCONFIG_FUNC_ACK_IRQ, NULL, 0);
128870 + The interrupt handler can not perform any synchronous request calls.
128871 + Using this call provides a faster interrupt dispatch, but limits all
128872 + requests to asynchronous mode.
128873 +
128874 + @see also: SDDEVICE_SET_IRQ_HANDLER
128875 +
128876 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128877 +#define SDDEVICE_SET_ASYNC_IRQ_HANDLER(pDev,pFn,pContext) \
128878 +{ \
128879 + (pDev)->pIrqAsyncFunction = (pFn); \
128880 + (pDev)->IrqAsyncContext = (PVOID)(pContext); \
128881 +}
128882 +
128883 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128884 + @function: Get the SDIO capabilities rgeister.
128885 +
128886 + @function name: SDDEVICE_GET_SDIOCARD_CAPS
128887 + @prototype: UINT8 SDDEVICE_GET_SDIOCARD_CAPS(PSDDEVICE pDevice)
128888 + @category: PD_Reference
128889 +
128890 + @input: pDevice - the target device for this request
128891 +
128892 + @output: none
128893 +
128894 + @return: SD capabilities
128895 +
128896 + @notes: See SD specification for decoding of these capabilities.
128897 +
128898 + @see also: SDDEVICE_GET_SDIO_CARD_CAPS
128899 +
128900 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128901 +#define SDDEVICE_GET_SDIOCARD_CAPS(pDev) (pDev)->pHcd->CardProperties.SDIOCaps
128902 +
128903 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128904 + @function: Get HCD driver name
128905 +
128906 + @function name: SDDEVICE_GET_HCDNAME
128907 + @prototype: PTEXT SDDEVICE_GET_HCDNAME(PSDDEVICE pDevice)
128908 + @category: PD_Reference
128909 +
128910 + @input: pDevice - the target device for this request
128911 +
128912 + @output: none
128913 +
128914 + @return: pointer to a string containing the name of the underlying HCD
128915 +
128916 + @notes: Implemented as a macro.
128917 +
128918 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128919 +#define SDDEVICE_GET_HCDNAME(pDev) (pDev)->pHcd->pName
128920 +
128921 +
128922 +#define SDDEVICE_CALL_IRQ_HANDLER(pDev) (pDev)->pIrqFunction((pDev)->IrqContext)
128923 +#define SDDEVICE_CALL_IRQ_ASYNC_HANDLER(pDev) (pDev)->pIrqAsyncFunction((pDev)->IrqAsyncContext)
128924 +
128925 +
128926 +#define SDDEVICE_SET_SDIO_FUNCNO(pDev,Num) (pDev)->pId[0].SDIO_FunctionNo = (Num)
128927 +#define SDDEVICE_IS_CARD_REMOVED(pDev) ((pDev)->pHcd->CardProperties.CardState & \
128928 + CARD_STATE_REMOVED)
128929 +
128930 +
128931 +typedef enum _SDHCD_IRQ_PROC_STATE {
128932 + SDHCD_IDLE = 0,
128933 + SDHCD_IRQ_PENDING = 1,
128934 + SDHCD_IRQ_HELPER = 2
128935 +}SDHCD_IRQ_PROC_STATE, *PSDHCD_IRQ_PROC_STATE;
128936 +
128937 +/* host controller bus driver registration structure */
128938 +typedef struct _SDHCD {
128939 + CT_VERSION_CODE Version; /* version code of the SDIO stack */
128940 + SDLIST SDList; /* internal use list*/
128941 + PTEXT pName; /* name of registering host/slot driver */
128942 + UINT32 Attributes; /* attributes of host controller */
128943 + UINT16 MaxBytesPerBlock; /* max bytes per block */
128944 + UINT16 MaxBlocksPerTrans; /* max blocks per transaction */
128945 + SD_SLOT_CURRENT MaxSlotCurrent; /* max current per slot in milli-amps */
128946 + UINT8 SlotNumber; /* sequential slot number for this HCD, set by bus driver */
128947 + SD_BUSCLOCK_RATE MaxClockRate; /* max clock rate in hz */
128948 + SLOT_VOLTAGE_MASK SlotVoltageCaps; /* slot voltage capabilities */
128949 + SLOT_VOLTAGE_MASK SlotVoltagePreferred; /* preferred slot voltage */
128950 + PVOID pContext; /* host controller driver use data */
128951 + SDIO_STATUS (*pRequest)(struct _SDHCD *pHcd);
128952 + /* get/set configuration */
128953 + SDIO_STATUS (*pConfigure)(struct _SDHCD *pHcd, PSDCONFIG pConfig);
128954 + /* everything below this line is for bus driver use */
128955 + OS_SEMAPHORE ConfigureOpsSem; /* semaphore to make specific configure ops atomic, internal use */
128956 + OS_CRITICALSECTION HcdCritSection; /* critical section to protect hcd data structures (internal use) */
128957 + SDREQUESTQUEUE RequestQueue; /* request queue, internal use */
128958 + PSDREQUEST pCurrentRequest; /* current request we are working on */
128959 + CARD_PROPERTIES CardProperties; /* properties for the currently inserted card*/
128960 + OSKERNEL_HELPER SDIOIrqHelper; /* synch IRQ helper, internal use */
128961 + SDDEVICE *pPseudoDev; /* pseudo device used for initialization (internal use) */
128962 + UINT8 PendingHelperIrqs; /* IRQ helper pending IRQs */
128963 + UINT8 PendingIrqAcks; /* pending IRQ acks from function drivers */
128964 + UINT8 IrqsEnabled; /* current irq enabled mask */
128965 + SDHCD_IRQ_PROC_STATE IrqProcState; /* irq processing state */
128966 + POS_DEVICE pDevice; /* device registration with base system */
128967 + SD_SLOT_CURRENT SlotCurrentAllocated; /* slot current allocated (internal use ) */
128968 + ATOMIC_FLAGS HcdFlags; /* HCD Flags */
128969 +#define HCD_REQUEST_CALL_BIT 0
128970 +#define HCD_IRQ_NO_PEND_CHECK 1 /* HCD flag to bypass interrupt pending register
128971 + check, typically done on single function cards */
128972 + SDREQUESTQUEUE CompletedRequestQueue; /* completed request queue, internal use */
128973 + PSDDMA_DESCRIPTION pDmaDescription; /* description of HCD's DMA capabilities */
128974 + POS_MODULE pModule; /* OS-specific module information */
128975 + INT Recursion; /* recursion level */
128976 + PVOID Reserved1;
128977 + PVOID Reserved2;
128978 +}SDHCD, *PSDHCD;
128979 +
128980 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
128981 + @function: Get a pointer to the HCD's DMA description
128982 +
128983 + @function name: SDGET_DMA_DESCRIPTION
128984 + @prototype: PSDDMA_DESCRIPTION SDGET_DMA_DESCRIPTION(PSDDEVICE pDevice)
128985 + @category: PD_Reference
128986 +
128987 + @input: pDevice - device structure
128988 +
128989 + @return: PSDDMA_DESCRIPTION or NULL if no DMA support
128990 +
128991 + @notes: Implemented as a macro.
128992 +
128993 + @example: getting the current request:
128994 + PSDDMA_DESCRIPTION pDmaDescrp = SDGET_DMA_DESCRIPTION(pDevice);
128995 +
128996 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
128997 +#define SDGET_DMA_DESCRIPTION(pDevice) (pDevice)->pHcd->pDmaDescription
128998 +
128999 +
129000 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129001 + @function: Get the logical slot number the device is assigned to.
129002 +
129003 + @function name: SDDEVICE_GET_SLOT_NUMBER
129004 + @prototype: UINT8 SDDEVICE_GET_SLOT_NUMBER(PSDDEVICE pDevice)
129005 + @category: PD_Reference
129006 +
129007 + @input: pDevice - device structure
129008 +
129009 + @return: unsigned number representing the slot number
129010 +
129011 + @notes: Implemented as a macro. This value is unique for each physical slot in the system
129012 + and assigned by the bus driver. Devices on a multi-function card will share the same
129013 + slot number.
129014 +
129015 + @example: getting the slot number:
129016 + UINT8 thisSlot = SDDEVICE_GET_SLOT_NUMBER(pDevice);
129017 +
129018 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
129019 +#define SDDEVICE_GET_SLOT_NUMBER(pDevice) (pDevice)->pHcd->SlotNumber
129020 +
129021 +/* for function use */
129022 +SDIO_STATUS SDIO_RegisterFunction(PSDFUNCTION pFunction);
129023 +SDIO_STATUS SDIO_UnregisterFunction(PSDFUNCTION pFunction);
129024 +
129025 +#include "sdio_hcd_defs.h"
129026 +#endif /* __SDIO_BUSDRIVER_H___ */
129027 Index: linux-2.6.24.7/include/linux/sdio/_sdio_defs.h
129028 ===================================================================
129029 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
129030 +++ linux-2.6.24.7/include/linux/sdio/_sdio_defs.h 2008-12-11 22:46:49.000000000 +0100
129031 @@ -0,0 +1,638 @@
129032 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129033 +@file: _sdio_defs.h
129034 +
129035 +@abstract: SD/SDIO definitions
129036 +
129037 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
129038 +
129039 +
129040 + *
129041 + * This program is free software; you can redistribute it and/or modify
129042 + * it under the terms of the GNU General Public License version 2 as
129043 + * published by the Free Software Foundation;
129044 + *
129045 + * Software distributed under the License is distributed on an "AS
129046 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
129047 + * implied. See the License for the specific language governing
129048 + * rights and limitations under the License.
129049 + *
129050 + * Portions of this code were developed with information supplied from the
129051 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
129052 + *
129053 + * The following conditions apply to the release of the SD simplified specification (�Simplified
129054 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
129055 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
129056 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
129057 + * Specification may require a license from the SD Card Association or other third parties.
129058 + * Disclaimers:
129059 + * The information contained in the Simplified Specification is presented only as a standard
129060 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
129061 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
129062 + * any damages, any infringements of patents or other right of the SD Card Association or any third
129063 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
129064 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
129065 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
129066 + * information, know-how or other confidential information to any third party.
129067 + *
129068 + *
129069 + * The initial developers of the original code are Seung Yi and Paul Lever
129070 + *
129071 + * sdio@atheros.com
129072 + *
129073 + *
129074 +
129075 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
129076 +#ifndef ___SDIO_DEFS_H___
129077 +#define ___SDIO_DEFS_H___
129078 +
129079 +#define SD_INIT_BUS_CLOCK 100000 /* initialization clock in hz */
129080 +#define SPI_INIT_BUS_CLOCK 100000 /* initialization clock in hz */
129081 +#define SD_MAX_BUS_CLOCK 25000000 /* max clock speed in hz */
129082 +#define SD_HS_MAX_BUS_CLOCK 50000000 /* SD high speed max clock speed in hz */
129083 +#define SDIO_LOW_SPEED_MAX_BUS_CLOCK 400000 /* max low speed clock in hz */
129084 +#define SDMMC_MIN_INIT_CLOCKS 80 /* minimun number of initialization clocks */
129085 +#define SDIO_EMPC_CURRENT_THRESHOLD 300 /* SDIO 1.10 , EMPC (mA) threshold, we add some overhead */
129086 +
129087 +/* commands */
129088 +#define CMD0 0
129089 +#define CMD1 1
129090 +#define CMD2 2
129091 +#define CMD3 3
129092 +#define CMD4 4
129093 +#define CMD5 5
129094 +#define CMD6 6
129095 +#define CMD7 7
129096 +#define CMD9 9
129097 +#define CMD10 10
129098 +#define CMD12 12
129099 +#define CMD13 13
129100 +#define CMD15 15
129101 +#define CMD16 16
129102 +#define CMD17 17
129103 +#define CMD18 18
129104 +#define CMD24 24
129105 +#define CMD25 25
129106 +#define CMD27 27
129107 +#define CMD28 28
129108 +#define CMD29 29
129109 +#define CMD30 30
129110 +#define CMD32 32
129111 +#define CMD33 33
129112 +#define CMD38 38
129113 +#define CMD42 42
129114 +#define CMD52 52
129115 +#define CMD53 53
129116 +#define CMD55 55
129117 +#define CMD56 56
129118 +#define CMD58 58
129119 +#define CMD59 59
129120 +#define ACMD6 6
129121 +#define ACMD13 13
129122 +#define ACMD22 22
129123 +#define ACMD23 23
129124 +#define ACMD41 41
129125 +#define ACMD42 42
129126 +#define ACMD51 51
129127 +
129128 +#define SD_ACMD6_BUS_WIDTH_1_BIT 0x00
129129 +#define SD_ACMD6_BUS_WIDTH_4_BIT 0x02
129130 +
129131 +#define SD_CMD59_CRC_OFF 0x00000000
129132 +#define SD_CMD59_CRC_ON 0x00000001
129133 +
129134 +/* SD/SPI max response size */
129135 +#define SD_MAX_CMD_RESPONSE_BYTES SD_R2_RESPONSE_BYTES
129136 +
129137 +#define SD_R1_RESPONSE_BYTES 6
129138 +#define SD_R1B_RESPONSE_BYTES SD_R1_RESPONSE_BYTES
129139 +#define SD_R1_GET_CMD(pR) ((pR)[5] & 0xC0))
129140 +#define SD_R1_SET_CMD(pR,cmd) (pR)[5] = (cmd) & 0xC0
129141 +#define SD_R1_GET_CARD_STATUS(pR) (((UINT32)((pR)[1])) | \
129142 + (((UINT32)((pR)[2])) << 8) | \
129143 + (((UINT32)((pR)[3])) << 16) | \
129144 + (((UINT32)((pR)[4])) << 24) )
129145 +#define SD_R1_SET_CMD_STATUS(pR,status) \
129146 +{ \
129147 + (pR)[1] = (UINT8)(status); \
129148 + (pR)[2] = (UINT8)((status) >> 8); \
129149 + (pR)[3] = (UINT8)((status) >> 16); \
129150 + (pR)[4] = (UINT8)((status) >> 24); \
129151 +}
129152 +
129153 +/* SD R1 card status bit masks */
129154 +#define SD_CS_CMD_OUT_OF_RANGE ((UINT32)(1 << 31))
129155 +#define SD_CS_ADDRESS_ERR (1 << 30)
129156 +#define SD_CS_BLK_LEN_ERR (1 << 29)
129157 +#define SD_CS_ERASE_SEQ_ERR (1 << 28)
129158 +#define SD_CS_ERASE_PARAM_ERR (1 << 27)
129159 +#define SD_CS_WP_ERR (1 << 26)
129160 +#define SD_CS_CARD_LOCKED (1 << 25)
129161 +#define SD_CS_LK_UNLK_FAILED (1 << 24)
129162 +#define SD_CS_PREV_CMD_CRC_ERR (1 << 23)
129163 +#define SD_CS_ILLEGAL_CMD_ERR (1 << 22)
129164 +#define SD_CS_ECC_FAILED (1 << 21)
129165 +#define SD_CS_CARD_INTERNAL_ERR (1 << 20)
129166 +#define SD_CS_GENERAL_ERR (1 << 19)
129167 +#define SD_CS_CSD_OVERWR_ERR (1 << 16)
129168 +#define SD_CS_WP_ERASE_SKIP (1 << 15)
129169 +#define SD_CS_ECC_DISABLED (1 << 14)
129170 +#define SD_CS_ERASE_RESET (1 << 13)
129171 +#define SD_CS_GET_STATE(status) (((status) >> 9) & 0x0f)
129172 +#define SD_CS_SET_STATE(status, state) \
129173 +{ \
129174 + (status) &= ~(0x0F << 9); \
129175 + (status) |= (state) << 9 \
129176 +}
129177 +
129178 +#define SD_CS_TRANSFER_ERRORS \
129179 + ( SD_CS_ADDRESS_ERR | \
129180 + SD_CS_BLK_LEN_ERR | \
129181 + SD_CS_ERASE_SEQ_ERR | \
129182 + SD_CS_ERASE_PARAM_ERR | \
129183 + SD_CS_WP_ERR | \
129184 + SD_CS_ECC_FAILED | \
129185 + SD_CS_CARD_INTERNAL_ERR | \
129186 + SD_CS_GENERAL_ERR )
129187 +
129188 +#define SD_CS_STATE_IDLE 0
129189 +#define SD_CS_STATE_READY 1
129190 +#define SD_CS_STATE_IDENT 2
129191 +#define SD_CS_STATE_STBY 3
129192 +#define SD_CS_STATE_TRANS 4
129193 +#define SD_CS_STATE_DATA 5
129194 +#define SD_CS_STATE_RCV 6
129195 +#define SD_CS_STATE_PRG 7
129196 +#define SD_CS_STATE_DIS 8
129197 +#define SD_CS_READY_FOR_DATA (1 << 8)
129198 +#define SD_CS_APP_CMD (1 << 5)
129199 +#define SD_CS_AKE_SEQ_ERR (1 << 3)
129200 +
129201 +/* SD R2 response */
129202 +#define SD_R2_RESPONSE_BYTES 17
129203 +#define MAX_CSD_CID_BYTES 16
129204 +#define SD_R2_SET_STUFF_BITS(pR) (pR)[16] = 0x3F
129205 +#define GET_SD_CSD_TRANS_SPEED(pR) (pR)[12]
129206 +#define GET_SD_CID_MANFID(pR) (pR)[15]
129207 +#define GET_SD_CID_PN_1(pR) (pR)[12]
129208 +#define GET_SD_CID_PN_2(pR) (pR)[11]
129209 +#define GET_SD_CID_PN_3(pR) (pR)[10]
129210 +#define GET_SD_CID_PN_4(pR) (pR)[9]
129211 +#define GET_SD_CID_PN_5(pR) (pR)[8]
129212 +#define GET_SD_CID_PN_6(pR) (pR)[7]
129213 +
129214 +#define GET_SD_CID_OEMID(pR) ((((UINT16)(pR)[14]) << 8 )| (UINT16)((pR)[13]))
129215 +#define SDMMC_OCR_VOLTAGE_MASK 0x7FFFFFFF
129216 +/* SD R3 response */
129217 +#define SD_R3_RESPONSE_BYTES 6
129218 +#define SD_R3_GET_OCR(pR) ((((UINT32)((pR)[1])) | \
129219 + (((UINT32)((pR)[2])) << 8) | \
129220 + (((UINT32)((pR)[3])) << 16) | \
129221 + (((UINT32)((pR)[4])) << 24)) & SDMMC_OCR_VOLTAGE_MASK)
129222 +#define SD_R3_IS_CARD_READY(pR) (((pR)[4] & 0x80) == 0x80)
129223 +
129224 +/* OCR bit definitions */
129225 +#define SD_OCR_CARD_PWR_UP_STATUS ((UINT32)(1 << 31))
129226 +#define SD_OCR_3_5_TO_3_6_VDD (1 << 23)
129227 +#define SD_OCR_3_4_TO_3_5_VDD (1 << 22)
129228 +#define SD_OCR_3_3_TO_3_4_VDD (1 << 21)
129229 +#define SD_OCR_3_2_TO_3_3_VDD (1 << 20)
129230 +#define SD_OCR_3_1_TO_3_2_VDD (1 << 19)
129231 +#define SD_OCR_3_0_TO_3_1_VDD (1 << 18)
129232 +#define SD_OCR_2_9_TO_3_0_VDD (1 << 17)
129233 +#define SD_OCR_2_8_TO_2_9_VDD (1 << 16)
129234 +#define SD_OCR_2_7_TO_2_8_VDD (1 << 15)
129235 +#define SD_OCR_2_6_TO_2_7_VDD (1 << 14)
129236 +#define SD_OCR_2_5_TO_2_6_VDD (1 << 13)
129237 +#define SD_OCR_2_4_TO_2_5_VDD (1 << 12)
129238 +#define SD_OCR_2_3_TO_2_4_VDD (1 << 11)
129239 +#define SD_OCR_2_2_TO_2_3_VDD (1 << 10)
129240 +#define SD_OCR_2_1_TO_2_2_VDD (1 << 9)
129241 +#define SD_OCR_2_0_TO_2_1_VDD (1 << 8)
129242 +#define SD_OCR_1_9_TO_2_0_VDD (1 << 7)
129243 +#define SD_OCR_1_8_TO_1_9_VDD (1 << 6)
129244 +#define SD_OCR_1_7_TO_1_8_VDD (1 << 5)
129245 +#define SD_OCR_1_6_TO_1_7_VDD (1 << 4)
129246 +
129247 +/* SD Status data block */
129248 +#define SD_STATUS_DATA_BYTES 64
129249 +#define SDS_GET_DATA_WIDTH(buffer) ((buffer)[0] & 0xC0)
129250 +#define SDS_BUS_1_BIT 0x00
129251 +#define SDS_BUS_4_BIT 0x80
129252 +#define SDS_GET_SECURE_MODE(buffer) ((buffer)[0] & 0x20)
129253 +#define SDS_CARD_SECURE_MODE 0x20
129254 +#define SDS_GET_CARD_TYPE(buffer) ((buffer)[60] & 0x0F)
129255 +#define SDS_SD_CARD_RW 0x00
129256 +#define SDS_SD_CARD_ROM 0x01
129257 +
129258 +/* SD R6 response */
129259 +#define SD_R6_RESPONSE_BYTES 6
129260 +#define SD_R6_GET_RCA(pR) ((UINT16)((pR)[3]) | (((UINT16)((pR)[4])) << 8))
129261 +#define SD_R6_GET_CS(pR) ((UINT16)((pR)[1]) | (((UINT16)((pR)[2])) << 8))
129262 +
129263 +/* SD Configuration Register (SCR) */
129264 +#define SD_SCR_BYTES 8
129265 +#define SCR_REV_1_0 0x00
129266 +#define SCR_SD_SPEC_1_00 0x00
129267 +#define SCR_SD_SPEC_1_10 0x01
129268 +#define SCR_BUS_SUPPORTS_1_BIT 0x01
129269 +#define SCR_BUS_SUPPORTS_4_BIT 0x04
129270 +#define SCR_SD_SECURITY_MASK 0x70
129271 +#define SCR_SD_NO_SECURITY 0x00
129272 +#define SCR_SD_SECURITY_1_0 0x10
129273 +#define SCR_SD_SECURITY_2_0 0x20
129274 +#define SCR_DATA_STATUS_1_AFTER_ERASE 0x80
129275 +
129276 +#define GET_SD_SCR_STRUCT_VER(pB) ((pB)[7] >> 4)
129277 +#define GET_SD_SCR_SDSPEC_VER(pB) ((pB)[7] & 0x0F)
129278 +#define GET_SD_SCR_BUSWIDTHS(pB) ((pB)[6] & 0x0F)
129279 +#define GET_SD_SCR_BUSWIDTHS_FLAGS(pB) (pB)[6]
129280 +#define GET_SD_SCR_SECURITY(pB) (((pB)[6] >> 4) & 0x07)
129281 +#define GET_SD_SCR_DATA_STAT_AFTER_ERASE(pB) (((pB)[6] >> 7) & 0x01)
129282 +
129283 +/* SDIO R4 Response */
129284 +#define SD_SDIO_R4_RESPONSE_BYTES 6
129285 +#define SD_SDIO_R4_GET_OCR(pR) ((UINT32)((pR)[1]) | \
129286 + (((UINT32)(pR)[2]) << 8) | \
129287 + (((UINT32)(pR)[3]) << 16))
129288 +#define SD_SDIO_R4_IS_MEMORY_PRESENT(pR) (((pR)[4] & 0x08) == 0x08)
129289 +#define SD_SDIO_R4_GET_IO_FUNC_COUNT(pR) (((pR)[4] >> 4) & 0x07)
129290 +#define SD_SDIO_R4_IS_CARD_READY(pR) (((pR)[4] & 0x80) == 0x80)
129291 +
129292 +/* SDIO R5 response */
129293 +#define SD_SDIO_R5_RESPONSE_BYTES 6
129294 +#define SD_SDIO_R5_READ_DATA_OFFSET 1
129295 +#define SD_R5_GET_READ_DATA(pR) (pR)[SD_SDIO_R5_READ_DATA_OFFSET]
129296 +#define SD_R5_RESP_FLAGS_OFFSET 2
129297 +#define SD_R5_GET_RESP_FLAGS(pR) (pR)[SD_R5_RESP_FLAGS_OFFSET]
129298 +#define SD_R5_SET_CMD(pR,cmd) (pR)[5] = (cmd) & 0xC0
129299 +#define SD_R5_RESP_CMD_ERR (1 << 7) /* for previous cmd */
129300 +#define SD_R5_ILLEGAL_CMD (1 << 6)
129301 +#define SD_R5_GENERAL_ERR (1 << 3)
129302 +#define SD_R5_INVALID_FUNC (1 << 1)
129303 +#define SD_R5_ARG_RANGE_ERR (1 << 0)
129304 +#define SD_R5_CURRENT_CMD_ERRORS (SD_R5_ILLEGAL_CMD | SD_R5_GENERAL_ERR \
129305 + | SD_R5_INVALID_FUNC | SD_R5_ARG_RANGE_ERR)
129306 +#define SD_R5_ERRORS (SD_R5_CURRENT_CMD_ERRORS)
129307 +
129308 +#define SD_R5_GET_IO_STATE(pR) (((pR)[2] >> 4) & 0x03)
129309 +#define SD_R5_STATE_DIS 0x00
129310 +#define SD_R5_STATE_CMD 0x01
129311 +#define SD_R5_STATE_TRN 0x02
129312 +
129313 +/* SDIO Modified R6 Response */
129314 +#define SD_SDIO_R6_RESPONSE_BYTES 6
129315 +#define SD_SDIO_R6_GET_RCA(pR) ((UINT16)((pR)[3]) | ((UINT16)((pR)[4]) << 8))
129316 +#define SD_SDIO_R6_GET_CSTAT(pR)((UINT16)((pR)[1]) | ((UINT16)((pR)[2]) << 8))
129317 +
129318 +/* SPI mode R1 response */
129319 +#define SPI_R1_RESPONSE_BYTES 1
129320 +#define GET_SPI_R1_RESP_TOKEN(pR) (pR)[0]
129321 +#define SPI_CS_STATE_IDLE 0x01
129322 +#define SPI_CS_ERASE_RESET (1 << 1)
129323 +#define SPI_CS_ILLEGAL_CMD (1 << 2)
129324 +#define SPI_CS_CMD_CRC_ERR (1 << 3)
129325 +#define SPI_CS_ERASE_SEQ_ERR (1 << 4)
129326 +#define SPI_CS_ADDRESS_ERR (1 << 5)
129327 +#define SPI_CS_PARAM_ERR (1 << 6)
129328 +#define SPI_CS_ERR_MASK 0x7c
129329 +
129330 +/* SPI mode R2 response */
129331 +#define SPI_R2_RESPONSE_BYTES 2
129332 +#define GET_SPI_R2_RESP_TOKEN(pR) (pR)[1]
129333 +#define GET_SPI_R2_STATUS_TOKEN(pR) (pR)[0]
129334 +/* the first response byte is defined above */
129335 +/* the second response byte is defined below */
129336 +#define SPI_CS_CARD_IS_LOCKED (1 << 0)
129337 +#define SPI_CS_LOCK_UNLOCK_FAILED (1 << 1)
129338 +#define SPI_CS_ERROR (1 << 2)
129339 +#define SPI_CS_INTERNAL_ERROR (1 << 3)
129340 +#define SPI_CS_ECC_FAILED (1 << 4)
129341 +#define SPI_CS_WP_VIOLATION (1 << 5)
129342 +#define SPI_CS_ERASE_PARAM_ERR (1 << 6)
129343 +#define SPI_CS_OUT_OF_RANGE (1 << 7)
129344 +
129345 +/* SPI mode R3 response */
129346 +#define SPI_R3_RESPONSE_BYTES 5
129347 +#define SPI_R3_GET_OCR(pR) ((((UINT32)((pR)[0])) | \
129348 + (((UINT32)((pR)[1])) << 8) | \
129349 + (((UINT32)((pR)[2])) << 16) | \
129350 + (((UINT32)((pR)[3])) << 24)) & SDMMC_OCR_VOLTAGE_MASK)
129351 +#define SPI_R3_IS_CARD_READY(pR) (((pR)[3] & 0x80) == 0x80)
129352 +#define GET_SPI_R3_RESP_TOKEN(pR) (pR)[4]
129353 +
129354 +/* SPI mode SDIO R4 response */
129355 +#define SPI_SDIO_R4_RESPONSE_BYTES 5
129356 +#define SPI_SDIO_R4_GET_OCR(pR) ((UINT32)((pR)[0]) | \
129357 + (((UINT32)(pR)[1]) << 8) | \
129358 + (((UINT32)(pR)[2]) << 16))
129359 +#define SPI_SDIO_R4_IS_MEMORY_PRESENT(pR) (((pR)[3] & 0x08) == 0x08)
129360 +#define SPI_SDIO_R4_GET_IO_FUNC_COUNT(pR) (((pR)[3] >> 4) & 0x07)
129361 +#define SPI_SDIO_R4_IS_CARD_READY(pR) (((pR)[3] & 0x80) == 0x80)
129362 +#define GET_SPI_SDIO_R4_RESP_TOKEN(pR) (pR)[4]
129363 +
129364 +/* SPI Mode SDIO R5 response */
129365 +#define SPI_SDIO_R5_RESPONSE_BYTES 2
129366 +#define GET_SPI_SDIO_R5_RESP_TOKEN(pR) (pR)[1]
129367 +#define GET_SPI_SDIO_R5_RESPONSE_RDATA(pR) (pR)[0]
129368 +#define SPI_R5_IDLE_STATE 0x01
129369 +#define SPI_R5_ILLEGAL_CMD (1 << 2)
129370 +#define SPI_R5_CMD_CRC (1 << 3)
129371 +#define SPI_R5_FUNC_ERR (1 << 4)
129372 +#define SPI_R5_PARAM_ERR (1 << 6)
129373 +
129374 +/* SDIO COMMAND 52 Definitions */
129375 +#define CMD52_READ 0
129376 +#define CMD52_WRITE 1
129377 +#define CMD52_READ_AFTER_WRITE 1
129378 +#define CMD52_NORMAL_WRITE 0
129379 +#define SDIO_SET_CMD52_ARG(arg,rw,func,raw,address,writedata) \
129380 + (arg) = (((rw) & 1) << 31) | \
129381 + (((func) & 0x7) << 28) | \
129382 + (((raw) & 1) << 27) | \
129383 + (1 << 26) | \
129384 + (((address) & 0x1FFFF) << 9) | \
129385 + (1 << 8) | \
129386 + ((writedata) & 0xFF)
129387 +#define SDIO_SET_CMD52_READ_ARG(arg,func,address) \
129388 + SDIO_SET_CMD52_ARG(arg,CMD52_READ,(func),0,address,0x00)
129389 +#define SDIO_SET_CMD52_WRITE_ARG(arg,func,address,value) \
129390 + SDIO_SET_CMD52_ARG(arg,CMD52_WRITE,(func),CMD52_NORMAL_WRITE,address,value)
129391 +
129392 +/* SDIO COMMAND 53 Definitions */
129393 +#define CMD53_READ 0
129394 +#define CMD53_WRITE 1
129395 +#define CMD53_BLOCK_BASIS 1
129396 +#define CMD53_BYTE_BASIS 0
129397 +#define CMD53_FIXED_ADDRESS 0
129398 +#define CMD53_INCR_ADDRESS 1
129399 +#define SDIO_SET_CMD53_ARG(arg,rw,func,mode,opcode,address,bytes_blocks) \
129400 + (arg) = (((rw) & 1) << 31) | \
129401 + (((func) & 0x7) << 28) | \
129402 + (((mode) & 1) << 27) | \
129403 + (((opcode) & 1) << 26) | \
129404 + (((address) & 0x1FFFF) << 9) | \
129405 + ((bytes_blocks) & 0x1FF)
129406 +
129407 +#define SDIO_MAX_LENGTH_BYTE_BASIS 512
129408 +#define SDIO_MAX_BLOCKS_BLOCK_BASIS 511
129409 +#define SDIO_MAX_BYTES_PER_BLOCK 2048
129410 +#define SDIO_COMMON_AREA_FUNCTION_NUMBER 0
129411 +#define SDIO_FIRST_FUNCTION_NUMBER 1
129412 +#define SDIO_LAST_FUNCTION_NUMBER 7
129413 +
129414 +#define CMD53_CONVERT_BYTE_BASIS_BLK_LENGTH_PARAM(b) (((b) < SDIO_MAX_LENGTH_BYTE_BASIS) ? (b) : 0)
129415 +#define CMD53_CONVERT_BLOCK_BASIS_BLK_COUNT_PARAM(b) (((b) <= SDIO_MAX_BLOCKS_BLOCK_BASIS) ? (b) : 0)
129416 +
129417 +
129418 +/* SDIO COMMON Registers */
129419 +
129420 +/* revision register */
129421 +#define CCCR_SDIO_REVISION_REG 0x00
129422 +#define CCCR_REV_MASK 0x0F
129423 +#define CCCR_REV_1_0 0x00
129424 +#define CCCR_REV_1_1 0x01
129425 +#define SDIO_REV_MASK 0xF0
129426 +#define SDIO_REV_1_00 0x00
129427 +#define SDIO_REV_1_10 0x10
129428 +#define SDIO_REV_1_20 0x20
129429 +/* SD physical spec revision */
129430 +#define SD_SPEC_REVISION_REG 0x01
129431 +#define SD_REV_MASK 0x0F
129432 +#define SD_REV_1_01 0x00
129433 +#define SD_REV_1_10 0x01
129434 +/* I/O Enable */
129435 +#define SDIO_ENABLE_REG 0x02
129436 +/* I/O Ready */
129437 +#define SDIO_READY_REG 0x03
129438 +/* Interrupt Enable */
129439 +#define SDIO_INT_ENABLE_REG 0x04
129440 +#define SDIO_INT_MASTER_ENABLE 0x01
129441 +#define SDIO_INT_ALL_ENABLE 0xFE
129442 +/* Interrupt Pending */
129443 +#define SDIO_INT_PENDING_REG 0x05
129444 +#define SDIO_INT_PEND_MASK 0xFE
129445 +/* I/O Abort */
129446 +#define SDIO_IO_ABORT_REG 0x06
129447 +#define SDIO_IO_RESET (1 << 3)
129448 +/* Bus Interface */
129449 +#define SDIO_BUS_IF_REG 0x07
129450 +#define CARD_DETECT_DISABLE 0x80
129451 +#define SDIO_BUS_WIDTH_1_BIT 0x00
129452 +#define SDIO_BUS_WIDTH_4_BIT 0x02
129453 +/* Card Capabilities */
129454 +#define SDIO_CARD_CAPS_REG 0x08
129455 +#define SDIO_CAPS_CMD52_WHILE_DATA 0x01 /* card can issue CMD52 while data transfer */
129456 +#define SDIO_CAPS_MULTI_BLOCK 0x02 /* card supports multi-block data transfers */
129457 +#define SDIO_CAPS_READ_WAIT 0x04 /* card supports read-wait protocol */
129458 +#define SDIO_CAPS_SUSPEND_RESUME 0x08 /* card supports I/O function suspend/resume */
129459 +#define SDIO_CAPS_INT_MULTI_BLK 0x10 /* interrupts between multi-block data capable */
129460 +#define SDIO_CAPS_ENB_INT_MULTI_BLK 0x20 /* enable ints between muli-block data */
129461 +#define SDIO_CAPS_LOW_SPEED 0x40 /* low speed card */
129462 +#define SDIO_CAPS_4BIT_LS 0x80 /* 4 bit low speed card */
129463 +/* Common CIS pointer */
129464 +#define SDIO_CMN_CIS_PTR_LOW_REG 0x09
129465 +#define SDIO_CMN_CIS_PTR_MID_REG 0x0a
129466 +#define SDIO_CMN_CIS_PTR_HI_REG 0x0b
129467 +/* Bus suspend */
129468 +#define SDIO_BUS_SUSPEND_REG 0x0c
129469 +#define SDIO_FUNC_SUSPEND_STATUS_MASK 0x01 /* selected function is suspended */
129470 +#define SDIO_SUSPEND_FUNCTION 0x02 /* suspend the current selected function */
129471 +/* Function select (for bus suspension) */
129472 +#define SDIO_FUNCTION_SELECT_REG 0x0d
129473 +#define SDIO_SUSPEND_FUNCTION_0 0x00
129474 +#define SDIO_SUSPEND_MEMORY_FUNC_MASK 0x08
129475 +/* Function Execution */
129476 +#define SDIO_FUNCTION_EXEC_REG 0x0e
129477 +#define SDIO_MEMORY_FUNC_EXEC_MASK 0x01
129478 +/* Function Ready */
129479 +#define SDIO_FUNCTION_READY_REG 0x0f
129480 +#define SDIO_MEMORY_FUNC_BUSY_MASK 0x01
129481 +
129482 +/* power control 1.10 only */
129483 +#define SDIO_POWER_CONTROL_REG 0x12
129484 +#define SDIO_POWER_CONTROL_SMPC 0x01
129485 +#define SDIO_POWER_CONTROL_EMPC 0x02
129486 +
129487 +/* high speed control , 1.20 only */
129488 +#define SDIO_HS_CONTROL_REG 0x13
129489 +#define SDIO_HS_CONTROL_SHS 0x01
129490 +#define SDIO_HS_CONTROL_EHS 0x02
129491 +
129492 +/* Function Base Registers */
129493 +#define xFUNCTION_FBR_OFFSET(funcNo) (0x100*(funcNo))
129494 +/* offset calculation that does not use multiplication */
129495 +static INLINE UINT32 CalculateFBROffset(UCHAR FuncNo) {
129496 + UCHAR i = FuncNo;
129497 + UINT32 offset = 0;
129498 + while (i) {
129499 + offset += 0x100;
129500 + i--;
129501 + }
129502 + return offset;
129503 +}
129504 +/* Function info */
129505 +#define FBR_FUNC_INFO_REG_OFFSET(fbr) ((fbr) + 0x00)
129506 +#define FUNC_INFO_SUPPORTS_CSA_MASK 0x40
129507 +#define FUNC_INFO_ENABLE_CSA 0x80
129508 +#define FUNC_INFO_DEVICE_CODE_MASK 0x0F
129509 +#define FUNC_INFO_DEVICE_CODE_LAST 0x0F
129510 +#define FBR_FUNC_EXT_DEVICE_CODE_OFFSET(fbr) ((fbr) + 0x01)
129511 +/* Function Power selection */
129512 +#define FBR_FUNC_POWER_SELECT_OFFSET(fbr) ((fbr) + 0x02)
129513 +#define FUNC_POWER_SELECT_SPS 0x01
129514 +#define FUNC_POWER_SELECT_EPS 0x02
129515 +/* Function CIS ptr */
129516 +#define FBR_FUNC_CIS_LOW_OFFSET(fbr) ((fbr) + 0x09)
129517 +#define FBR_FUNC_CIS_MID_OFFSET(fbr) ((fbr) + 0x0a)
129518 +#define FBR_FUNC_CIS_HI_OFFSET(fbr) ((fbr) + 0x0b)
129519 +/* Function CSA ptr */
129520 +#define FBR_FUNC_CSA_LOW_OFFSET(fbr) ((fbr) + 0x0c)
129521 +#define FBR_FUNC_CSA_MID_OFFSET(fbr) ((fbr) + 0x0d)
129522 +#define FBR_FUNC_CSA_HI_OFFSET(fbr) ((fbr) + 0x0e)
129523 +/* Function CSA data window */
129524 +#define FBR_FUNC_CSA_DATA_OFFSET(fbr) ((fbr) + 0x0f)
129525 +/* Function Block Size Control */
129526 +#define FBR_FUNC_BLK_SIZE_LOW_OFFSET(fbr) ((fbr) + 0x10)
129527 +#define FBR_FUNC_BLK_SIZE_HI_OFFSET(fbr) ((fbr) + 0x11)
129528 +#define SDIO_CIS_AREA_BEGIN 0x00001000
129529 +#define SDIO_CIS_AREA_END 0x00017fff
129530 +/* Tuple definitions */
129531 +#define CISTPL_NULL 0x00
129532 +#define CISTPL_CHECKSUM 0x10
129533 +#define CISTPL_VERS_1 0x15
129534 +#define CISTPL_ALTSTR 0x16
129535 +#define CISTPL_MANFID 0x20
129536 +#define CISTPL_FUNCID 0x21
129537 +#define CISTPL_FUNCE 0x22
129538 +#define CISTPL_VENDOR 0x91
129539 +#define CISTPL_END 0xff
129540 +#define CISTPL_LINK_END 0xff
129541 +
129542 +
129543 +/* these structures must be packed */
129544 +
129545 +/* Manufacturer ID tuple */
129546 +struct SDIO_MANFID_TPL {
129547 + UINT16 ManufacturerCode; /* jedec code */
129548 + UINT16 ManufacturerInfo; /* manufacturer specific code */
129549 +}CT_PACK_STRUCT;
129550 +
129551 +/* Function ID Tuple */
129552 +struct SDIO_FUNC_ID_TPL {
129553 + UINT8 DeviceCode; /* device code */
129554 + UINT8 InitMask; /* system initialization mask (not used) */
129555 +}CT_PACK_STRUCT;
129556 +
129557 + /* Extended Function Tuple (Common) */
129558 +struct SDIO_FUNC_EXT_COMMON_TPL {
129559 + UINT8 Type; /* type */
129560 + UINT16 Func0_MaxBlockSize; /* max function 0 block transfer size */
129561 + UINT8 MaxTransSpeed; /* max transfer speed (encoded) */
129562 +#define TRANSFER_UNIT_MULTIPIER_MASK 0x07
129563 +#define TIME_VALUE_MASK 0x78
129564 +#define TIME_VALUE_SHIFT 3
129565 +}CT_PACK_STRUCT;
129566 +
129567 +/* Extended Function Tuple (Per Function) */
129568 +struct SDIO_FUNC_EXT_FUNCTION_TPL {
129569 + UINT8 Type; /* type */
129570 +#define SDIO_FUNC_INFO_WAKEUP_SUPPORT 0x01
129571 + UINT8 FunctionInfo; /* function info */
129572 + UINT8 SDIORev; /* revision */
129573 + UINT32 CardPSN; /* product serial number */
129574 + UINT32 CSASize; /* CSA size */
129575 + UINT8 CSAProperties; /* CSA properties */
129576 + UINT16 MaxBlockSize; /* max block size for block transfers */
129577 + UINT32 FunctionOCR; /* optimal function OCR */
129578 + UINT8 OpMinPwr; /* operational min power */
129579 + UINT8 OpAvgPwr; /* operational average power */
129580 + UINT8 OpMaxPwr; /* operation maximum power */
129581 + UINT8 SbMinPwr; /* standby minimum power */
129582 + UINT8 SbAvgPwr; /* standby average power */
129583 + UINT8 SbMaxPwr; /* standby maximum power */
129584 + UINT16 MinBandWidth; /* minimum bus bandwidth */
129585 + UINT16 OptBandWidth; /* optimalbus bandwitdh */
129586 +}CT_PACK_STRUCT;
129587 +
129588 +struct SDIO_FUNC_EXT_FUNCTION_TPL_1_1 {
129589 + struct SDIO_FUNC_EXT_FUNCTION_TPL CommonInfo; /* from 1.0*/
129590 + UINT16 EnableTimeOut; /* timeout for enable */
129591 + UINT16 OperPwrMaxPwr;
129592 + UINT16 OperPwrAvgPwr;
129593 + UINT16 HiPwrMaxPwr;
129594 + UINT16 HiPwrAvgPwr;
129595 + UINT16 LowPwrMaxPwr;
129596 + UINT16 LowPwrAvgPwr;
129597 +}CT_PACK_STRUCT;
129598 +
129599 +static INLINE SDIO_STATUS ConvertCMD52ResponseToSDIOStatus(UINT8 CMD52ResponseFlags) {
129600 + if (!(CMD52ResponseFlags & SD_R5_ERRORS)) {
129601 + return SDIO_STATUS_SUCCESS;
129602 + }
129603 + if (CMD52ResponseFlags & SD_R5_ILLEGAL_CMD) {
129604 + return SDIO_STATUS_DATA_STATE_INVALID;
129605 + } else if (CMD52ResponseFlags & SD_R5_INVALID_FUNC) {
129606 + return SDIO_STATUS_INVALID_FUNC;
129607 + } else if (CMD52ResponseFlags & SD_R5_ARG_RANGE_ERR) {
129608 + return SDIO_STATUS_FUNC_ARG_ERROR;
129609 + } else {
129610 + return SDIO_STATUS_DATA_ERROR_UNKNOWN;
129611 + }
129612 +}
129613 +
129614 +/* CMD6 mode switch definitions */
129615 +
129616 +#define SD_SWITCH_FUNC_CHECK 0
129617 +#define SD_SWITCH_FUNC_SET ((UINT32)(1 << 31))
129618 +#define SD_FUNC_NO_SELECT_MASK 0x00FFFFFF
129619 +#define SD_SWITCH_GRP_1 0
129620 +#define SD_SWITCH_GRP_2 1
129621 +#define SD_SWITCH_GRP_3 2
129622 +#define SD_SWITCH_GRP_4 3
129623 +#define SD_SWITCH_GRP_5 4
129624 +#define SD_SWITCH_GRP_6 5
129625 +
129626 +#define SD_SWITCH_HIGH_SPEED_GROUP SD_SWITCH_GRP_1
129627 +#define SD_SWITCH_HIGH_SPEED_FUNC_NO 1
129628 +
129629 +#define SD_SWITCH_MAKE_SHIFT(grp) ((grp) * 4)
129630 +
129631 +#define SD_SWITCH_MAKE_GRP_PATTERN(FuncGrp,FuncNo) \
129632 + ((SD_FUNC_NO_SELECT_MASK & (~(0xF << SD_SWITCH_MAKE_SHIFT(FuncGrp)))) | \
129633 + (((FuncNo) & 0xF) << SD_SWITCH_MAKE_SHIFT(FuncGrp))) \
129634 +
129635 +#define SD_SWITCH_FUNC_ARG_GROUP_CHECK(FuncGrp,FuncNo) \
129636 + (SD_SWITCH_FUNC_CHECK | SD_SWITCH_MAKE_GRP_PATTERN(FuncGrp,FuncNo))
129637 +
129638 +#define SD_SWITCH_FUNC_ARG_GROUP_SET(FuncGrp,FuncNo) \
129639 + (SD_SWITCH_FUNC_SET | SD_SWITCH_MAKE_GRP_PATTERN(FuncGrp,FuncNo))
129640 +
129641 +#define SD_SWITCH_FUNC_STATUS_BLOCK_BYTES 64
129642 +
129643 +#define SD_SWITCH_FUNC_STATUS_GET_GRP_BIT_MASK(pBuffer,FuncGrp) \
129644 + (USHORT)((pBuffer)[50 + ((FuncGrp)*2)] | ((pBuffer)[51 + ((FuncGrp)*2)] << 8))
129645 +
129646 +#define SD_SWITCH_FUNC_STATUS_GET_MAX_CURRENT(pBuffer) \
129647 + (USHORT)((pBuffer)[62] | ((pBuffer)[63] << 8))
129648 +
129649 +static INLINE UINT8 SDSwitchGetSwitchResult(PUINT8 pBuffer, UINT8 FuncGrp)
129650 +{
129651 + switch (FuncGrp) {
129652 + case 0:
129653 + return (pBuffer[47] & 0xF);
129654 + case 1:
129655 + return (pBuffer[47] >> 4);
129656 + case 2:
129657 + return (pBuffer[48] & 0xF);
129658 + case 3:
129659 + return (pBuffer[48] >> 4);
129660 + case 4:
129661 + return (pBuffer[49] & 0xF);
129662 + case 5:
129663 + return (pBuffer[49] >> 4);
129664 + default:
129665 + return 0xF;
129666 + }
129667 +}
129668 +
129669 +#endif
129670 Index: linux-2.6.24.7/include/linux/sdio/sdio_hcd_defs.h
129671 ===================================================================
129672 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
129673 +++ linux-2.6.24.7/include/linux/sdio/sdio_hcd_defs.h 2008-12-11 22:46:49.000000000 +0100
129674 @@ -0,0 +1,219 @@
129675 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129676 +@file: sdio_hcd_defs.h
129677 +
129678 +@abstract: host controller driver definitions
129679 +
129680 +@notice: Copyright (c), 2005-2006 Atheros Communications, Inc.
129681 +
129682 +
129683 + *
129684 + * This program is free software; you can redistribute it and/or modify
129685 + * it under the terms of the GNU General Public License version 2 as
129686 + * published by the Free Software Foundation;
129687 + *
129688 + * Software distributed under the License is distributed on an "AS
129689 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
129690 + * implied. See the License for the specific language governing
129691 + * rights and limitations under the License.
129692 + *
129693 + * Portions of this code were developed with information supplied from the
129694 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
129695 + *
129696 + * The following conditions apply to the release of the SD simplified specification (�Simplified
129697 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
129698 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
129699 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
129700 + * Specification may require a license from the SD Card Association or other third parties.
129701 + * Disclaimers:
129702 + * The information contained in the Simplified Specification is presented only as a standard
129703 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
129704 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
129705 + * any damages, any infringements of patents or other right of the SD Card Association or any third
129706 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
129707 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
129708 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
129709 + * information, know-how or other confidential information to any third party.
129710 + *
129711 + *
129712 + * The initial developers of the original code are Seung Yi and Paul Lever
129713 + *
129714 + * sdio@atheros.com
129715 + *
129716 + *
129717 +
129718 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
129719 +#ifndef __SDIO_HCD_DEFS_H___
129720 +#define __SDIO_HCD_DEFS_H___
129721 +
129722 + /* write protect switch position data */
129723 +typedef UINT8 SDCONFIG_WP_VALUE;
129724 +
129725 + /* HC commands */
129726 +#define SDCONFIG_SEND_INIT_CLOCKS (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_PUT | 1)
129727 +#define SDCONFIG_SDIO_INT_CTRL (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_PUT | 2)
129728 +#define SDCONFIG_SDIO_REARM_INT (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_NONE | 3)
129729 +#define SDCONFIG_BUS_MODE_CTRL (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_BOTH | 4)
129730 +#define SDCONFIG_POWER_CTRL (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_PUT | 5)
129731 +#define SDCONFIG_GET_WP (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_GET | 6)
129732 +
129733 + /* slot init clocks control */
129734 +typedef struct _SDCONFIG_INIT_CLOCKS_DATA {
129735 + UINT16 NumberOfClocks; /* number of clocks to issue in the current bus mode*/
129736 +}SDCONFIG_INIT_CLOCKS_DATA, *PSDCONFIG_INIT_CLOCKS_DATA;
129737 +
129738 +/* slot power control */
129739 +typedef struct _SDCONFIG_POWER_CTRL_DATA {
129740 + BOOL SlotPowerEnable; /* turn on/off slot power */
129741 + SLOT_VOLTAGE_MASK SlotPowerVoltageMask; /* slot power voltage mask */
129742 +}SDCONFIG_POWER_CTRL_DATA, *PSDCONFIG_POWER_CTRL_DATA;
129743 +
129744 +typedef UINT8 SDIO_IRQ_MODE_FLAGS;
129745 +/* SDIO Interrupt control */
129746 +typedef struct _SDCONFIG_SDIO_INT_CTRL_DATA {
129747 + BOOL SlotIRQEnable; /* turn on/off Slot IRQ detection */
129748 + SDIO_IRQ_MODE_FLAGS IRQDetectMode; /* slot IRQ detect mode , only valid if Enabled = TRUE */
129749 +#define IRQ_DETECT_RAW 0x00
129750 +#define IRQ_DETECT_MULTI_BLK 0x01
129751 +#define IRQ_DETECT_4_BIT 0x02
129752 +#define IRQ_DETECT_1_BIT 0x04
129753 +#define IRQ_DETECT_SPI 0x08
129754 +}SDCONFIG_SDIO_INT_CTRL_DATA, *PSDCONFIG_SDIO_INT_CTRL_DATA;
129755 +
129756 +/* card insert */
129757 +#define EVENT_HCD_ATTACH 1
129758 +/* card remove */
129759 +#define EVENT_HCD_DETACH 2
129760 +/* card slot interrupt */
129761 +#define EVENT_HCD_SDIO_IRQ_PENDING 3
129762 +/* transfer done */
129763 +#define EVENT_HCD_TRANSFER_DONE 4
129764 +/* (internal use only) */
129765 +#define EVENT_HCD_CD_POLLING 5
129766 +/* NOP */
129767 +#define EVENT_HCD_NOP 0
129768 +
129769 +/* attrib_flags */
129770 +#define SDHCD_ATTRIB_SUPPORTS_POWER 0x0001 /* host controller driver supports power managment */
129771 +#define SDHCD_ATTRIB_BUS_1BIT 0x0002 /* SD Native 1 - bit mode */
129772 +#define SDHCD_ATTRIB_BUS_4BIT 0x0004 /* SD Native 4 - bit mode */
129773 +#define SDHCD_ATTRIB_BUS_SPI 0x0008 /* SPI mode capable */
129774 +#define SDHCD_ATTRIB_READ_WAIT 0x0010 /* read wait supported (SD-only) */
129775 +#define SDHCD_ATTRIB_MULTI_BLK_IRQ 0x0020 /* interrupts between multi-block capable (SD-only) */
129776 +#define SDHCD_ATTRIB_BUS_MMC8BIT 0x0040 /* MMC 8-bit */
129777 +#define SDHCD_ATTRIB_SLOT_POLLING 0x0080 /* requires slot polling for Card Detect */
129778 +#define SDHCD_ATTRIB_POWER_SWITCH 0x0100 /* host has power switch control, must be set if SPI
129779 + mode can be switched to 1 or 4 bit mode */
129780 +#define SDHCD_ATTRIB_NO_SPI_CRC 0x0200 /* when in SPI mode,
129781 + host wants to run without SPI CRC */
129782 +#define SDHCD_ATTRIB_AUTO_CMD12 0x0400 /* host controller supports auto CMD12 */
129783 +#define SDHCD_ATTRIB_NO_4BIT_IRQ 0x0800 /* host controller does not support 4 bit IRQ mode*/
129784 +#define SDHCD_ATTRIB_RAW_MODE 0x1000 /* host controller is a raw mode hcd*/
129785 +#define SDHCD_ATTRIB_SD_HIGH_SPEED 0x2000 /* host controller supports SD high speed interface */
129786 +#define SDHCD_ATTRIB_MMC_HIGH_SPEED 0x4000 /* host controller supports MMC high speed interface */
129787 +
129788 +#define IS_CARD_PRESENT(pHcd) ((pHcd)->CardProperties.Flags & CARD_TYPE_MASK)
129789 +#define SET_CURRENT_REQUEST(pHcd,Req) (pHcd)->pCurrentRequest = (Req)
129790 +#define IS_HCD_RAW(pHcd) ((pHcd)->Attributes & SDHCD_ATTRIB_RAW_MODE)
129791 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129792 + @function: Get a pointer to the current bus request for a host controller
129793 +
129794 + @function name: GET_CURRENT_REQUEST
129795 + @prototype: PSDREQUEST GET_CURRENT_REQUEST (PSDHCD pHcd)
129796 + @category: HD_Reference
129797 +
129798 + @input: pHcd - host structure
129799 +
129800 + @return: current SD/SDIO bus request being worked on
129801 +
129802 + @notes: Implemented as a macro. This macro returns the current SD request that is
129803 + being worked on.
129804 +
129805 + @example: getting the current request:
129806 + pReq = GET_CURRENT_REQUEST(&pHct->Hcd);
129807 +
129808 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
129809 +#define GET_CURRENT_REQUEST(pHcd) (pHcd)->pCurrentRequest
129810 +#define GET_CURRENT_BUS_WIDTH(pHcd) SDCONFIG_GET_BUSWIDTH((pHcd)->CardProperties.BusMode)
129811 +
129812 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129813 + @function: Get host controller's current operational bus clock
129814 +
129815 + @function name: SDHCD_GET_OPER_CLOCK
129816 + @prototype: SD_BUSCLOCK_RATE SDHCD_GET_OPER_CLOCK(PSDHCD pHcd)
129817 + @category: HD_Reference
129818 +
129819 + @input: pHcd - the registered host structure
129820 +
129821 + @output: none
129822 +
129823 + @return: clock rate
129824 +
129825 + @notes: Implemented as a macro. Returns the current bus clock rate.
129826 +
129827 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
129828 +#define SDHCD_GET_OPER_CLOCK(pHcd) (pHcd)->CardProperties.OperBusClock
129829 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129830 + @function: Is host controller operating in SPI mode
129831 +
129832 + @function name: IS_HCD_BUS_MODE_SPI
129833 + @prototype: BOOL IS_HCD_BUS_MODE_SPI (PSDHCD pHcd)
129834 + @category: HD_Reference
129835 +
129836 + @input: pHcd - host structure
129837 +
129838 + @return: TRUE if in SPI mode
129839 +
129840 + @notes: Implemented as a macro. Host controllers that operate in SPI mode
129841 + dynamically can use this macro to check for SPI operation.
129842 +
129843 + @example: testing for SPI mode:
129844 + if (IS_HCD_BUS_MODE_SPI(&pHct->Hcd)) {
129845 + .. in spi mode
129846 + }
129847 +
129848 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
129849 +#define IS_HCD_BUS_MODE_SPI(pHcd) (GET_CURRENT_BUS_WIDTH(pHcd) == SDCONFIG_BUS_WIDTH_SPI)
129850 +
129851 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129852 + @function: Is host controller using SPI in non-CRC mode
129853 +
129854 + @function name: IS_HCD_BUS_MODE_SPI_NO_CRC
129855 + @prototype: BOOL IS_HCD_BUS_MODE_SPI_NO_CRC(PSDHCD pHcd)
129856 + @category: HD_Reference
129857 +
129858 + @input: pHcd - host structure
129859 +
129860 + @return: TRUE if CRC mode is off
129861 +
129862 + @notes: Implemented as a macro. SPI-capable cards and systems can operate in
129863 + non-CRC protected mode. In this mode the host controller should ignore
129864 + CRC fields and/or disable CRC generation when issuing command or data
129865 + packets. This option is useful for software based SPI mode where CRC
129866 + should be turned off in order to reduce processing overhead.
129867 +
129868 + @example: test for non-CRC SPI mode:
129869 + if (IS_HCD_BUS_MODE_SPI_NO_CRC(&pHct->Hcd)) {
129870 + .. disable CRC checking in hardware.
129871 + }
129872 +
129873 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
129874 +#define IS_HCD_BUS_MODE_SPI_NO_CRC(pHcd) ((pHcd)->CardProperties.BusMode & \
129875 + SDCONFIG_BUS_MODE_SPI_NO_CRC)
129876 +
129877 +typedef UINT8 SDHCD_RESPONSE_CHECK_MODE;
129878 +/* have SDIO core check the response token and see if it is okay to continue with
129879 + * the data portion */
129880 +#define SDHCD_CHECK_DATA_TRANS_OK 0x01
129881 +/* have SDIO core check the SPI token received */
129882 +#define SDHCD_CHECK_SPI_TOKEN 0x02
129883 +
129884 +/* prototypes */
129885 +/* for HCD use */
129886 +SDIO_STATUS SDIO_RegisterHostController(PSDHCD pHcd);
129887 +SDIO_STATUS SDIO_UnregisterHostController(PSDHCD pHcd);
129888 +SDIO_STATUS SDIO_HandleHcdEvent(PSDHCD pHcd, HCD_EVENT Event);
129889 +SDIO_STATUS SDIO_CheckResponse(PSDHCD pHcd, PSDREQUEST pReq, SDHCD_RESPONSE_CHECK_MODE CheckMode);
129890 +SDIO_STATUS SDIO_BusAddOSDevice(PSDDMA_DESCRIPTION pDma, POS_PNPDRIVER pDriver, POS_PNPDEVICE pDevice);
129891 +void SDIO_BusRemoveOSDevice(POS_PNPDRIVER pDriver, POS_PNPDEVICE pDevice);
129892 +
129893 +#endif /* __SDIO_BUSDRIVER_H___ */
129894 Index: linux-2.6.24.7/include/linux/sdio/sdio_lib.h
129895 ===================================================================
129896 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
129897 +++ linux-2.6.24.7/include/linux/sdio/sdio_lib.h 2008-12-11 22:46:49.000000000 +0100
129898 @@ -0,0 +1,270 @@
129899 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
129900 +@file: sdio_lib.h
129901 +
129902 +@abstract: SDIO Library include
129903 +
129904 +#notes:
129905 +
129906 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
129907 +
129908 +
129909 + *
129910 + * This program is free software; you can redistribute it and/or modify
129911 + * it under the terms of the GNU General Public License version 2 as
129912 + * published by the Free Software Foundation;
129913 + *
129914 + * Software distributed under the License is distributed on an "AS
129915 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
129916 + * implied. See the License for the specific language governing
129917 + * rights and limitations under the License.
129918 + *
129919 + * Portions of this code were developed with information supplied from the
129920 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
129921 + *
129922 + * The following conditions apply to the release of the SD simplified specification (�Simplified
129923 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
129924 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
129925 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
129926 + * Specification may require a license from the SD Card Association or other third parties.
129927 + * Disclaimers:
129928 + * The information contained in the Simplified Specification is presented only as a standard
129929 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
129930 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
129931 + * any damages, any infringements of patents or other right of the SD Card Association or any third
129932 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
129933 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
129934 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
129935 + * information, know-how or other confidential information to any third party.
129936 + *
129937 + *
129938 + * The initial developers of the original code are Seung Yi and Paul Lever
129939 + *
129940 + * sdio@atheros.com
129941 + *
129942 + *
129943 +
129944 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
129945 +#ifndef __SDIO_LIB_H___
129946 +#define __SDIO_LIB_H___
129947 +
129948 +#ifdef UNDER_CE
129949 +#include "wince\sdio_lib_wince.h"
129950 +#endif /* WINCE */
129951 +
129952 +#define CMD52_DO_READ FALSE
129953 +#define CMD52_DO_WRITE TRUE
129954 +
129955 + /* read/write macros to any function */
129956 +#define Cmd52WriteByteFunc(pDev,Func,Address,pValue) \
129957 + SDLIB_IssueCMD52((pDev),(Func),(Address),(pValue),1,CMD52_DO_WRITE)
129958 +#define Cmd52ReadByteFunc(pDev,Func,Address,pValue) \
129959 + SDLIB_IssueCMD52((pDev),(Func),(Address),pValue,1,CMD52_DO_READ)
129960 +#define Cmd52ReadMultipleFunc(pDev,Func, Address, pBuf,length) \
129961 + SDLIB_IssueCMD52((pDev),(Func),(Address),(pBuf),(length),CMD52_DO_READ)
129962 +
129963 + /* macros to access common registers */
129964 +#define Cmd52WriteByteCommon(pDev, Address, pValue) \
129965 + Cmd52WriteByteFunc((pDev),0,(Address),(pValue))
129966 +#define Cmd52ReadByteCommon(pDev, Address, pValue) \
129967 + Cmd52ReadByteFunc((pDev),0,(Address),(pValue))
129968 +#define Cmd52ReadMultipleCommon(pDev, Address, pBuf,length) \
129969 + Cmd52ReadMultipleFunc((pDev),0,(Address),(pBuf),(length))
129970 +
129971 +#define SDLIB_SetupCMD52RequestAsync(f,a,w,wd,pR) \
129972 +{ \
129973 + SDLIB_SetupCMD52Request((f),(a),(w),(wd),(pR)); \
129974 + (pR)->Flags |= SDREQ_FLAGS_TRANS_ASYNC; \
129975 +}
129976 +
129977 + /* a message block */
129978 +typedef struct _SDMESSAGE_BLOCK {
129979 + SDLIST SDList; /* list entry */
129980 + INT MessageLength; /* number of bytes in this message */
129981 + UINT8 MessageStart[1]; /* message start */
129982 +}SDMESSAGE_BLOCK, *PSDMESSAGE_BLOCK;
129983 +
129984 + /* message queue */
129985 +typedef struct _SDMESSAGE_QUEUE {
129986 + SDLIST MessageList; /* message list */
129987 + OS_CRITICALSECTION MessageCritSection; /* message semaphore */
129988 + SDLIST FreeMessageList; /* free message list */
129989 + INT MaxMessageLength; /* max message block length */
129990 +}SDMESSAGE_QUEUE, *PSDMESSAGE_QUEUE;
129991 +
129992 +/* internal library prototypes that can be proxied */
129993 +SDIO_STATUS _SDLIB_IssueCMD52(PSDDEVICE pDevice,
129994 + UINT8 FuncNo,
129995 + UINT32 Address,
129996 + PUINT8 pData,
129997 + INT ByteCount,
129998 + BOOL Write);
129999 +SDIO_STATUS _SDLIB_FindTuple(PSDDEVICE pDevice,
130000 + UINT8 Tuple,
130001 + UINT32 *pTupleScanAddress,
130002 + PUINT8 pBuffer,
130003 + UINT8 *pLength);
130004 +SDIO_STATUS _SDLIB_IssueConfig(PSDDEVICE pDevice,
130005 + SDCONFIG_COMMAND Command,
130006 + PVOID pData,
130007 + INT Length);
130008 +void _SDLIB_PrintBuffer(PUCHAR pBuffer, INT Length,PTEXT pDescription);
130009 +void _SDLIB_SetupCMD52Request(UINT8 FuncNo,
130010 + UINT32 Address,
130011 + BOOL Write,
130012 + UINT8 WriteData,
130013 + PSDREQUEST pRequest);
130014 +SDIO_STATUS _SDLIB_SetFunctionBlockSize(PSDDEVICE pDevice,
130015 + UINT16 BlockSize);
130016 +
130017 +SDIO_STATUS _SDLIB_GetDefaultOpCurrent(PSDDEVICE pDevice,
130018 + SD_SLOT_CURRENT *pOpCurrent);
130019 +PSDMESSAGE_QUEUE _CreateMessageQueue(INT MaxMessages, INT MaxMessageLength);
130020 +void _DeleteMessageQueue(PSDMESSAGE_QUEUE pQueue);
130021 +SDIO_STATUS _PostMessage(PSDMESSAGE_QUEUE pQueue, PVOID pMessage, INT MessageLength);
130022 +SDIO_STATUS _GetMessage(PSDMESSAGE_QUEUE pQueue, PVOID pData, INT *pBufferLength);
130023 +
130024 +#ifdef CTSYSTEM_NO_FUNCTION_PROXIES
130025 + /* OS port requires no proxy functions, use methods directly from the library */
130026 +#define SDLIB_IssueCMD52 _SDLIB_IssueCMD52
130027 +#define SDLIB_SetupCMD52Request _SDLIB_SetupCMD52Request
130028 +#define SDLIB_FindTuple _SDLIB_FindTuple
130029 +#define SDLIB_IssueConfig _SDLIB_IssueConfig
130030 +#define SDLIB_SetFunctionBlockSize _SDLIB_SetFunctionBlockSize
130031 +#define SDLIB_GetDefaultOpCurrent _SDLIB_GetDefaultOpCurrent
130032 +#define SDLIB_CreateMessageQueue _CreateMessageQueue
130033 +#define SDLIB_DeleteMessageQueue _DeleteMessageQueue
130034 +#define SDLIB_PostMessage _PostMessage
130035 +#define SDLIB_GetMessage _GetMessage
130036 +#define SDLIB_PrintBuffer _SDLIB_PrintBuffer
130037 +#else
130038 +
130039 +/* proxied versions */
130040 +SDIO_STATUS SDLIB_IssueCMD52(PSDDEVICE pDevice,
130041 + UINT8 FuncNo,
130042 + UINT32 Address,
130043 + PUINT8 pData,
130044 + INT ByteCount,
130045 + BOOL Write);
130046 +
130047 +void SDLIB_SetupCMD52Request(UINT8 FuncNo,
130048 + UINT32 Address,
130049 + BOOL Write,
130050 + UINT8 WriteData,
130051 + PSDREQUEST pRequest);
130052 +
130053 +SDIO_STATUS SDLIB_FindTuple(PSDDEVICE pDevice,
130054 + UINT8 Tuple,
130055 + UINT32 *pTupleScanAddress,
130056 + PUINT8 pBuffer,
130057 + UINT8 *pLength);
130058 +
130059 +SDIO_STATUS SDLIB_IssueConfig(PSDDEVICE pDevice,
130060 + SDCONFIG_COMMAND Command,
130061 + PVOID pData,
130062 + INT Length);
130063 +
130064 +SDIO_STATUS SDLIB_SetFunctionBlockSize(PSDDEVICE pDevice,
130065 + UINT16 BlockSize);
130066 +
130067 +void SDLIB_PrintBuffer(PUCHAR pBuffer, INT Length,PTEXT pDescription);
130068 +
130069 +SDIO_STATUS SDLIB_GetDefaultOpCurrent(PSDDEVICE pDevice, SD_SLOT_CURRENT *pOpCurrent);
130070 +
130071 +PSDMESSAGE_QUEUE SDLIB_CreateMessageQueue(INT MaxMessages, INT MaxMessageLength);
130072 +
130073 +void SDLIB_DeleteMessageQueue(PSDMESSAGE_QUEUE pQueue);
130074 +
130075 +SDIO_STATUS SDLIB_PostMessage(PSDMESSAGE_QUEUE pQueue, PVOID pMessage, INT MessageLength);
130076 +
130077 +SDIO_STATUS SDLIB_GetMessage(PSDMESSAGE_QUEUE pQueue, PVOID pData, INT *pBufferLength);
130078 +#endif /* CTSYSTEM_NO_FUNCTION_PROXIES */
130079 +
130080 +
130081 +SDIO_STATUS SDLIB_OSCreateHelper(POSKERNEL_HELPER pHelper,
130082 + PHELPER_FUNCTION pFunction,
130083 + PVOID pContext);
130084 +
130085 +void SDLIB_OSDeleteHelper(POSKERNEL_HELPER pHelper);
130086 +
130087 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
130088 + @function: Check message queue is empty
130089 +
130090 + @function name: SDLIB_IsQueueEmpty
130091 + @prototype: BOOL SDLIB_IsQueueEmpty(PSDMESSAGE_QUEUE pQueue)
130092 + @category: Support_Reference
130093 +
130094 + @input: pQueue - message queue to check
130095 +
130096 + @return: TRUE if empty else false
130097 +
130098 + @see also: SDLIB_CreateMessageQueue
130099 +
130100 + @example: Check message queue :
130101 + if (SDLIB_IsQueueEmpty(pInstance->pQueue)) {
130102 + .. message queue is empty
130103 + }
130104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
130105 +static INLINE BOOL SDLIB_IsQueueEmpty(PSDMESSAGE_QUEUE pQueue) {
130106 + return SDLIST_IS_EMPTY(&pQueue->MessageList);
130107 +}
130108 +
130109 +
130110 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
130111 + @function: Issue an I/O abort request
130112 +
130113 + @function name: SDLIB_IssueIOAbort
130114 + @prototype: SDIO_STATUS SDLIB_IssueIOAbort(PSDDEVICE pDevice)
130115 + @category: PD_Reference
130116 +
130117 + @input: pDevice - the device that is the target of this request
130118 +
130119 + @return: SDIO_STATUS
130120 +
130121 + @notes: This procedure can be called to issue an I/O abort request to an I/O function.
130122 + This procedure cannot be used to abort a data (block) transfer already in progress.
130123 + It is intended to be used when a data (block) transfer completes with an error and only if
130124 + the I/O function requires an abort action. Some I/O functions may automatically
130125 + recover from such failures and not require this action. This function issues
130126 + the abort command synchronously and can potentially block.
130127 + If an async request is required, you must allocate a request and use
130128 + SDLIB_SetupIOAbortAsync() to prepare the request.
130129 +
130130 + @example: Issuing I/O Abort synchronously :
130131 + .. check status from last block operation:
130132 + if (status == SDIO_STATUS_BUS_READ_TIMEOUT) {
130133 + .. on failure, issue I/O abort
130134 + status2 = SDLIB_IssueIOAbort(pDevice);
130135 + }
130136 + Issuing I/O Abort asynchronously:
130137 + ... allocate a request
130138 + ... setup the request:
130139 + SDLIB_SetupIOAbortAsync(pDevice,pReq);
130140 + pReq->pCompletion = myIOAbortCompletion;
130141 + pReq->pCompleteContext = pDevice;
130142 + status = SDDEVICE_CALL_REQUEST_FUNC(pDevice,pReq);
130143 +
130144 + @see also: SDLIB_SetupIOAbortAsync
130145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
130146 +static INLINE SDIO_STATUS SDLIB_IssueIOAbort(PSDDEVICE pDevice) {
130147 + UINT8 value = SDDEVICE_GET_SDIO_FUNCNO(pDevice);
130148 + return Cmd52WriteByteCommon(pDevice,0x06,&value);
130149 +}
130150 +
130151 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
130152 + @function: Setup an I/O abort request for async operation
130153 +
130154 + @function name: SDLIB_SetupIOAbortAsync
130155 + @prototype: SDLIB_SetupIOAbortAsync(PSDDEVICE pDevice, PSDREQUEST pRequest)
130156 + @category: PD_Reference
130157 +
130158 + @input: pDevice - the device that is the target of this request
130159 + pRequest - the request to set up
130160 +
130161 + @see also: SDLIB_IssueIOAbort
130162 +
130163 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
130164 +#define SDLIB_SetupIOAbortAsync(pDevice, pReq) \
130165 + SDLIB_SetupCMD52RequestAsync(0,0x06,TRUE,SDDEVICE_GET_SDIO_FUNCNO(pDevice),(pReq))
130166 +
130167 +
130168 +#endif /* __SDIO_LIB_H___*/
130169 Index: linux-2.6.24.7/include/linux/sdio/sdlist.h
130170 ===================================================================
130171 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
130172 +++ linux-2.6.24.7/include/linux/sdio/sdlist.h 2008-12-11 22:46:49.000000000 +0100
130173 @@ -0,0 +1,141 @@
130174 +/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
130175 +@file: sdlist.h
130176 +
130177 +@abstract: OS independent list functions
130178 +
130179 +@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
130180 +
130181 +
130182 + *
130183 + * This program is free software; you can redistribute it and/or modify
130184 + * it under the terms of the GNU General Public License version 2 as
130185 + * published by the Free Software Foundation;
130186 + *
130187 + * Software distributed under the License is distributed on an "AS
130188 + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
130189 + * implied. See the License for the specific language governing
130190 + * rights and limitations under the License.
130191 + *
130192 + * Portions of this code were developed with information supplied from the
130193 + * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
130194 + *
130195 + * The following conditions apply to the release of the SD simplified specification (�Simplified
130196 + * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
130197 + * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
130198 + * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
130199 + * Specification may require a license from the SD Card Association or other third parties.
130200 + * Disclaimers:
130201 + * The information contained in the Simplified Specification is presented only as a standard
130202 + * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
130203 + * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
130204 + * any damages, any infringements of patents or other right of the SD Card Association or any third
130205 + * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
130206 + * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
130207 + * be construed as an obligation by the SD Card Association to disclose or distribute any technical
130208 + * information, know-how or other confidential information to any third party.
130209 + *
130210 + *
130211 + * The initial developers of the original code are Seung Yi and Paul Lever
130212 + *
130213 + * sdio@atheros.com
130214 + *
130215 + *
130216 +
130217 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
130218 +#ifndef __SDLIST_H___
130219 +#define __SDLIST_H___
130220 +
130221 +/* list functions */
130222 +/* pointers for the list */
130223 +typedef struct _SDLIST {
130224 + struct _SDLIST *pPrev;
130225 + struct _SDLIST *pNext;
130226 +}SDLIST, *PSDLIST;
130227 +/*
130228 + * SDLIST_INIT , circular list
130229 +*/
130230 +#define SDLIST_INIT(pList)\
130231 + {(pList)->pPrev = pList; (pList)->pNext = pList;}
130232 +#define SDLIST_INIT_DECLARE(List)\
130233 + SDLIST List = {&List, &List}
130234 +
130235 +
130236 +#define SDLIST_IS_EMPTY(pList) (((pList)->pPrev == (pList)) && ((pList)->pNext == (pList)))
130237 +#define SDLIST_GET_ITEM_AT_HEAD(pList) (pList)->pNext
130238 +#define SDLIST_GET_ITEM_AT_TAIL(pList) (pList)->pPrev
130239 +/*
130240 + * SDITERATE_OVER_LIST pStart is the list, pTemp is a temp list member
130241 + * NOT: do not use this function if the items in the list are deleted inside the
130242 + * iteration loop
130243 +*/
130244 +#define SDITERATE_OVER_LIST(pStart, pTemp) \
130245 + for((pTemp) =(pStart)->pNext; pTemp != (pStart); (pTemp) = (pTemp)->pNext)
130246 +
130247 +
130248 +/* safe iterate macro that allows the item to be removed from the list
130249 + * the iteration continues to the next item in the list
130250 + */
130251 +#define SDITERATE_OVER_LIST_ALLOW_REMOVE(pStart,pItem,st,offset) \
130252 +{ \
130253 + PSDLIST pTemp; \
130254 + pTemp = (pStart)->pNext; \
130255 + while (pTemp != (pStart)) { \
130256 + (pItem) = CONTAINING_STRUCT(pTemp,st,offset); \
130257 + pTemp = pTemp->pNext; \
130258 +
130259 +#define SDITERATE_END }}
130260 +
130261 +/*
130262 + * SDListInsertTail - insert pAdd to the end of the list
130263 +*/
130264 +static INLINE PSDLIST SDListInsertTail(PSDLIST pList, PSDLIST pAdd) {
130265 + /* this assert catches when an item is added twice */
130266 + DBG_ASSERT(pAdd->pNext != pList);
130267 + /* insert at tail */
130268 + pAdd->pPrev = pList->pPrev;
130269 + pAdd->pNext = pList;
130270 + pList->pPrev->pNext = pAdd;
130271 + pList->pPrev = pAdd;
130272 + return pAdd;
130273 +}
130274 +
130275 +/*
130276 + * SDListInsertHead - insert pAdd into the head of the list
130277 +*/
130278 +static INLINE PSDLIST SDListInsertHead(PSDLIST pList, PSDLIST pAdd) {
130279 + /* this assert catches when an item is added twice */
130280 + DBG_ASSERT(pAdd->pPrev != pList);
130281 + /* insert at head */
130282 + pAdd->pPrev = pList;
130283 + pAdd->pNext = pList->pNext;
130284 + pList->pNext->pPrev = pAdd;
130285 + pList->pNext = pAdd;
130286 + return pAdd;
130287 +}
130288 +
130289 +#define SDListAdd(pList,pItem) SDListInsertHead((pList),(pItem))
130290 +/*
130291 + * SDListRemove - remove pDel from list
130292 +*/
130293 +static INLINE PSDLIST SDListRemove(PSDLIST pDel) {
130294 + pDel->pNext->pPrev = pDel->pPrev;
130295 + pDel->pPrev->pNext = pDel->pNext;
130296 + /* point back to itself just to be safe, incase remove is called again */
130297 + pDel->pNext = pDel;
130298 + pDel->pPrev = pDel;
130299 + return pDel;
130300 +}
130301 +
130302 +/*
130303 + * SDListRemoveItemFromHead - get a list item from the head
130304 +*/
130305 +static INLINE PSDLIST SDListRemoveItemFromHead(PSDLIST pList) {
130306 + PSDLIST pItem = NULL;
130307 + if (pList->pNext != pList) {
130308 + pItem = pList->pNext;
130309 + /* remove the first item from head */
130310 + SDListRemove(pItem);
130311 + }
130312 + return pItem;
130313 +}
130314 +#endif /* __SDLIST_H___ */
130315 Index: linux-2.6.24.7/include/linux/spi/glamo.h
130316 ===================================================================
130317 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
130318 +++ linux-2.6.24.7/include/linux/spi/glamo.h 2008-12-11 22:46:49.000000000 +0100
130319 @@ -0,0 +1,28 @@
130320 +#ifndef __GLAMO_SPI_H
130321 +#define __GLAMO_SPI_H
130322 +
130323 +#include <linux/glamo-gpio.h>
130324 +
130325 +struct spi_board_info;
130326 +struct glamofb_handle;
130327 +struct glamo_core;
130328 +
130329 +struct glamo_spi_info {
130330 + unsigned long board_size;
130331 + struct spi_board_info *board_info;
130332 + struct glamofb_handle *glamofb_handle;
130333 +};
130334 +
130335 +struct glamo_spigpio_info {
130336 + unsigned int pin_clk;
130337 + unsigned int pin_mosi;
130338 + unsigned int pin_miso;
130339 + unsigned int pin_cs;
130340 +
130341 + unsigned int board_size;
130342 + struct spi_board_info *board_info;
130343 + struct glamo_core *glamo;
130344 +};
130345 +
130346 +
130347 +#endif
130348 Index: linux-2.6.24.7/include/linux/suspend.h
130349 ===================================================================
130350 --- linux-2.6.24.7.orig/include/linux/suspend.h 2008-12-11 22:46:07.000000000 +0100
130351 +++ linux-2.6.24.7/include/linux/suspend.h 2008-12-11 22:46:49.000000000 +0100
130352 @@ -122,6 +122,12 @@ struct pbe {
130353 struct pbe *next;
130354 };
130355
130356 +/**
130357 + * global indication we are somewhere between start of suspend and end of
130358 + * resume, nonzero is true
130359 + */
130360 +extern int global_inside_suspend;
130361 +
130362 /* mm/page_alloc.c */
130363 extern void drain_local_pages(void);
130364 extern void mark_free_pages(struct zone *zone);
130365 Index: linux-2.6.24.7/include/linux/time.h
130366 ===================================================================
130367 --- linux-2.6.24.7.orig/include/linux/time.h 2008-12-11 22:46:10.000000000 +0100
130368 +++ linux-2.6.24.7/include/linux/time.h 2008-12-11 22:48:46.000000000 +0100
130369 @@ -181,6 +181,10 @@ static inline void timespec_add_ns(struc
130370 * optimising this loop into a modulo operation. */
130371 asm("" : "+r"(ns));
130372
130373 + /* The following asm() prevents the compiler from
130374 + * optimising this loop into a modulo operation. */
130375 + asm("" : "+r"(ns));
130376 +
130377 ns -= NSEC_PER_SEC;
130378 a->tv_sec++;
130379 }
130380 Index: linux-2.6.24.7/include/linux/vt.h
130381 ===================================================================
130382 --- linux-2.6.24.7.orig/include/linux/vt.h 2008-12-11 22:46:07.000000000 +0100
130383 +++ linux-2.6.24.7/include/linux/vt.h 2008-12-11 22:46:49.000000000 +0100
130384 @@ -18,8 +18,19 @@ extern int unregister_vt_notifier(struct
130385 * resizing).
130386 */
130387 #define MIN_NR_CONSOLES 1 /* must be at least 1 */
130388 +#if (CONFIG_NR_TTY_DEVICES < 4)
130389 +/* Lower Limit */
130390 +#define MAX_NR_CONSOLES 4 /* serial lines start at 64 */
130391 +#define MAX_NR_USER_CONSOLES 4 /* must be root to allocate above this */
130392 +#elif (CONFIG_NR_TTY_DEVICES > 63)
130393 +/* Upper Limit */
130394 #define MAX_NR_CONSOLES 63 /* serial lines start at 64 */
130395 #define MAX_NR_USER_CONSOLES 63 /* must be root to allocate above this */
130396 +#else
130397 +/* They chose a sensible number */
130398 +#define MAX_NR_CONSOLES CONFIG_NR_TTY_DEVICES
130399 +#define MAX_NR_USER_CONSOLES CONFIG_NR_TTY_DEVICES
130400 +#endif
130401 /* Note: the ioctl VT_GETSTATE does not work for
130402 consoles 16 and higher (since it returns a short) */
130403
130404 Index: linux-2.6.24.7/include/sound/soc-dapm.h
130405 ===================================================================
130406 --- linux-2.6.24.7.orig/include/sound/soc-dapm.h 2008-12-11 22:46:07.000000000 +0100
130407 +++ linux-2.6.24.7/include/sound/soc-dapm.h 2008-12-11 22:46:49.000000000 +0100
130408 @@ -206,6 +206,8 @@ int snd_soc_dapm_sys_add(struct device *
130409 /* dapm audio endpoint control */
130410 int snd_soc_dapm_set_endpoint(struct snd_soc_codec *codec,
130411 char *pin, int status);
130412 +int snd_soc_dapm_get_endpoint(struct snd_soc_codec *codec,
130413 + char *pin);
130414 int snd_soc_dapm_sync_endpoints(struct snd_soc_codec *codec);
130415
130416 /* dapm widget types */
130417 Index: linux-2.6.24.7/include/sound/soc.h
130418 ===================================================================
130419 --- linux-2.6.24.7.orig/include/sound/soc.h 2008-12-11 22:46:07.000000000 +0100
130420 +++ linux-2.6.24.7/include/sound/soc.h 2008-12-11 22:46:49.000000000 +0100
130421 @@ -410,6 +410,9 @@ struct snd_soc_dai_link {
130422
130423 /* codec/machine specific init - e.g. add machine controls */
130424 int (*init)(struct snd_soc_codec *codec);
130425 +
130426 + /* DAI pcm */
130427 + struct snd_pcm *pcm;
130428 };
130429
130430 /* SoC machine */
130431 @@ -439,6 +442,7 @@ struct snd_soc_device {
130432 struct snd_soc_codec *codec;
130433 struct snd_soc_codec_device *codec_dev;
130434 struct delayed_work delayed_work;
130435 + struct work_struct deferred_resume_work;
130436 void *codec_data;
130437 };
130438
130439 Index: linux-2.6.24.7/kernel/power/main.c
130440 ===================================================================
130441 --- linux-2.6.24.7.orig/kernel/power/main.c 2008-12-11 22:46:07.000000000 +0100
130442 +++ linux-2.6.24.7/kernel/power/main.c 2008-12-11 22:46:49.000000000 +0100
130443 @@ -31,6 +31,10 @@ DEFINE_MUTEX(pm_mutex);
130444 unsigned int pm_flags;
130445 EXPORT_SYMBOL(pm_flags);
130446
130447 +int global_inside_suspend;
130448 +EXPORT_SYMBOL(global_inside_suspend);
130449 +
130450 +
130451 #ifdef CONFIG_SUSPEND
130452
130453 /* This is just an arbitrary number */
130454 @@ -156,10 +160,12 @@ int suspend_devices_and_enter(suspend_st
130455 if (!suspend_ops)
130456 return -ENOSYS;
130457
130458 + global_inside_suspend = 1;
130459 +
130460 if (suspend_ops->set_target) {
130461 error = suspend_ops->set_target(state);
130462 if (error)
130463 - return error;
130464 + goto bail;
130465 }
130466 suspend_console();
130467 error = device_suspend(PMSG_SUSPEND);
130468 @@ -183,6 +189,8 @@ int suspend_devices_and_enter(suspend_st
130469 device_resume();
130470 Resume_console:
130471 resume_console();
130472 +bail:
130473 + global_inside_suspend = 0;
130474 return error;
130475 }
130476
130477 Index: linux-2.6.24.7/kernel/printk.c
130478 ===================================================================
130479 --- linux-2.6.24.7.orig/kernel/printk.c 2008-12-11 22:46:07.000000000 +0100
130480 +++ linux-2.6.24.7/kernel/printk.c 2008-12-11 22:46:49.000000000 +0100
130481 @@ -33,8 +33,11 @@
130482 #include <linux/bootmem.h>
130483 #include <linux/syscalls.h>
130484 #include <linux/jiffies.h>
130485 +#include <linux/suspend.h>
130486
130487 #include <asm/uaccess.h>
130488 +#include <asm/plat-s3c24xx/neo1973.h>
130489 +#include <asm/arch/gta02.h>
130490
130491 #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
130492
130493 @@ -61,6 +64,12 @@ int console_printk[4] = {
130494 int oops_in_progress;
130495 EXPORT_SYMBOL(oops_in_progress);
130496
130497 +void (*printk_emergency_debug_spew_init)(void) = NULL;
130498 +EXPORT_SYMBOL(printk_emergency_debug_spew_init);
130499 +
130500 +void (*printk_emergency_debug_spew_send_string)(const char *) = NULL;
130501 +EXPORT_SYMBOL(printk_emergency_debug_spew_send_string);
130502 +
130503 /*
130504 * console_sem protects the console_drivers list, and also
130505 * provides serialisation for access to the entire console
130506 @@ -653,6 +662,38 @@ asmlinkage int vprintk(const char *fmt,
130507 /* Emit the output into the temporary buffer */
130508 printed_len = vscnprintf(printk_buf, sizeof(printk_buf), fmt, args);
130509
130510 + /* if you're debugging resume, the normal methods can change resume
130511 + * ordering behaviours because their debugging output is synchronous
130512 + * (ie, CONFIG_DEBUG_LL). If your problem is an OOPS, this code
130513 + * will not affect the speed and duration and ordering of resume
130514 + * actions, but will give you a chance to read the full undumped
130515 + * syslog AND the OOPS data when it happens
130516 + *
130517 + * if you support it, your debug device init can override the exported
130518 + * emergency_debug_spew_init and emergency_debug_spew_send_string to
130519 + * usually force polling or bitbanging on your debug console device
130520 + */
130521 + if (oops_in_progress && global_inside_suspend &&
130522 + printk_emergency_debug_spew_init &&
130523 + printk_emergency_debug_spew_send_string) {
130524 + unsigned long cur_index;
130525 + char ch[2];
130526 +
130527 + if (global_inside_suspend == 1) {
130528 + (printk_emergency_debug_spew_init)();
130529 +
130530 + ch[1] = '\0';
130531 + cur_index = con_start;
130532 + while (cur_index != log_end) {
130533 + ch[0] = LOG_BUF(cur_index);
130534 + (printk_emergency_debug_spew_send_string)(ch);
130535 + cur_index++;
130536 + }
130537 + global_inside_suspend++; /* only once */
130538 + }
130539 + (printk_emergency_debug_spew_send_string)(printk_buf);
130540 + }
130541 +
130542 /*
130543 * Copy the output into log_buf. If the caller didn't provide
130544 * appropriate log level tags, we insert them here
130545 Index: linux-2.6.24.7/MAINTAINERS
130546 ===================================================================
130547 --- linux-2.6.24.7.orig/MAINTAINERS 2008-12-11 22:46:07.000000000 +0100
130548 +++ linux-2.6.24.7/MAINTAINERS 2008-12-11 22:46:49.000000000 +0100
130549 @@ -1536,6 +1536,14 @@ P: Akinobu Mita
130550 M: akinobu.mita@gmail.com
130551 S: Supported
130552
130553 +FIC/OPENMOKO NEO1973 GSM PHONE
130554 +P: Harald Welte
130555 +M: laforge@openmoko.org
130556 +L: openmoko-kernel@lists.openmoko.org
130557 +W: http://wiki.openmoko.org/wiki/Kernel
130558 +W: http://wiki.openmoko.org/wiki/Neo1973
130559 +S: Maintained
130560 +
130561 FRAMEBUFFER LAYER
130562 P: Antonino Daplas
130563 M: adaplas@gmail.com
130564 Index: linux-2.6.24.7/makerecovery
130565 ===================================================================
130566 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
130567 +++ linux-2.6.24.7/makerecovery 2008-12-11 22:46:49.000000000 +0100
130568 @@ -0,0 +1,17 @@
130569 +#!/bin/sh
130570 +#
130571 +# make 6MB recovery image from two moredrivers type kernels
130572 +# placed at start and at +4MBytes
130573 +
130574 +if [ -z "$1" ] ; then
130575 + echo "Usage: $0 uImage-moredrivers-..."
130576 + exit 1
130577 +fi
130578 +cat $1 > recovery-$1
130579 +SIZE=`ls -l $1 | tr -s ' ' ' ' | cut -d' ' -f5`
130580 +SPACE=$(( 4 * 1024 * 1024 - $SIZE ))
130581 +dd if=/dev/zero of=_spacer bs=1 count=$SPACE
130582 +cat _spacer >> recovery-$1
130583 +rm -f _spacer
130584 +cat $1 >> recovery-$1
130585 +
130586 Index: linux-2.6.24.7/remote_install_sdcard
130587 ===================================================================
130588 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
130589 +++ linux-2.6.24.7/remote_install_sdcard 2008-12-11 22:46:49.000000000 +0100
130590 @@ -0,0 +1,20 @@
130591 +#!/bin/sh
130592 +
130593 +# automatic kernel updater and reboot - Andy Green <andy@openmoko.com>
130594 +
130595 +GTA_DEVICE_IP=192.168.0.202
130596 +GTA_MOUNTPOINT=/mnt
130597 +
130598 +# you should set up key-based auth on dropbear if you want
130599 +# to play this game.
130600 +#
130601 +# 1) mkdir /home/root/.ssh
130602 +# 2) chown root:root / /home /home/root
130603 +# 3) chmod 700 /home/root /home/root/.ssh
130604 +# 4) copy your id_*.pub into /home/root/.ssh/authorized_keys
130605 +# 5) chmod 600 /home/root/.ssh/*
130606 +
130607 +ssh root@$GTA_DEVICE_IP "mount /dev/mmcblk0p1 $GTA_MOUNTPOINT"
130608 +scp uImage.bin root@$GTA_DEVICE_IP:$GTA_MOUNTPOINT
130609 +ssh root@$GTA_DEVICE_IP "umount $GTA_MOUNTPOINT ; mount /dev/mmcblk0p2 / -oremount,ro ; reboot -if &"
130610 +
130611 Index: linux-2.6.24.7/scripts/mkuboot.sh
130612 ===================================================================
130613 --- linux-2.6.24.7.orig/scripts/mkuboot.sh 2008-12-11 22:46:07.000000000 +0100
130614 +++ linux-2.6.24.7/scripts/mkuboot.sh 2008-12-11 22:46:49.000000000 +0100
130615 @@ -11,7 +11,7 @@ if [ -z "${MKIMAGE}" ]; then
130616 if [ -z "${MKIMAGE}" ]; then
130617 # Doesn't exist
130618 echo '"mkimage" command not found - U-Boot images will not be built' >&2
130619 - exit 0;
130620 + exit 1;
130621 fi
130622 fi
130623
130624 Index: linux-2.6.24.7/sound/soc/codecs/wm8753.c
130625 ===================================================================
130626 --- linux-2.6.24.7.orig/sound/soc/codecs/wm8753.c 2008-12-11 22:46:07.000000000 +0100
130627 +++ linux-2.6.24.7/sound/soc/codecs/wm8753.c 2008-12-11 22:46:49.000000000 +0100
130628 @@ -198,6 +198,7 @@ static const char *wm8753_mic_sel[] = {"
130629 static const char *wm8753_dai_mode[] = {"DAI 0", "DAI 1", "DAI 2", "DAI 3"};
130630 static const char *wm8753_dat_sel[] = {"Stereo", "Left ADC", "Right ADC",
130631 "Channel Swap"};
130632 +static const char *wm8753_rout2_phase[] = {"Non Inverted", "Inverted"};
130633
130634 static const struct soc_enum wm8753_enum[] = {
130635 SOC_ENUM_SINGLE(WM8753_BASS, 7, 2, wm8753_base),
130636 @@ -228,6 +229,7 @@ SOC_ENUM_SINGLE(WM8753_ADC, 4, 2, wm8753
130637 SOC_ENUM_SINGLE(WM8753_MICBIAS, 6, 3, wm8753_mic_sel),
130638 SOC_ENUM_SINGLE(WM8753_IOCTL, 2, 4, wm8753_dai_mode),
130639 SOC_ENUM_SINGLE(WM8753_ADC, 7, 4, wm8753_dat_sel),
130640 +SOC_ENUM_SINGLE(WM8753_OUTCTL, 2, 2, wm8753_rout2_phase),
130641 };
130642
130643
130644 @@ -277,7 +279,7 @@ SOC_DOUBLE_R("Speaker Playback ZC Switch
130645
130646 SOC_SINGLE("Mono Bypass Playback Volume", WM8753_MOUTM1, 4, 7, 1),
130647 SOC_SINGLE("Mono Sidetone Playback Volume", WM8753_MOUTM2, 4, 7, 1),
130648 -SOC_SINGLE("Mono Voice Playback Volume", WM8753_MOUTM2, 4, 7, 1),
130649 +SOC_SINGLE("Mono Voice Playback Volume", WM8753_MOUTM2, 0, 7, 1),
130650 SOC_SINGLE("Mono Playback ZC Switch", WM8753_MOUTV, 7, 1, 0),
130651
130652 SOC_ENUM("Bass Boost", wm8753_enum[0]),
130653 @@ -328,6 +330,7 @@ SOC_SINGLE("Mic1 Capture Volume", WM8753
130654 SOC_ENUM_EXT("DAI Mode", wm8753_enum[26], wm8753_get_dai, wm8753_set_dai),
130655
130656 SOC_ENUM("ADC Data Select", wm8753_enum[27]),
130657 +SOC_ENUM("ROUT2 Phase", wm8753_enum[28]),
130658 };
130659
130660 /* add non dapm controls */
130661 @@ -1582,6 +1585,9 @@ static int wm8753_init(struct snd_soc_de
130662 schedule_delayed_work(&codec->delayed_work,
130663 msecs_to_jiffies(caps_charge));
130664
130665 + /* Fix reg WM8753_ADCTL2 */
130666 + wm8753_write(codec, WM8753_ADCTL2, 0x0000);
130667 +
130668 /* set the update bits */
130669 reg = wm8753_read_reg_cache(codec, WM8753_LDAC);
130670 wm8753_write(codec, WM8753_LDAC, reg | 0x0100);
130671 Index: linux-2.6.24.7/sound/soc/s3c24xx/Kconfig
130672 ===================================================================
130673 --- linux-2.6.24.7.orig/sound/soc/s3c24xx/Kconfig 2008-12-11 22:46:07.000000000 +0100
130674 +++ linux-2.6.24.7/sound/soc/s3c24xx/Kconfig 2008-12-11 22:46:49.000000000 +0100
130675 @@ -25,6 +25,21 @@ config SND_S3C24XX_SOC_NEO1973_WM8753
130676 Say Y if you want to add support for SoC audio on smdk2440
130677 with the WM8753.
130678
130679 +config SND_S3C24XX_SOC_NEO1973_WM8753_DEBUG
130680 + bool "SoC I2S Audio support for NEO1973 - WM8753 debug"
130681 + depends on SND_S3C24XX_SOC_NEO1973_WM8753
130682 + help
130683 + Enable debugging output for the SoC I2S Audio code.
130684 +
130685 +config SND_S3C24XX_SOC_NEO1973_GTA02_WM8753
130686 + tristate "SoC I2S Audio support for NEO1973 GTA02 - WM8753"
130687 + depends on SND_S3C24XX_SOC && MACH_NEO1973_GTA02
130688 + select SND_S3C24XX_SOC_I2S
130689 + select SND_SOC_WM8753
130690 + help
130691 + Say Y if you want to add support for SoC audio on neo1973 gta02
130692 + with the WM8753 codec
130693 +
130694 config SND_S3C24XX_SOC_SMDK2443_WM9710
130695 tristate "SoC AC97 Audio support for SMDK2443 - WM9710"
130696 depends on SND_S3C24XX_SOC && MACH_SMDK2443
130697 Index: linux-2.6.24.7/sound/soc/s3c24xx/Makefile
130698 ===================================================================
130699 --- linux-2.6.24.7.orig/sound/soc/s3c24xx/Makefile 2008-12-11 22:46:07.000000000 +0100
130700 +++ linux-2.6.24.7/sound/soc/s3c24xx/Makefile 2008-12-11 22:46:49.000000000 +0100
130701 @@ -10,6 +10,9 @@ obj-$(CONFIG_SND_S3C2443_SOC_AC97) += sn
130702 # S3C24XX Machine Support
130703 snd-soc-neo1973-wm8753-objs := neo1973_wm8753.o
130704 snd-soc-smdk2443-wm9710-objs := smdk2443_wm9710.o
130705 +snd-soc-neo1973-gta02-wm8753-objs := neo1973_gta02_wm8753.o
130706
130707 obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o
130708 obj-$(CONFIG_SND_S3C24XX_SOC_SMDK2443_WM9710) += snd-soc-smdk2443-wm9710.o
130709 +obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_GTA02_WM8753) += snd-soc-neo1973-gta02-wm8753.o
130710 +
130711 Index: linux-2.6.24.7/sound/soc/s3c24xx/neo1973_gta02_wm8753.c
130712 ===================================================================
130713 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
130714 +++ linux-2.6.24.7/sound/soc/s3c24xx/neo1973_gta02_wm8753.c 2008-12-11 22:46:49.000000000 +0100
130715 @@ -0,0 +1,667 @@
130716 +/*
130717 + * neo1973_gta02_wm8753.c -- SoC audio for Neo1973
130718 + *
130719 + * Copyright 2007 Openmoko Inc
130720 + * Author: Graeme Gregory <graeme@openmoko.org>
130721 + * Copyright 2007 Wolfson Microelectronics PLC.
130722 + * Author: Graeme Gregory <linux@wolfsonmicro.com>
130723 + *
130724 + * This program is free software; you can redistribute it and/or modify it
130725 + * under the terms of the GNU General Public License as published by the
130726 + * Free Software Foundation; either version 2 of the License, or (at your
130727 + * option) any later version.
130728 + *
130729 + * Revision history
130730 + * 06th Nov 2007 Changed from GTA01 to GTA02
130731 + * 20th Jan 2007 Initial version.
130732 + * 05th Feb 2007 Rename all to Neo1973
130733 + *
130734 + */
130735 +
130736 +#include <linux/module.h>
130737 +#include <linux/moduleparam.h>
130738 +#include <linux/timer.h>
130739 +#include <linux/interrupt.h>
130740 +#include <linux/platform_device.h>
130741 +#include <linux/i2c.h>
130742 +#include <sound/driver.h>
130743 +#include <sound/core.h>
130744 +#include <sound/pcm.h>
130745 +#include <sound/soc.h>
130746 +#include <sound/soc-dapm.h>
130747 +
130748 +#include <asm/mach-types.h>
130749 +#include <asm/hardware/scoop.h>
130750 +#include <asm/plat-s3c24xx/regs-iis.h>
130751 +#include <asm/arch/regs-clock.h>
130752 +#include <asm/arch/regs-gpio.h>
130753 +#include <asm/hardware.h>
130754 +#include <asm/arch/audio.h>
130755 +#include <asm/io.h>
130756 +#include <asm/arch/spi-gpio.h>
130757 +#include <asm/arch/regs-gpioj.h>
130758 +#include <asm/arch/gta02.h>
130759 +#include "../codecs/wm8753.h"
130760 +#include "s3c24xx-pcm.h"
130761 +#include "s3c24xx-i2s.h"
130762 +
130763 +/* define the scenarios */
130764 +#define NEO_AUDIO_OFF 0
130765 +#define NEO_GSM_CALL_AUDIO_HANDSET 1
130766 +#define NEO_GSM_CALL_AUDIO_HEADSET 2
130767 +#define NEO_GSM_CALL_AUDIO_BLUETOOTH 3
130768 +#define NEO_STEREO_TO_SPEAKERS 4
130769 +#define NEO_STEREO_TO_HEADPHONES 5
130770 +#define NEO_CAPTURE_HANDSET 6
130771 +#define NEO_CAPTURE_HEADSET 7
130772 +#define NEO_CAPTURE_BLUETOOTH 8
130773 +#define NEO_STEREO_TO_HANDSET_SPK 9
130774 +
130775 +static struct snd_soc_machine neo1973_gta02;
130776 +
130777 +static int neo1973_gta02_hifi_hw_params(struct snd_pcm_substream *substream,
130778 + struct snd_pcm_hw_params *params)
130779 +{
130780 + struct snd_soc_pcm_runtime *rtd = substream->private_data;
130781 + struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai;
130782 + struct snd_soc_cpu_dai *cpu_dai = rtd->dai->cpu_dai;
130783 + unsigned int pll_out = 0, bclk = 0;
130784 + int ret = 0;
130785 + unsigned long iis_clkrate;
130786 +
130787 + iis_clkrate = s3c24xx_i2s_get_clockrate();
130788 +
130789 + switch (params_rate(params)) {
130790 + case 8000:
130791 + case 16000:
130792 + pll_out = 12288000;
130793 + break;
130794 + case 48000:
130795 + bclk = WM8753_BCLK_DIV_4;
130796 + pll_out = 12288000;
130797 + break;
130798 + case 96000:
130799 + bclk = WM8753_BCLK_DIV_2;
130800 + pll_out = 12288000;
130801 + break;
130802 + case 11025:
130803 + bclk = WM8753_BCLK_DIV_16;
130804 + pll_out = 11289600;
130805 + break;
130806 + case 22050:
130807 + bclk = WM8753_BCLK_DIV_8;
130808 + pll_out = 11289600;
130809 + break;
130810 + case 44100:
130811 + bclk = WM8753_BCLK_DIV_4;
130812 + pll_out = 11289600;
130813 + break;
130814 + case 88200:
130815 + bclk = WM8753_BCLK_DIV_2;
130816 + pll_out = 11289600;
130817 + break;
130818 + }
130819 +
130820 + /* set codec DAI configuration */
130821 + ret = codec_dai->dai_ops.set_fmt(codec_dai,
130822 + SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
130823 + SND_SOC_DAIFMT_CBM_CFM);
130824 + if (ret < 0)
130825 + return ret;
130826 +
130827 + /* set cpu DAI configuration */
130828 + ret = cpu_dai->dai_ops.set_fmt(cpu_dai,
130829 + SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
130830 + SND_SOC_DAIFMT_CBM_CFM);
130831 + if (ret < 0)
130832 + return ret;
130833 +
130834 + /* set the codec system clock for DAC and ADC */
130835 + ret = codec_dai->dai_ops.set_sysclk(codec_dai, WM8753_MCLK, pll_out,
130836 + SND_SOC_CLOCK_IN);
130837 + if (ret < 0)
130838 + return ret;
130839 +
130840 + /* set MCLK division for sample rate */
130841 + ret = cpu_dai->dai_ops.set_clkdiv(cpu_dai, S3C24XX_DIV_MCLK,
130842 + S3C2410_IISMOD_32FS );
130843 + if (ret < 0)
130844 + return ret;
130845 +
130846 + /* set codec BCLK division for sample rate */
130847 + ret = codec_dai->dai_ops.set_clkdiv(codec_dai,
130848 + WM8753_BCLKDIV, bclk);
130849 + if (ret < 0)
130850 + return ret;
130851 +
130852 + /* set prescaler division for sample rate */
130853 + ret = cpu_dai->dai_ops.set_clkdiv(cpu_dai, S3C24XX_DIV_PRESCALER,
130854 + S3C24XX_PRESCALE(4,4));
130855 + if (ret < 0)
130856 + return ret;
130857 +
130858 + /* codec PLL input is PCLK/4 */
130859 + ret = codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL1,
130860 + iis_clkrate / 4, pll_out);
130861 + if (ret < 0)
130862 + return ret;
130863 +
130864 + return 0;
130865 +}
130866 +
130867 +static int neo1973_gta02_hifi_hw_free(struct snd_pcm_substream *substream)
130868 +{
130869 + struct snd_soc_pcm_runtime *rtd = substream->private_data;
130870 + struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai;
130871 +
130872 + /* disable the PLL */
130873 + return codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL1, 0, 0);
130874 +}
130875 +
130876 +/*
130877 + * Neo1973 WM8753 HiFi DAI opserations.
130878 + */
130879 +static struct snd_soc_ops neo1973_gta02_hifi_ops = {
130880 + .hw_params = neo1973_gta02_hifi_hw_params,
130881 + .hw_free = neo1973_gta02_hifi_hw_free,
130882 +};
130883 +
130884 +static int neo1973_gta02_voice_hw_params(
130885 + struct snd_pcm_substream *substream,
130886 + struct snd_pcm_hw_params *params)
130887 +{
130888 + struct snd_soc_pcm_runtime *rtd = substream->private_data;
130889 + struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai;
130890 + unsigned int pcmdiv = 0;
130891 + int ret = 0;
130892 + unsigned long iis_clkrate;
130893 +
130894 + iis_clkrate = s3c24xx_i2s_get_clockrate();
130895 +
130896 + if (params_rate(params) != 8000)
130897 + return -EINVAL;
130898 + if (params_channels(params) != 1)
130899 + return -EINVAL;
130900 +
130901 + pcmdiv = WM8753_PCM_DIV_6; /* 2.048 MHz */
130902 +
130903 + /* todo: gg check mode (DSP_B) against CSR datasheet */
130904 + /* set codec DAI configuration */
130905 + ret = codec_dai->dai_ops.set_fmt(codec_dai, SND_SOC_DAIFMT_DSP_B |
130906 + SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_CBS_CFS);
130907 + if (ret < 0)
130908 + return ret;
130909 +
130910 + /* set the codec system clock for DAC and ADC */
130911 + ret = codec_dai->dai_ops.set_sysclk(codec_dai, WM8753_PCMCLK,
130912 + 12288000, SND_SOC_CLOCK_IN);
130913 + if (ret < 0)
130914 + return ret;
130915 +
130916 + /* set codec PCM division for sample rate */
130917 + ret = codec_dai->dai_ops.set_clkdiv(codec_dai, WM8753_PCMDIV,
130918 + pcmdiv);
130919 + if (ret < 0)
130920 + return ret;
130921 +
130922 + /* configue and enable PLL for 12.288MHz output */
130923 + ret = codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL2,
130924 + iis_clkrate / 4, 12288000);
130925 + if (ret < 0)
130926 + return ret;
130927 +
130928 + return 0;
130929 +}
130930 +
130931 +static int neo1973_gta02_voice_hw_free(struct snd_pcm_substream *substream)
130932 +{
130933 + struct snd_soc_pcm_runtime *rtd = substream->private_data;
130934 + struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai;
130935 +
130936 + /* disable the PLL */
130937 + return codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL2, 0, 0);
130938 +}
130939 +
130940 +static struct snd_soc_ops neo1973_gta02_voice_ops = {
130941 + .hw_params = neo1973_gta02_voice_hw_params,
130942 + .hw_free = neo1973_gta02_voice_hw_free,
130943 +};
130944 +
130945 +#define LM4853_AMP 1
130946 +#define LM4853_SPK 2
130947 +
130948 +static u8 lm4853_state=0;
130949 +
130950 +static int lm4853_set_state(struct snd_kcontrol *kcontrol,
130951 + struct snd_ctl_elem_value *ucontrol)
130952 +{
130953 + int val = ucontrol->value.integer.value[0];
130954 +
130955 + if(val) {
130956 + lm4853_state |= LM4853_AMP;
130957 + s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT,0);
130958 + } else {
130959 + lm4853_state &= ~LM4853_AMP;
130960 + s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT,1);
130961 + }
130962 +
130963 + return 0;
130964 +}
130965 +
130966 +static int lm4853_get_state(struct snd_kcontrol *kcontrol,
130967 + struct snd_ctl_elem_value *ucontrol)
130968 +{
130969 + ucontrol->value.integer.value[0] = lm4853_state & LM4853_AMP;
130970 +
130971 + return 0;
130972 +}
130973 +
130974 +static int lm4853_set_spk(struct snd_kcontrol *kcontrol,
130975 + struct snd_ctl_elem_value *ucontrol)
130976 +{
130977 + int val = ucontrol->value.integer.value[0];
130978 +
130979 + if(val) {
130980 + lm4853_state |= LM4853_SPK;
130981 + s3c2410_gpio_setpin(GTA02_GPIO_HP_IN,0);
130982 + } else {
130983 + lm4853_state &= ~LM4853_SPK;
130984 + s3c2410_gpio_setpin(GTA02_GPIO_HP_IN,1);
130985 + }
130986 +
130987 + return 0;
130988 +}
130989 +
130990 +static int lm4853_get_spk(struct snd_kcontrol *kcontrol,
130991 + struct snd_ctl_elem_value *ucontrol)
130992 +{
130993 + ucontrol->value.integer.value[0] = (lm4853_state & LM4853_SPK) >> 1;
130994 +
130995 + return 0;
130996 +}
130997 +
130998 +static int neo1973_gta02_set_stereo_out(struct snd_kcontrol *kcontrol,
130999 + struct snd_ctl_elem_value *ucontrol)
131000 +{
131001 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131002 + int val = ucontrol->value.integer.value[0];
131003 +
131004 + snd_soc_dapm_set_endpoint(codec, "Stereo Out", val);
131005 +
131006 + snd_soc_dapm_sync_endpoints(codec);
131007 +
131008 + return 0;
131009 +}
131010 +
131011 +static int neo1973_gta02_get_stereo_out(struct snd_kcontrol *kcontrol,
131012 + struct snd_ctl_elem_value *ucontrol)
131013 +{
131014 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131015 +
131016 + ucontrol->value.integer.value[0] =
131017 + snd_soc_dapm_get_endpoint(codec, "Stereo Out");
131018 +
131019 + return 0;
131020 +}
131021 +
131022 +
131023 +static int neo1973_gta02_set_gsm_out(struct snd_kcontrol *kcontrol,
131024 + struct snd_ctl_elem_value *ucontrol)
131025 +{
131026 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131027 + int val = ucontrol->value.integer.value[0];
131028 +
131029 + snd_soc_dapm_set_endpoint(codec, "GSM Line Out", val);
131030 +
131031 + snd_soc_dapm_sync_endpoints(codec);
131032 +
131033 + return 0;
131034 +}
131035 +
131036 +static int neo1973_gta02_get_gsm_out(struct snd_kcontrol *kcontrol,
131037 + struct snd_ctl_elem_value *ucontrol)
131038 +{
131039 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131040 +
131041 + ucontrol->value.integer.value[0] =
131042 + snd_soc_dapm_get_endpoint(codec, "GSM Line Out");
131043 +
131044 + return 0;
131045 +}
131046 +
131047 +static int neo1973_gta02_set_gsm_in(struct snd_kcontrol *kcontrol,
131048 + struct snd_ctl_elem_value *ucontrol)
131049 +{
131050 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131051 + int val = ucontrol->value.integer.value[0];
131052 +
131053 + snd_soc_dapm_set_endpoint(codec, "GSM Line In", val);
131054 +
131055 + snd_soc_dapm_sync_endpoints(codec);
131056 +
131057 + return 0;
131058 +}
131059 +
131060 +static int neo1973_gta02_get_gsm_in(struct snd_kcontrol *kcontrol,
131061 + struct snd_ctl_elem_value *ucontrol)
131062 +{
131063 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131064 +
131065 + ucontrol->value.integer.value[0] =
131066 + snd_soc_dapm_get_endpoint(codec, "GSM Line In");
131067 +
131068 + return 0;
131069 +}
131070 +
131071 +static int neo1973_gta02_set_headset_mic(struct snd_kcontrol *kcontrol,
131072 + struct snd_ctl_elem_value *ucontrol)
131073 +{
131074 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131075 + int val = ucontrol->value.integer.value[0];
131076 +
131077 + snd_soc_dapm_set_endpoint(codec, "Headset Mic", val);
131078 +
131079 + snd_soc_dapm_sync_endpoints(codec);
131080 +
131081 + return 0;
131082 +}
131083 +
131084 +static int neo1973_gta02_get_headset_mic(struct snd_kcontrol *kcontrol,
131085 + struct snd_ctl_elem_value *ucontrol)
131086 +{
131087 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131088 +
131089 + ucontrol->value.integer.value[0] =
131090 + snd_soc_dapm_get_endpoint(codec, "Headset Mic");
131091 +
131092 + return 0;
131093 +}
131094 +
131095 +static int neo1973_gta02_set_handset_mic(struct snd_kcontrol *kcontrol,
131096 + struct snd_ctl_elem_value *ucontrol)
131097 +{
131098 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131099 + int val = ucontrol->value.integer.value[0];
131100 +
131101 + snd_soc_dapm_set_endpoint(codec, "Handset Mic", val);
131102 +
131103 + snd_soc_dapm_sync_endpoints(codec);
131104 +
131105 + return 0;
131106 +}
131107 +
131108 +static int neo1973_gta02_get_handset_mic(struct snd_kcontrol *kcontrol,
131109 + struct snd_ctl_elem_value *ucontrol)
131110 +{
131111 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131112 +
131113 + ucontrol->value.integer.value[0] =
131114 + snd_soc_dapm_get_endpoint(codec, "Handset Mic");
131115 +
131116 + return 0;
131117 +}
131118 +
131119 +static int neo1973_gta02_set_handset_spk(struct snd_kcontrol *kcontrol,
131120 + struct snd_ctl_elem_value *ucontrol)
131121 +{
131122 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131123 + int val = ucontrol->value.integer.value[0];
131124 +
131125 + snd_soc_dapm_set_endpoint(codec, "Handset Spk", val);
131126 +
131127 + snd_soc_dapm_sync_endpoints(codec);
131128 +
131129 + return 0;
131130 +}
131131 +
131132 +static int neo1973_gta02_get_handset_spk(struct snd_kcontrol *kcontrol,
131133 + struct snd_ctl_elem_value *ucontrol)
131134 +{
131135 + struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131136 +
131137 + ucontrol->value.integer.value[0] =
131138 + snd_soc_dapm_get_endpoint(codec, "Handset Spk");
131139 +
131140 + return 0;
131141 +}
131142 +
131143 +static const struct snd_soc_dapm_widget wm8753_dapm_widgets[] = {
131144 + SND_SOC_DAPM_LINE("Stereo Out", NULL),
131145 + SND_SOC_DAPM_LINE("GSM Line Out", NULL),
131146 + SND_SOC_DAPM_LINE("GSM Line In", NULL),
131147 + SND_SOC_DAPM_MIC("Headset Mic", NULL),
131148 + SND_SOC_DAPM_MIC("Handset Mic", NULL),
131149 + SND_SOC_DAPM_SPK("Handset Spk", NULL),
131150 +};
131151 +
131152 +
131153 +/* example machine audio_mapnections */
131154 +static const char* audio_map[][3] = {
131155 +
131156 + /* Connections to the lm4853 amp */
131157 + {"Stereo Out", NULL, "LOUT1"},
131158 + {"Stereo Out", NULL, "ROUT1"},
131159 +
131160 + /* Connections to the GSM Module */
131161 + {"GSM Line Out", NULL, "MONO1"},
131162 + {"GSM Line Out", NULL, "MONO2"},
131163 + {"RXP", NULL, "GSM Line In"},
131164 + {"RXN", NULL, "GSM Line In"},
131165 +
131166 + /* Connections to Headset */
131167 + {"MIC1", NULL, "Mic Bias"},
131168 + {"Mic Bias", NULL, "Headset Mic"},
131169 +
131170 + /* Call Mic */
131171 + {"MIC2", NULL, "Mic Bias"},
131172 + {"MIC2N", NULL, "Mic Bias"},
131173 + {"Mic Bias", NULL, "Handset Mic"},
131174 +
131175 + /* Call Speaker */
131176 + {"Handset Spk", NULL, "LOUT2"},
131177 + {"Handset Spk", NULL, "ROUT2"},
131178 +
131179 + /* Connect the ALC pins */
131180 + {"ACIN", NULL, "ACOP"},
131181 +
131182 + {NULL, NULL, NULL},
131183 +};
131184 +
131185 +static const struct snd_kcontrol_new wm8753_neo1973_gta02_controls[] = {
131186 + SOC_SINGLE_EXT("DAPM Stereo Out Switch", 0, 0, 1, 0,
131187 + neo1973_gta02_get_stereo_out,
131188 + neo1973_gta02_set_stereo_out),
131189 + SOC_SINGLE_EXT("DAPM GSM Line Out Switch", 1, 0, 1, 0,
131190 + neo1973_gta02_get_gsm_out,
131191 + neo1973_gta02_set_gsm_out),
131192 + SOC_SINGLE_EXT("DAPM GSM Line In Switch", 2, 0, 1, 0,
131193 + neo1973_gta02_get_gsm_in,
131194 + neo1973_gta02_set_gsm_in),
131195 + SOC_SINGLE_EXT("DAPM Headset Mic Switch", 3, 0, 1, 0,
131196 + neo1973_gta02_get_headset_mic,
131197 + neo1973_gta02_set_headset_mic),
131198 + SOC_SINGLE_EXT("DAPM Handset Mic Switch", 4, 0, 1, 0,
131199 + neo1973_gta02_get_handset_mic,
131200 + neo1973_gta02_set_handset_mic),
131201 + SOC_SINGLE_EXT("DAPM Handset Spk Switch", 5, 0, 1, 0,
131202 + neo1973_gta02_get_handset_spk,
131203 + neo1973_gta02_set_handset_spk),
131204 + SOC_SINGLE_EXT("Amp State Switch", 6, 0, 1, 0,
131205 + lm4853_get_state,
131206 + lm4853_set_state),
131207 + SOC_SINGLE_EXT("Amp Spk Switch", 7, 0, 1, 0,
131208 + lm4853_get_spk,
131209 + lm4853_set_spk),
131210 +};
131211 +
131212 +/*
131213 + * This is an example machine initialisation for a wm8753 connected to a
131214 + * neo1973 GTA02.
131215 + */
131216 +static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec)
131217 +{
131218 + int i, err;
131219 +
131220 + /* set up NC codec pins */
131221 + snd_soc_dapm_set_endpoint(codec, "OUT3", 0);
131222 + snd_soc_dapm_set_endpoint(codec, "OUT4", 0);
131223 + snd_soc_dapm_set_endpoint(codec, "LINE1", 0);
131224 + snd_soc_dapm_set_endpoint(codec, "LINE2", 0);
131225 +
131226 + /* Add neo1973 gta02 specific widgets */
131227 + for (i = 0; i < ARRAY_SIZE(wm8753_dapm_widgets); i++)
131228 + snd_soc_dapm_new_control(codec, &wm8753_dapm_widgets[i]);
131229 +
131230 + /* add neo1973 gta02 specific controls */
131231 + for (i = 0; i < ARRAY_SIZE(wm8753_neo1973_gta02_controls); i++) {
131232 + err = snd_ctl_add(codec->card,
131233 + snd_soc_cnew(&wm8753_neo1973_gta02_controls[i],
131234 + codec, NULL));
131235 + if (err < 0)
131236 + return err;
131237 + }
131238 +
131239 + /* set up neo1973 gta02 specific audio path audio_mapnects */
131240 + for (i = 0; audio_map[i][0] != NULL; i++) {
131241 + snd_soc_dapm_connect_input(codec, audio_map[i][0],
131242 + audio_map[i][1], audio_map[i][2]);
131243 + }
131244 +
131245 + /* set endpoints to default off mode */
131246 + snd_soc_dapm_set_endpoint(codec, "Stereo Out", 0);
131247 + snd_soc_dapm_set_endpoint(codec, "GSM Line Out",0);
131248 + snd_soc_dapm_set_endpoint(codec, "GSM Line In", 0);
131249 + snd_soc_dapm_set_endpoint(codec, "Headset Mic", 0);
131250 + snd_soc_dapm_set_endpoint(codec, "Handset Mic", 0);
131251 + snd_soc_dapm_set_endpoint(codec, "Handset Spk", 0);
131252 +
131253 + snd_soc_dapm_sync_endpoints(codec);
131254 + return 0;
131255 +}
131256 +
131257 +/*
131258 + * BT Codec DAI
131259 + */
131260 +static struct snd_soc_cpu_dai bt_dai =
131261 +{ .name = "Bluetooth",
131262 + .id = 0,
131263 + .type = SND_SOC_DAI_PCM,
131264 + .playback = {
131265 + .channels_min = 1,
131266 + .channels_max = 1,
131267 + .rates = SNDRV_PCM_RATE_8000,
131268 + .formats = SNDRV_PCM_FMTBIT_S16_LE,},
131269 + .capture = {
131270 + .channels_min = 1,
131271 + .channels_max = 1,
131272 + .rates = SNDRV_PCM_RATE_8000,
131273 + .formats = SNDRV_PCM_FMTBIT_S16_LE,},
131274 +};
131275 +
131276 +static struct snd_soc_dai_link neo1973_gta02_dai[] = {
131277 +{ /* Hifi Playback - for similatious use with voice below */
131278 + .name = "WM8753",
131279 + .stream_name = "WM8753 HiFi",
131280 + .cpu_dai = &s3c24xx_i2s_dai,
131281 + .codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
131282 + .init = neo1973_gta02_wm8753_init,
131283 + .ops = &neo1973_gta02_hifi_ops,
131284 +},
131285 +{ /* Voice via BT */
131286 + .name = "Bluetooth",
131287 + .stream_name = "Voice",
131288 + .cpu_dai = &bt_dai,
131289 + .codec_dai = &wm8753_dai[WM8753_DAI_VOICE],
131290 + .ops = &neo1973_gta02_voice_ops,
131291 +},
131292 +};
131293 +
131294 +#ifdef CONFIG_PM
131295 +int neo1973_gta02_suspend(struct platform_device *pdev, pm_message_t state)
131296 +{
131297 + s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 1);
131298 +
131299 + return 0;
131300 +}
131301 +
131302 +int neo1973_gta02_resume(struct platform_device *pdev)
131303 +{
131304 + if(lm4853_state & LM4853_AMP)
131305 + s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 0);
131306 +
131307 + return 0;
131308 +}
131309 +#else
131310 +#define neo1973_gta02_suspend NULL
131311 +#define neo1973_gta02_resume NULL
131312 +#endif
131313 +
131314 +static struct snd_soc_machine neo1973_gta02 = {
131315 + .name = "neo1973-gta02",
131316 + .suspend_pre = neo1973_gta02_suspend,
131317 + .resume_post = neo1973_gta02_resume,
131318 + .dai_link = neo1973_gta02_dai,
131319 + .num_links = ARRAY_SIZE(neo1973_gta02_dai),
131320 +};
131321 +
131322 +static struct wm8753_setup_data neo1973_gta02_wm8753_setup = {
131323 + .i2c_address = 0x1a,
131324 +};
131325 +
131326 +static struct snd_soc_device neo1973_gta02_snd_devdata = {
131327 + .machine = &neo1973_gta02,
131328 + .platform = &s3c24xx_soc_platform,
131329 + .codec_dev = &soc_codec_dev_wm8753,
131330 + .codec_data = &neo1973_gta02_wm8753_setup,
131331 +};
131332 +
131333 +static struct platform_device *neo1973_gta02_snd_device;
131334 +
131335 +static int __init neo1973_gta02_init(void)
131336 +{
131337 + int ret;
131338 +
131339 + if (!machine_is_neo1973_gta02()) {
131340 + printk(KERN_INFO
131341 + "Only GTA02 hardware supported by ASoc driver\n");
131342 + return -ENODEV;
131343 + }
131344 +
131345 + neo1973_gta02_snd_device = platform_device_alloc("soc-audio", -1);
131346 + if (!neo1973_gta02_snd_device)
131347 + return -ENOMEM;
131348 +
131349 + platform_set_drvdata(neo1973_gta02_snd_device,
131350 + &neo1973_gta02_snd_devdata);
131351 + neo1973_gta02_snd_devdata.dev = &neo1973_gta02_snd_device->dev;
131352 + ret = platform_device_add(neo1973_gta02_snd_device);
131353 +
131354 + if (ret)
131355 + platform_device_put(neo1973_gta02_snd_device);
131356 +
131357 + /* Initialise GPIOs used by amp */
131358 + s3c2410_gpio_cfgpin(GTA02_GPIO_HP_IN, S3C2410_GPIO_OUTPUT);
131359 + s3c2410_gpio_cfgpin(GTA02_GPIO_AMP_SHUT, S3C2410_GPIO_OUTPUT);
131360 +
131361 + /* Amp off by default */
131362 + s3c2410_gpio_setpin(GTA02_GPIO_AMP_SHUT, 1);
131363 +
131364 + /* Speaker off by default */
131365 + s3c2410_gpio_setpin(GTA02_GPIO_HP_IN, 1);
131366 +
131367 + return ret;
131368 +}
131369 +
131370 +static void __exit neo1973_gta02_exit(void)
131371 +{
131372 + platform_device_unregister(neo1973_gta02_snd_device);
131373 +}
131374 +
131375 +module_init(neo1973_gta02_init);
131376 +module_exit(neo1973_gta02_exit);
131377 +
131378 +/* Module information */
131379 +MODULE_AUTHOR("Graeme Gregory, graeme@openmoko.org");
131380 +MODULE_DESCRIPTION("ALSA SoC WM8753 Neo1973 GTA02");
131381 +MODULE_LICENSE("GPL");
131382 +
131383 Index: linux-2.6.24.7/sound/soc/s3c24xx/neo1973_wm8753.c
131384 ===================================================================
131385 --- linux-2.6.24.7.orig/sound/soc/s3c24xx/neo1973_wm8753.c 2008-12-11 22:46:07.000000000 +0100
131386 +++ linux-2.6.24.7/sound/soc/s3c24xx/neo1973_wm8753.c 2008-12-11 22:46:49.000000000 +0100
131387 @@ -30,18 +30,29 @@
131388
131389 #include <asm/mach-types.h>
131390 #include <asm/hardware/scoop.h>
131391 -#include <asm/arch/regs-iis.h>
131392 #include <asm/arch/regs-clock.h>
131393 #include <asm/arch/regs-gpio.h>
131394 #include <asm/hardware.h>
131395 #include <asm/arch/audio.h>
131396 #include <asm/io.h>
131397 #include <asm/arch/spi-gpio.h>
131398 +
131399 +#include <asm/plat-s3c24xx/regs-iis.h>
131400 +
131401 #include "../codecs/wm8753.h"
131402 #include "lm4857.h"
131403 #include "s3c24xx-pcm.h"
131404 #include "s3c24xx-i2s.h"
131405
131406 +/* Debugging stuff */
131407 +#ifdef SND_S3C24XX_SOC_NEO1973_WM8753_DEBUG
131408 +static int debug = 1;
131409 +#else
131410 +static int debug = 0;
131411 +#endif
131412 +
131413 +#define dprintk(msg...) if (debug) { printk(KERN_DEBUG "wm8753: " msg); }
131414 +
131415 /* define the scenarios */
131416 #define NEO_AUDIO_OFF 0
131417 #define NEO_GSM_CALL_AUDIO_HANDSET 1
131418 @@ -66,6 +77,8 @@ static int neo1973_hifi_hw_params(struct
131419 int ret = 0;
131420 unsigned long iis_clkrate;
131421
131422 + dprintk("Entered %s\n", __FUNCTION__);
131423 +
131424 iis_clkrate = s3c24xx_i2s_get_clockrate();
131425
131426 switch (params_rate(params)) {
131427 @@ -150,6 +163,8 @@ static int neo1973_hifi_hw_free(struct s
131428 struct snd_soc_pcm_runtime *rtd = substream->private_data;
131429 struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai;
131430
131431 + dprintk("Entered %s\n", __FUNCTION__);
131432 +
131433 /* disable the PLL */
131434 return codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL1, 0, 0);
131435 }
131436 @@ -171,6 +186,8 @@ static int neo1973_voice_hw_params(struc
131437 int ret = 0;
131438 unsigned long iis_clkrate;
131439
131440 + dprintk("Entered %s\n", __FUNCTION__);
131441 +
131442 iis_clkrate = s3c24xx_i2s_get_clockrate();
131443
131444 if (params_rate(params) != 8000)
131445 @@ -212,6 +229,8 @@ static int neo1973_voice_hw_free(struct
131446 struct snd_soc_pcm_runtime *rtd = substream->private_data;
131447 struct snd_soc_codec_dai *codec_dai = rtd->dai->codec_dai;
131448
131449 + dprintk("Entered %s\n", __FUNCTION__);
131450 +
131451 /* disable the PLL */
131452 return codec_dai->dai_ops.set_pll(codec_dai, WM8753_PLL2, 0, 0);
131453 }
131454 @@ -226,12 +245,16 @@ static int neo1973_scenario = 0;
131455 static int neo1973_get_scenario(struct snd_kcontrol *kcontrol,
131456 struct snd_ctl_elem_value *ucontrol)
131457 {
131458 + dprintk("Entered %s\n", __FUNCTION__);
131459 +
131460 ucontrol->value.integer.value[0] = neo1973_scenario;
131461 return 0;
131462 }
131463
131464 static int set_scenario_endpoints(struct snd_soc_codec *codec, int scenario)
131465 {
131466 + dprintk("Entered %s\n", __FUNCTION__);
131467 +
131468 switch(neo1973_scenario) {
131469 case NEO_AUDIO_OFF:
131470 snd_soc_dapm_set_endpoint(codec, "Audio Out", 0);
131471 @@ -314,6 +337,8 @@ static int neo1973_set_scenario(struct s
131472 {
131473 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
131474
131475 + dprintk("Entered %s\n", __FUNCTION__);
131476 +
131477 if (neo1973_scenario == ucontrol->value.integer.value[0])
131478 return 0;
131479
131480 @@ -326,6 +351,8 @@ static u8 lm4857_regs[4] = {0x00, 0x40,
131481
131482 static void lm4857_write_regs(void)
131483 {
131484 + dprintk("Entered %s\n", __FUNCTION__);
131485 +
131486 if (i2c_master_send(i2c, lm4857_regs, 4) != 4)
131487 printk(KERN_ERR "lm4857: i2c write failed\n");
131488 }
131489 @@ -337,6 +364,8 @@ static int lm4857_get_reg(struct snd_kco
131490 int shift = (kcontrol->private_value >> 8) & 0x0F;
131491 int mask = (kcontrol->private_value >> 16) & 0xFF;
131492
131493 + dprintk("Entered %s\n", __FUNCTION__);
131494 +
131495 ucontrol->value.integer.value[0] = (lm4857_regs[reg] >> shift) & mask;
131496 return 0;
131497 }
131498 @@ -348,6 +377,8 @@ static int lm4857_set_reg(struct snd_kco
131499 int shift = (kcontrol->private_value >> 8) & 0x0F;
131500 int mask = (kcontrol->private_value >> 16) & 0xFF;
131501
131502 + dprintk("Entered %s\n", __FUNCTION__);
131503 +
131504 if (((lm4857_regs[reg] >> shift ) & mask) ==
131505 ucontrol->value.integer.value[0])
131506 return 0;
131507 @@ -363,6 +394,8 @@ static int lm4857_get_mode(struct snd_kc
131508 {
131509 u8 value = lm4857_regs[LM4857_CTRL] & 0x0F;
131510
131511 + dprintk("Entered %s\n", __FUNCTION__);
131512 +
131513 if (value)
131514 value -= 5;
131515
131516 @@ -375,6 +408,8 @@ static int lm4857_set_mode(struct snd_kc
131517 {
131518 u8 value = ucontrol->value.integer.value[0];
131519
131520 + dprintk("Entered %s\n", __FUNCTION__);
131521 +
131522 if (value)
131523 value += 5;
131524
131525 @@ -482,6 +517,8 @@ static int neo1973_wm8753_init(struct sn
131526 {
131527 int i, err;
131528
131529 + dprintk("Entered %s\n", __FUNCTION__);
131530 +
131531 /* set up NC codec pins */
131532 snd_soc_dapm_set_endpoint(codec, "LOUT2", 0);
131533 snd_soc_dapm_set_endpoint(codec, "ROUT2", 0);
131534 @@ -582,6 +619,8 @@ static int lm4857_amp_probe(struct i2c_a
131535 {
131536 int ret;
131537
131538 + dprintk("Entered %s\n", __FUNCTION__);
131539 +
131540 client_template.adapter = adap;
131541 client_template.addr = addr;
131542
131543 @@ -605,6 +644,8 @@ exit_err:
131544
131545 static int lm4857_i2c_detach(struct i2c_client *client)
131546 {
131547 + dprintk("Entered %s\n", __FUNCTION__);
131548 +
131549 i2c_detach_client(client);
131550 kfree(client);
131551 return 0;
131552 @@ -612,9 +653,46 @@ static int lm4857_i2c_detach(struct i2c_
131553
131554 static int lm4857_i2c_attach(struct i2c_adapter *adap)
131555 {
131556 + dprintk("Entered %s\n", __FUNCTION__);
131557 +
131558 return i2c_probe(adap, &addr_data, lm4857_amp_probe);
131559 }
131560
131561 +static u8 lm4857_state;
131562 +
131563 +static int lm4857_suspend(struct i2c_client *dev, pm_message_t state)
131564 +{
131565 + dprintk("Entered %s\n", __FUNCTION__);
131566 +
131567 + dev_dbg(&dev->dev, "lm4857_suspend\n");
131568 + lm4857_state = lm4857_regs[LM4857_CTRL] & 0xf;
131569 + if (lm4857_state) {
131570 + lm4857_regs[LM4857_CTRL] &= 0xf0;
131571 + lm4857_write_regs();
131572 + }
131573 + return 0;
131574 +}
131575 +
131576 +static int lm4857_resume(struct i2c_client *dev)
131577 +{
131578 + dprintk("Entered %s\n", __FUNCTION__);
131579 +
131580 + if (lm4857_state) {
131581 + lm4857_regs[LM4857_CTRL] |= (lm4857_state & 0x0f);
131582 + lm4857_write_regs();
131583 + }
131584 + return 0;
131585 +}
131586 +
131587 +static void lm4857_shutdown(struct i2c_client *dev)
131588 +{
131589 + dprintk("Entered %s\n", __FUNCTION__);
131590 +
131591 + dev_dbg(&dev->dev, "lm4857_shutdown\n");
131592 + lm4857_regs[LM4857_CTRL] &= 0xf0;
131593 + lm4857_write_regs();
131594 +}
131595 +
131596 /* corgi i2c codec control layer */
131597 static struct i2c_driver lm4857_i2c_driver = {
131598 .driver = {
131599 @@ -622,6 +700,9 @@ static struct i2c_driver lm4857_i2c_driv
131600 .owner = THIS_MODULE,
131601 },
131602 .id = I2C_DRIVERID_LM4857,
131603 + .suspend = lm4857_suspend,
131604 + .resume = lm4857_resume,
131605 + .shutdown = lm4857_shutdown,
131606 .attach_adapter = lm4857_i2c_attach,
131607 .detach_client = lm4857_i2c_detach,
131608 .command = NULL,
131609 @@ -638,6 +719,14 @@ static int __init neo1973_init(void)
131610 {
131611 int ret;
131612
131613 + dprintk("Entered %s\n", __FUNCTION__);
131614 +
131615 + if (!machine_is_neo1973_gta01()) {
131616 + printk(KERN_INFO
131617 + "Only GTA01 hardware supported by ASoc driver\n");
131618 + return -ENODEV;
131619 + }
131620 +
131621 neo1973_snd_device = platform_device_alloc("soc-audio", -1);
131622 if (!neo1973_snd_device)
131623 return -ENOMEM;
131624 @@ -658,6 +747,9 @@ static int __init neo1973_init(void)
131625
131626 static void __exit neo1973_exit(void)
131627 {
131628 + dprintk("Entered %s\n", __FUNCTION__);
131629 +
131630 + i2c_del_driver(&lm4857_i2c_driver);
131631 platform_device_unregister(neo1973_snd_device);
131632 }
131633
131634 @@ -666,5 +758,5 @@ module_exit(neo1973_exit);
131635
131636 /* Module information */
131637 MODULE_AUTHOR("Graeme Gregory, graeme.gregory@wolfsonmicro.com, www.wolfsonmicro.com");
131638 -MODULE_DESCRIPTION("ALSA SoC WM8753 Neo1973");
131639 +MODULE_DESCRIPTION("ALSA SoC WM8753 Neo1973 GTA01");
131640 MODULE_LICENSE("GPL");
131641 Index: linux-2.6.24.7/sound/soc/s3c24xx/s3c24xx-i2s.c
131642 ===================================================================
131643 --- linux-2.6.24.7.orig/sound/soc/s3c24xx/s3c24xx-i2s.c 2008-12-11 22:46:07.000000000 +0100
131644 +++ linux-2.6.24.7/sound/soc/s3c24xx/s3c24xx-i2s.c 2008-12-11 22:46:49.000000000 +0100
131645 @@ -33,19 +33,20 @@
131646
131647 #include <asm/hardware.h>
131648 #include <asm/io.h>
131649 -#include <asm/arch/regs-iis.h>
131650 #include <asm/arch/regs-gpio.h>
131651 #include <asm/arch/regs-clock.h>
131652 #include <asm/arch/audio.h>
131653 #include <asm/dma.h>
131654 #include <asm/arch/dma.h>
131655
131656 +#include <asm/plat-s3c24xx/regs-iis.h>
131657 +
131658 #include "s3c24xx-pcm.h"
131659 #include "s3c24xx-i2s.h"
131660
131661 #define S3C24XX_I2S_DEBUG 0
131662 #if S3C24XX_I2S_DEBUG
131663 -#define DBG(x...) printk(KERN_DEBUG x)
131664 +#define DBG(x...) printk(KERN_DEBUG "s3c24xx-i2s: " x)
131665 #else
131666 #define DBG(x...)
131667 #endif
131668 @@ -75,6 +76,10 @@ static struct s3c24xx_pcm_dma_params s3c
131669 struct s3c24xx_i2s_info {
131670 void __iomem *regs;
131671 struct clk *iis_clk;
131672 + u32 iiscon;
131673 + u32 iismod;
131674 + u32 iisfcon;
131675 + u32 iispsr;
131676 };
131677 static struct s3c24xx_i2s_info s3c24xx_i2s;
131678
131679 @@ -175,7 +180,7 @@ static void s3c24xx_snd_rxctrl(int on)
131680 static int s3c24xx_snd_lrsync(void)
131681 {
131682 u32 iiscon;
131683 - unsigned long timeout = jiffies + msecs_to_jiffies(5);
131684 + int timeout = 5; /* 500us, 125 should be enough at 8kHz */
131685
131686 DBG("Entered %s\n", __FUNCTION__);
131687
131688 @@ -184,8 +189,9 @@ static int s3c24xx_snd_lrsync(void)
131689 if (iiscon & S3C2410_IISCON_LRINDEX)
131690 break;
131691
131692 - if (timeout < jiffies)
131693 + if (!--timeout)
131694 return -ETIMEDOUT;
131695 + udelay(100);
131696 }
131697
131698 return 0;
131699 @@ -279,11 +285,14 @@ static int s3c24xx_i2s_trigger(struct sn
131700 case SNDRV_PCM_TRIGGER_START:
131701 case SNDRV_PCM_TRIGGER_RESUME:
131702 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
131703 - if (!s3c24xx_snd_is_clkmaster()) {
131704 - ret = s3c24xx_snd_lrsync();
131705 - if (ret)
131706 - goto exit_err;
131707 - }
131708 + if (!s3c24xx_snd_is_clkmaster())
131709 + /* we ignore the return code, if it sync'd then fine,
131710 + * if it didn't sync, which happens after resume the
131711 + * first time when there was a live stream at suspend,
131712 + * just let it timeout, the stream picks up OK after
131713 + * that and LRCK is evidently working again.
131714 + */
131715 + s3c24xx_snd_lrsync();
131716
131717 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
131718 s3c24xx_snd_rxctrl(1);
131719 @@ -405,6 +414,40 @@ static int s3c24xx_i2s_probe(struct plat
131720 return 0;
131721 }
131722
131723 +#ifdef CONFIG_PM
131724 +int s3c24xx_i2s_suspend(struct platform_device *pdev,
131725 + struct snd_soc_cpu_dai *cpu_dai)
131726 +{
131727 + DBG("Entered %s\n", __FUNCTION__);
131728 + s3c24xx_i2s.iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
131729 + s3c24xx_i2s.iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
131730 + s3c24xx_i2s.iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON);
131731 + s3c24xx_i2s.iispsr = readl(s3c24xx_i2s.regs + S3C2410_IISPSR);
131732 +
131733 + clk_disable(s3c24xx_i2s.iis_clk);
131734 +
131735 + return 0;
131736 +}
131737 +
131738 +int s3c24xx_i2s_resume(struct platform_device *pdev,
131739 + struct snd_soc_cpu_dai *cpu_dai)
131740 +{
131741 + DBG("Entered %s\n", __FUNCTION__);
131742 + clk_enable(s3c24xx_i2s.iis_clk);
131743 +
131744 + writel(s3c24xx_i2s.iiscon, s3c24xx_i2s.regs + S3C2410_IISCON);
131745 + writel(s3c24xx_i2s.iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
131746 + writel(s3c24xx_i2s.iisfcon, s3c24xx_i2s.regs + S3C2410_IISFCON);
131747 + writel(s3c24xx_i2s.iispsr, s3c24xx_i2s.regs + S3C2410_IISPSR);
131748 +
131749 + return 0;
131750 +}
131751 +#else
131752 +#define s3c24xx_i2s_suspend NULL
131753 +#define s3c24xx_i2s_resume NULL
131754 +#endif
131755 +
131756 +
131757 #define S3C24XX_I2S_RATES \
131758 (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
131759 SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
131760 @@ -415,6 +458,8 @@ struct snd_soc_cpu_dai s3c24xx_i2s_dai =
131761 .id = 0,
131762 .type = SND_SOC_DAI_I2S,
131763 .probe = s3c24xx_i2s_probe,
131764 + .suspend = s3c24xx_i2s_suspend,
131765 + .resume = s3c24xx_i2s_resume,
131766 .playback = {
131767 .channels_min = 2,
131768 .channels_max = 2,
131769 Index: linux-2.6.24.7/sound/soc/s3c24xx/s3c24xx-pcm.c
131770 ===================================================================
131771 --- linux-2.6.24.7.orig/sound/soc/s3c24xx/s3c24xx-pcm.c 2008-12-11 22:46:07.000000000 +0100
131772 +++ linux-2.6.24.7/sound/soc/s3c24xx/s3c24xx-pcm.c 2008-12-11 22:46:49.000000000 +0100
131773 @@ -40,7 +40,7 @@
131774
131775 #define S3C24XX_PCM_DEBUG 0
131776 #if S3C24XX_PCM_DEBUG
131777 -#define DBG(x...) printk(KERN_DEBUG x)
131778 +#define DBG(x...) printk(KERN_DEBUG "s3c24xx-pcm: " x)
131779 #else
131780 #define DBG(x...)
131781 #endif
131782 @@ -49,7 +49,9 @@ static const struct snd_pcm_hardware s3c
131783 .info = SNDRV_PCM_INFO_INTERLEAVED |
131784 SNDRV_PCM_INFO_BLOCK_TRANSFER |
131785 SNDRV_PCM_INFO_MMAP |
131786 - SNDRV_PCM_INFO_MMAP_VALID,
131787 + SNDRV_PCM_INFO_MMAP_VALID |
131788 + SNDRV_PCM_INFO_PAUSE |
131789 + SNDRV_PCM_INFO_RESUME,
131790 .formats = SNDRV_PCM_FMTBIT_S16_LE |
131791 SNDRV_PCM_FMTBIT_U16_LE |
131792 SNDRV_PCM_FMTBIT_U8 |
131793 @@ -176,28 +178,6 @@ static int s3c24xx_pcm_hw_params(struct
131794 }
131795 }
131796
131797 - /* channel needs configuring for mem=>device, increment memory addr,
131798 - * sync to pclk, half-word transfers to the IIS-FIFO. */
131799 - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
131800 - s3c2410_dma_devconfig(prtd->params->channel,
131801 - S3C2410_DMASRC_MEM, S3C2410_DISRCC_INC |
131802 - S3C2410_DISRCC_APB, prtd->params->dma_addr);
131803 -
131804 - s3c2410_dma_config(prtd->params->channel,
131805 - prtd->params->dma_size,
131806 - S3C2410_DCON_SYNC_PCLK |
131807 - S3C2410_DCON_HANDSHAKE);
131808 - } else {
131809 - s3c2410_dma_config(prtd->params->channel,
131810 - prtd->params->dma_size,
131811 - S3C2410_DCON_HANDSHAKE |
131812 - S3C2410_DCON_SYNC_PCLK);
131813 -
131814 - s3c2410_dma_devconfig(prtd->params->channel,
131815 - S3C2410_DMASRC_HW, 0x3,
131816 - prtd->params->dma_addr);
131817 - }
131818 -
131819 s3c2410_dma_set_buffdone_fn(prtd->params->channel,
131820 s3c24xx_audio_buffdone);
131821
131822 @@ -246,6 +226,28 @@ static int s3c24xx_pcm_prepare(struct sn
131823 if (!prtd->params)
131824 return 0;
131825
131826 + /* channel needs configuring for mem=>device, increment memory addr,
131827 + * sync to pclk, half-word transfers to the IIS-FIFO. */
131828 + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
131829 + s3c2410_dma_devconfig(prtd->params->channel,
131830 + S3C2410_DMASRC_MEM, S3C2410_DISRCC_INC |
131831 + S3C2410_DISRCC_APB, prtd->params->dma_addr);
131832 +
131833 + s3c2410_dma_config(prtd->params->channel,
131834 + prtd->params->dma_size,
131835 + S3C2410_DCON_SYNC_PCLK |
131836 + S3C2410_DCON_HANDSHAKE);
131837 + } else {
131838 + s3c2410_dma_config(prtd->params->channel,
131839 + prtd->params->dma_size,
131840 + S3C2410_DCON_HANDSHAKE |
131841 + S3C2410_DCON_SYNC_PCLK);
131842 +
131843 + s3c2410_dma_devconfig(prtd->params->channel,
131844 + S3C2410_DMASRC_HW, 0x3,
131845 + prtd->params->dma_addr);
131846 + }
131847 +
131848 /* flush the DMA channel */
131849 s3c2410_dma_ctrl(prtd->params->channel, S3C2410_DMAOP_FLUSH);
131850 prtd->dma_loaded = 0;
131851 Index: linux-2.6.24.7/sound/soc/soc-core.c
131852 ===================================================================
131853 --- linux-2.6.24.7.orig/sound/soc/soc-core.c 2008-12-11 22:46:07.000000000 +0100
131854 +++ linux-2.6.24.7/sound/soc/soc-core.c 2008-12-11 22:46:49.000000000 +0100
131855 @@ -632,6 +632,16 @@ static int soc_suspend(struct platform_d
131856 struct snd_soc_codec *codec = socdev->codec;
131857 int i;
131858
131859 + /* Due to the resume being scheduled into a workqueue we could
131860 + * suspend before that's finished - wait for it to complete.
131861 + */
131862 + snd_power_lock(codec->card);
131863 + snd_power_wait(codec->card, SNDRV_CTL_POWER_D0);
131864 + snd_power_unlock(codec->card);
131865 +
131866 + /* we're going to block userspace touching us until resume completes */
131867 + snd_power_change_state(codec->card, SNDRV_CTL_POWER_D3hot);
131868 +
131869 /* mute any active DAC's */
131870 for(i = 0; i < machine->num_links; i++) {
131871 struct snd_soc_codec_dai *dai = machine->dai_link[i].codec_dai;
131872 @@ -639,6 +649,10 @@ static int soc_suspend(struct platform_d
131873 dai->dai_ops.digital_mute(dai, 1);
131874 }
131875
131876 + /* suspend all pcm's */
131877 + for(i = 0; i < machine->num_links; i++)
131878 + snd_pcm_suspend_all(machine->dai_link[i].pcm);
131879 +
131880 if (machine->suspend_pre)
131881 machine->suspend_pre(pdev, state);
131882
131883 @@ -680,16 +694,27 @@ static int soc_suspend(struct platform_d
131884 return 0;
131885 }
131886
131887 -/* powers up audio subsystem after a suspend */
131888 -static int soc_resume(struct platform_device *pdev)
131889 +/* deferred resume work, so resume can complete before we finished
131890 + * setting our codec back up, which can be very slow on I2C
131891 + */
131892 +static void soc_resume_deferred(struct work_struct *work)
131893 {
131894 - struct snd_soc_device *socdev = platform_get_drvdata(pdev);
131895 - struct snd_soc_machine *machine = socdev->machine;
131896 - struct snd_soc_platform *platform = socdev->platform;
131897 - struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
131898 + struct snd_soc_device *socdev = container_of(work,
131899 + struct snd_soc_device,
131900 + deferred_resume_work);
131901 + struct snd_soc_machine *machine = socdev->machine;
131902 + struct snd_soc_platform *platform = socdev->platform;
131903 + struct snd_soc_codec_device *codec_dev = socdev->codec_dev;
131904 struct snd_soc_codec *codec = socdev->codec;
131905 + struct platform_device *pdev = to_platform_device(socdev->dev);
131906 int i;
131907
131908 + /* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
131909 + * so userspace apps are blocked from touching us
131910 + */
131911 +
131912 + dev_info(socdev->dev, "starting resume work\n");
131913 +
131914 if (machine->resume_pre)
131915 machine->resume_pre(pdev);
131916
131917 @@ -731,6 +756,22 @@ static int soc_resume(struct platform_de
131918 if (machine->resume_post)
131919 machine->resume_post(pdev);
131920
131921 + dev_info(socdev->dev, "resume work completed\n");
131922 +
131923 + /* userspace can access us now we are back as we were before */
131924 + snd_power_change_state(codec->card, SNDRV_CTL_POWER_D0);
131925 +}
131926 +
131927 +/* powers up audio subsystem after a suspend */
131928 +static int soc_resume(struct platform_device *pdev)
131929 +{
131930 + struct snd_soc_device *socdev = platform_get_drvdata(pdev);
131931 +
131932 + dev_info(socdev->dev, "scheduling resume work\n");
131933 +
131934 + if (!schedule_work(&socdev->deferred_resume_work))
131935 + dev_err(socdev->dev, "work item may be lost\n");
131936 +
131937 return 0;
131938 }
131939
131940 @@ -777,6 +818,9 @@ static int soc_probe(struct platform_dev
131941
131942 /* DAPM stream work */
131943 INIT_DELAYED_WORK(&socdev->delayed_work, close_delayed_work);
131944 + /* deferred resume work */
131945 + INIT_WORK(&socdev->deferred_resume_work, soc_resume_deferred);
131946 +
131947 return 0;
131948
131949 platform_err:
131950 @@ -873,6 +917,7 @@ static int soc_new_pcm(struct snd_soc_de
131951 return ret;
131952 }
131953
131954 + dai_link->pcm = pcm;
131955 pcm->private_data = rtd;
131956 soc_pcm_ops.mmap = socdev->platform->pcm_ops->mmap;
131957 soc_pcm_ops.pointer = socdev->platform->pcm_ops->pointer;
131958 @@ -923,6 +968,38 @@ static ssize_t codec_reg_show(struct dev
131959 }
131960 static DEVICE_ATTR(codec_reg, 0444, codec_reg_show, NULL);
131961
131962 +
131963 +static ssize_t codec_reg_write(struct device *dev,
131964 + struct device_attribute *attr,
131965 + const char *buf, size_t count)
131966 +{
131967 + u32 address;
131968 + u32 data;
131969 + char * end;
131970 + size_t left = count;
131971 + struct snd_soc_device *devdata = dev_get_drvdata(dev);
131972 + struct snd_soc_codec *codec = devdata->codec;
131973 +
131974 + address = simple_strtoul(buf, &end, 16);
131975 + left -= (int)(end - buf);
131976 + while ((*end == ' ') && (left)) {
131977 + end++;
131978 + left--;
131979 + }
131980 + if (!left)
131981 + return count;
131982 + data = simple_strtoul(end, &end, 16);
131983 +
131984 + printk(KERN_INFO"user writes Codec reg 0x%02X with Data 0x%04X\n",
131985 + address, data);
131986 +
131987 + codec->write(codec, address, data);
131988 +
131989 + return count;
131990 +}
131991 +
131992 +static DEVICE_ATTR(codec_reg_write, 0644, NULL, codec_reg_write);
131993 +
131994 /**
131995 * snd_soc_new_ac97_codec - initailise AC97 device
131996 * @codec: audio codec
131997 @@ -1134,6 +1211,9 @@ int snd_soc_register_card(struct snd_soc
131998 err = device_create_file(socdev->dev, &dev_attr_codec_reg);
131999 if (err < 0)
132000 printk(KERN_WARNING "asoc: failed to add codec sysfs entries\n");
132001 + err = device_create_file(socdev->dev, &dev_attr_codec_reg_write);
132002 + if (err < 0)
132003 + printk(KERN_WARNING "asoc: failed to add codec sysfs entries\n");
132004 out:
132005 mutex_unlock(&codec->mutex);
132006 return ret;
132007 Index: linux-2.6.24.7/sound/soc/soc-dapm.c
132008 ===================================================================
132009 --- linux-2.6.24.7.orig/sound/soc/soc-dapm.c 2008-12-11 22:46:07.000000000 +0100
132010 +++ linux-2.6.24.7/sound/soc/soc-dapm.c 2008-12-11 22:46:49.000000000 +0100
132011 @@ -1305,6 +1305,30 @@ int snd_soc_dapm_set_endpoint(struct snd
132012 EXPORT_SYMBOL_GPL(snd_soc_dapm_set_endpoint);
132013
132014 /**
132015 + * snd_soc_dapm_get_endpoint - get audio endpoint status
132016 + * @codec: audio codec
132017 + * @endpoint: audio signal endpoint (or start point)
132018 + *
132019 + * Get audio endpoint status - connected or disconnected.
132020 + *
132021 + * Returns status
132022 + */
132023 +int snd_soc_dapm_get_endpoint(struct snd_soc_codec *codec,
132024 + char *endpoint)
132025 +{
132026 + struct snd_soc_dapm_widget *w;
132027 +
132028 + list_for_each_entry(w, &codec->dapm_widgets, list) {
132029 + if (!strcmp(w->name, endpoint)) {
132030 + return w->connected;
132031 + }
132032 + }
132033 +
132034 + return 0;
132035 +}
132036 +EXPORT_SYMBOL_GPL(snd_soc_dapm_get_endpoint);
132037 +
132038 +/**
132039 * snd_soc_dapm_free - free dapm resources
132040 * @socdev: SoC device
132041 *
132042 Index: linux-2.6.24.7/synthesize-gta-module-configs.mak
132043 ===================================================================
132044 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
132045 +++ linux-2.6.24.7/synthesize-gta-module-configs.mak 2008-12-11 22:46:49.000000000 +0100
132046 @@ -0,0 +1,9 @@
132047 +all: defconfig-gta01 defconfig-gta02
132048 +
132049 +defconfig-gta01: \
132050 + defconfig-2.6.24-maxmodules
132051 + cp $< $@
132052 +
132053 +defconfig-gta02: \
132054 + defconfig-2.6.24-maxmodules
132055 + sed '/UART.*=0$$/s/=0/=2/' <$< >$@ || { rm -f $@; exit 1; }